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 */ 40}; 41 42externstruct diff_filespec *alloc_filespec(const char*); 43externvoidfill_filespec(struct diff_filespec *,const unsigned char*, 44unsigned short); 45 46externintdiff_populate_filespec(struct diff_filespec *,int); 47externvoiddiff_free_filespec_data(struct diff_filespec *); 48 49struct diff_filepair { 50struct diff_filespec *one; 51struct diff_filespec *two; 52unsigned short int score; 53char status;/* M C R N D U (see Documentation/diff-format.txt) */ 54unsigned source_stays :1;/* all of R/C are copies */ 55unsigned broken_pair :1; 56unsigned renamed_pair :1; 57}; 58#define DIFF_PAIR_UNMERGED(p) \ 59 (!DIFF_FILE_VALID((p)->one) && !DIFF_FILE_VALID((p)->two)) 60 61#define DIFF_PAIR_RENAME(p) ((p)->renamed_pair) 62 63#define DIFF_PAIR_BROKEN(p) \ 64 ( (!DIFF_FILE_VALID((p)->one) != !DIFF_FILE_VALID((p)->two)) && \ 65 ((p)->broken_pair != 0) ) 66 67#define DIFF_PAIR_TYPE_CHANGED(p) \ 68 ((S_IFMT & (p)->one->mode) != (S_IFMT & (p)->two->mode)) 69 70#define DIFF_PAIR_MODE_CHANGED(p) ((p)->one->mode != (p)->two->mode) 71 72externvoiddiff_free_filepair(struct diff_filepair *); 73 74externintdiff_unmodified_pair(struct diff_filepair *); 75 76struct diff_queue_struct { 77struct diff_filepair **queue; 78int alloc; 79int nr; 80}; 81 82externstruct diff_queue_struct diff_queued_diff; 83externstruct diff_filepair *diff_queue(struct diff_queue_struct *, 84struct diff_filespec *, 85struct diff_filespec *); 86externvoiddiff_q(struct diff_queue_struct *,struct diff_filepair *); 87 88externvoiddiffcore_pathspec(const char**pathspec); 89externvoiddiffcore_break(int); 90externvoiddiffcore_rename(struct diff_options *); 91externvoiddiffcore_merge_broken(void); 92externvoiddiffcore_pickaxe(const char*needle,int opts); 93externvoiddiffcore_order(const char*orderfile); 94 95#define DIFF_DEBUG 0 96#if DIFF_DEBUG 97voiddiff_debug_filespec(struct diff_filespec *,int,const char*); 98voiddiff_debug_filepair(const struct diff_filepair *,int); 99voiddiff_debug_queue(const char*,struct diff_queue_struct *); 100#else 101#define diff_debug_filespec(a,b,c) do {} while(0) 102#define diff_debug_filepair(a,b) do {} while(0) 103#define diff_debug_queue(a,b) do {} while(0) 104#endif 105 106externintdiffcore_count_changes(void*src,unsigned long src_size, 107void*dst,unsigned long dst_size, 108void**src_count_p, 109void**dst_count_p, 110unsigned long delta_limit, 111unsigned long*src_copied, 112unsigned long*literal_added); 113 114#endif