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 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 48000/* maximum for break-merge to happen (80%)*/ 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; 29unsigned long size; 30int xfrm_flags;/* for use by the xfrm */ 31unsigned short mode;/* file mode */ 32unsigned sha1_valid :1;/* if true, use sha1 and trust mode; 33 * if false, use the name and read from 34 * the filesystem. 35 */ 36#define DIFF_FILE_VALID(spec) ((spec) && ((spec)->mode) != 0) 37unsigned should_free :1;/* data should be free()'ed */ 38unsigned should_munmap :1;/* data should be munmap()'ed */ 39}; 40 41externstruct diff_filespec *alloc_filespec(const char*); 42externvoidfill_filespec(struct diff_filespec *,const unsigned char*, 43unsigned short); 44 45externintdiff_populate_filespec(struct diff_filespec *,int); 46externvoiddiff_free_filespec_data(struct diff_filespec *); 47 48struct diff_filepair { 49struct diff_filespec *one; 50struct diff_filespec *two; 51unsigned short int score; 52char status;/* M C R N D U (see Documentation/diff-format.txt) */ 53unsigned source_stays :1;/* all of R/C are copies */ 54unsigned broken_pair :1; 55}; 56#define DIFF_PAIR_UNMERGED(p) \ 57 (!DIFF_FILE_VALID((p)->one) && !DIFF_FILE_VALID((p)->two)) 58 59#define DIFF_PAIR_RENAME(p) (strcmp((p)->one->path, (p)->two->path)) 60 61#define DIFF_PAIR_BROKEN(p) \ 62 ( (!DIFF_FILE_VALID((p)->one) != !DIFF_FILE_VALID((p)->two)) && \ 63 ((p)->broken_pair != 0) ) 64 65#define DIFF_PAIR_TYPE_CHANGED(p) \ 66 ((S_IFMT & (p)->one->mode) != (S_IFMT & (p)->two->mode)) 67 68#define DIFF_PAIR_MODE_CHANGED(p) ((p)->one->mode != (p)->two->mode) 69 70externvoiddiff_free_filepair(struct diff_filepair *); 71 72externintdiff_unmodified_pair(struct diff_filepair *); 73 74struct diff_queue_struct { 75struct diff_filepair **queue; 76int alloc; 77int nr; 78}; 79 80externstruct diff_queue_struct diff_queued_diff; 81externstruct diff_filepair *diff_queue(struct diff_queue_struct *, 82struct diff_filespec *, 83struct diff_filespec *); 84externvoiddiff_q(struct diff_queue_struct *,struct diff_filepair *); 85 86externvoiddiffcore_pathspec(const char**pathspec); 87externvoiddiffcore_break(int); 88externvoiddiffcore_rename(int rename_copy,int); 89externvoiddiffcore_merge_broken(void); 90externvoiddiffcore_pickaxe(const char*needle,int opts); 91externvoiddiffcore_order(const char*orderfile); 92 93#define DIFF_DEBUG 0 94#if DIFF_DEBUG 95voiddiff_debug_filespec(struct diff_filespec *,int,const char*); 96voiddiff_debug_filepair(const struct diff_filepair *,int); 97voiddiff_debug_queue(const char*,struct diff_queue_struct *); 98#else 99#define diff_debug_filespec(a,b,c) do {} while(0) 100#define diff_debug_filepair(a,b) do {} while(0) 101#define diff_debug_queue(a,b) do {} while(0) 102#endif 103 104#endif