1 #ifndef LINE_LOG_H 2 #define LINE_LOG_H 3 4 #include "diffcore.h" 5 6 struct rev_info; 7 struct commit; 8 9 /* A range [start,end]. Lines are numbered starting at 0, and the 10 * ranges include start but exclude end. */ 11 struct range { 12 long start, end; 13 }; 14 15 /* A set of ranges. The ranges must always be disjoint and sorted. */ 16 struct range_set { 17 unsigned int alloc, nr; 18 struct range *ranges; 19 }; 20 21 /* A diff, encoded as the set of pre- and post-image ranges where the 22 * files differ. A pair of ranges corresponds to a hunk. */ 23 struct diff_ranges { 24 struct range_set parent; 25 struct range_set target; 26 }; 27 28 void range_set_init(struct range_set *, size_t prealloc); 29 void range_set_release(struct range_set *); 30 /* Range includes start; excludes end */ 31 void range_set_append_unsafe(struct range_set *, long start, long end); 32 /* New range must begin at or after end of last added range */ 33 void range_set_append(struct range_set *, long start, long end); 34 /* 35 * In-place pass of sorting and merging the ranges in the range set, 36 * to sort and make the ranges disjoint. 37 */ 38 void sort_and_merge_range_set(struct range_set *); 39 40 /* Linked list of interesting files and their associated ranges. The 41 * list must be kept sorted by path. 42 * 43 * For simplicity, even though this is highly redundant, each 44 * line_log_data owns its 'path'. 45 */ 46 struct line_log_data { 47 struct line_log_data *next; 48 char *path; 49 struct range_set ranges; 50 struct diff_filepair *pair; 51 struct diff_ranges diff; 52 }; 53 54 void line_log_init(struct rev_info *rev, const char *prefix, struct string_list *args); 55 56 int line_log_filter(struct rev_info *rev); 57 int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, 58 struct commit *commit); 59 60 int line_log_print(struct rev_info *rev, struct commit *commit); 61 62 #endif /* LINE_LOG_H */ 63