1/* 2 * Copyright (C) 2005 Junio C Hamano 3 */ 4#ifndef DIFFCORE_H 5#define DIFFCORE_H 6 7/* This header file is internal between diff.c and its diff transformers 8 * (e.g. diffcore-rename, diffcore-pickaxe). Never include this header 9 * in anything else. 10 */ 11 12/* We internally use unsigned short as the score value, 13 * and rely on an int capable to hold 32-bits. -B can take 14 * -Bmerge_score/break_score format and the two scores are 15 * passed around in one int (high 16-bit for merge and low 16-bit 16 * for break). 17 */ 18#define MAX_SCORE 60000.0 19#define DEFAULT_RENAME_SCORE 30000/* rename/copy similarity minimum (50%) */ 20#define DEFAULT_BREAK_SCORE 30000/* minimum for break to happen (50%) */ 21#define DEFAULT_MERGE_SCORE 36000/* maximum for break-merge to happen 60%) */ 22 23#define MINIMUM_BREAK_SIZE 400/* do not break a file smaller than this */ 24 25struct diff_filespec { 26unsigned char sha1[20]; 27char*path; 28void*data; 29void*cnt_data; 30unsigned long size; 31int xfrm_flags;/* for use by the xfrm */ 32unsigned short mode;/* file mode */ 33unsigned sha1_valid :1;/* if true, use sha1 and trust mode; 34 * if false, use the name and read from 35 * the filesystem. 36 */ 37#define DIFF_FILE_VALID(spec) (((spec)->mode) != 0) 38unsigned should_free :1;/* data should be free()'ed */ 39unsigned should_munmap :1;/* data should be munmap()'ed */ 40unsigned is_binary :1;/* data should be considered "binary" */ 41}; 42 43externstruct diff_filespec *alloc_filespec(const char*); 44externvoidfill_filespec(struct diff_filespec *,const unsigned char*, 45unsigned short); 46 47externintdiff_populate_filespec(struct diff_filespec *,int); 48externvoiddiff_free_filespec_data(struct diff_filespec *); 49 50struct diff_filepair { 51struct diff_filespec *one; 52struct diff_filespec *two; 53unsigned short int score; 54char status;/* M C R N D U (see Documentation/diff-format.txt) */ 55unsigned source_stays :1;/* all of R/C are copies */ 56unsigned broken_pair :1; 57unsigned renamed_pair :1; 58unsigned is_unmerged :1; 59}; 60#define DIFF_PAIR_UNMERGED(p) ((p)->is_unmerged) 61 62#define DIFF_PAIR_RENAME(p) ((p)->renamed_pair) 63 64#define DIFF_PAIR_BROKEN(p) \ 65 ( (!DIFF_FILE_VALID((p)->one) != !DIFF_FILE_VALID((p)->two)) && \ 66 ((p)->broken_pair != 0) ) 67 68#define DIFF_PAIR_TYPE_CHANGED(p) \ 69 ((S_IFMT & (p)->one->mode) != (S_IFMT & (p)->two->mode)) 70 71#define DIFF_PAIR_MODE_CHANGED(p) ((p)->one->mode != (p)->two->mode) 72 73externvoiddiff_free_filepair(struct diff_filepair *); 74 75externintdiff_unmodified_pair(struct diff_filepair *); 76 77struct diff_queue_struct { 78struct diff_filepair **queue; 79int alloc; 80int nr; 81}; 82 83externstruct diff_queue_struct diff_queued_diff; 84externstruct diff_filepair *diff_queue(struct diff_queue_struct *, 85struct diff_filespec *, 86struct diff_filespec *); 87externvoiddiff_q(struct diff_queue_struct *,struct diff_filepair *); 88 89externvoiddiffcore_pathspec(const char**pathspec); 90externvoiddiffcore_break(int); 91externvoiddiffcore_rename(struct diff_options *); 92externvoiddiffcore_merge_broken(void); 93externvoiddiffcore_pickaxe(const char*needle,int opts); 94externvoiddiffcore_order(const char*orderfile); 95 96#define DIFF_DEBUG 0 97#if DIFF_DEBUG 98voiddiff_debug_filespec(struct diff_filespec *,int,const char*); 99voiddiff_debug_filepair(const struct diff_filepair *,int); 100voiddiff_debug_queue(const char*,struct diff_queue_struct *); 101#else 102#define diff_debug_filespec(a,b,c) do {} while(0) 103#define diff_debug_filepair(a,b) do {} while(0) 104#define diff_debug_queue(a,b) do {} while(0) 105#endif 106 107externintdiffcore_count_changes(struct diff_filespec *src, 108struct diff_filespec *dst, 109void**src_count_p, 110void**dst_count_p, 111unsigned long delta_limit, 112unsigned long*src_copied, 113unsigned long*literal_added); 114 115#endif