Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 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 { |
Ramsay Jones | 071bcaa | 2017-09-21 17:49:38 +0100 | [diff] [blame] | 17 | unsigned int alloc, nr; |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 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 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 28 | void range_set_init(struct range_set *, size_t prealloc); |
| 29 | void range_set_release(struct range_set *); |
Eric Sunshine | c0babbe | 2013-08-06 09:59:36 -0400 | [diff] [blame] | 30 | /* Range includes start; excludes end */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 31 | void range_set_append_unsafe(struct range_set *, long start, long end); |
Eric Sunshine | c0babbe | 2013-08-06 09:59:36 -0400 | [diff] [blame] | 32 | /* New range must begin at or after end of last added range */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 33 | void range_set_append(struct range_set *, long start, long end); |
Eric Sunshine | c0babbe | 2013-08-06 09:59:36 -0400 | [diff] [blame] | 34 | /* |
| 35 | * In-place pass of sorting and merging the ranges in the range set, |
| 36 | * to sort and make the ranges disjoint. |
| 37 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 38 | void sort_and_merge_range_set(struct range_set *); |
Eric Sunshine | c0babbe | 2013-08-06 09:59:36 -0400 | [diff] [blame] | 39 | |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 40 | /* Linked list of interesting files and their associated ranges. The |
Thomas Rast | 31c6191 | 2013-04-12 18:05:11 +0200 | [diff] [blame] | 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 | */ |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 46 | struct line_log_data { |
| 47 | struct line_log_data *next; |
Thomas Rast | 31c6191 | 2013-04-12 18:05:11 +0200 | [diff] [blame] | 48 | char *path; |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 49 | struct range_set ranges; |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 50 | struct diff_filepair *pair; |
| 51 | struct diff_ranges diff; |
| 52 | }; |
| 53 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 54 | void line_log_init(struct rev_info *rev, const char *prefix, struct string_list *args); |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 55 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 56 | int line_log_filter(struct rev_info *rev); |
SZEDER Gábor | 3cb9d2b | 2020-05-11 11:56:17 +0000 | [diff] [blame] | 57 | int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, |
| 58 | struct commit *commit); |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 59 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 60 | int line_log_print(struct rev_info *rev, struct commit *commit); |
Thomas Rast | 12da1d1 | 2013-03-28 17:47:32 +0100 | [diff] [blame] | 61 | |
| 62 | #endif /* LINE_LOG_H */ |