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; 56}; 57#define DIFF_PAIR_UNMERGED(p) \ 58 (!DIFF_FILE_VALID((p)->one) && !DIFF_FILE_VALID((p)->two)) 59 60#define DIFF_PAIR_RENAME(p) (strcmp((p)->one->path, (p)->two->path)) 61 62#define DIFF_PAIR_BROKEN(p) \ 63 ( (!DIFF_FILE_VALID((p)->one) != !DIFF_FILE_VALID((p)->two)) && \ 64 ((p)->broken_pair != 0) ) 65 66#define DIFF_PAIR_TYPE_CHANGED(p) \ 67 ((S_IFMT & (p)->one->mode) != (S_IFMT & (p)->two->mode)) 68 69#define DIFF_PAIR_MODE_CHANGED(p) ((p)->one->mode != (p)->two->mode) 70 71externvoiddiff_free_filepair(struct diff_filepair *); 72 73externintdiff_unmodified_pair(struct diff_filepair *); 74 75struct diff_queue_struct { 76struct diff_filepair **queue; 77int alloc; 78int nr; 79}; 80 81externstruct diff_queue_struct diff_queued_diff; 82externstruct diff_filepair *diff_queue(struct diff_queue_struct *, 83struct diff_filespec *, 84struct diff_filespec *); 85externvoiddiff_q(struct diff_queue_struct *,struct diff_filepair *); 86 87externvoiddiffcore_pathspec(const char**pathspec); 88externvoiddiffcore_break(int); 89externvoiddiffcore_rename(struct diff_options *); 90externvoiddiffcore_merge_broken(void); 91externvoiddiffcore_pickaxe(const char*needle,int opts); 92externvoiddiffcore_order(const char*orderfile); 93 94#define DIFF_DEBUG 0 95#if DIFF_DEBUG 96voiddiff_debug_filespec(struct diff_filespec *,int,const char*); 97voiddiff_debug_filepair(const struct diff_filepair *,int); 98voiddiff_debug_queue(const char*,struct diff_queue_struct *); 99#else 100#define diff_debug_filespec(a,b,c) do {} while(0) 101#define diff_debug_filepair(a,b) do {} while(0) 102#define diff_debug_queue(a,b) do {} while(0) 103#endif 104 105externintdiffcore_count_changes(void*src,unsigned long src_size, 106void*dst,unsigned long dst_size, 107void**src_count_p, 108void**dst_count_p, 109unsigned long delta_limit, 110unsigned long*src_copied, 111unsigned long*literal_added); 112 113#endif