зеркало из https://github.com/microsoft/git.git
log -L: check range set invariants when we look it up
lookup_line_range() is a good place to check that the range sets satisfy the invariants: they have been computed and set in earlier iterations, and we now start working with them. Signed-off-by: Thomas Rast <trast@inf.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
39410bf0bf
Коммит
4596f190d3
26
line-log.c
26
line-log.c
|
@ -79,6 +79,25 @@ static int range_cmp(const void *_r, const void *_s)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the ranges are non-empty, sorted and non-overlapping
|
||||
*/
|
||||
static void range_set_check_invariants(struct range_set *rs)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!rs)
|
||||
return;
|
||||
|
||||
if (rs->nr)
|
||||
assert(rs->ranges[0].start < rs->ranges[0].end);
|
||||
|
||||
for (i = 1; i < rs->nr; i++) {
|
||||
assert(rs->ranges[i-1].end < rs->ranges[i].start);
|
||||
assert(rs->ranges[i].start < rs->ranges[i].end);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper: In-place pass of sorting and merging the ranges in the
|
||||
* range set, to re-establish the invariants after another operation
|
||||
|
@ -103,6 +122,8 @@ static void sort_and_merge_range_set(struct range_set *rs)
|
|||
}
|
||||
assert(o <= rs->nr);
|
||||
rs->nr = o;
|
||||
|
||||
range_set_check_invariants(rs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -687,8 +708,13 @@ static struct line_log_data *lookup_line_range(struct rev_info *revs,
|
|||
struct commit *commit)
|
||||
{
|
||||
struct line_log_data *ret = NULL;
|
||||
struct line_log_data *d;
|
||||
|
||||
ret = lookup_decoration(&revs->line_log_data, &commit->object);
|
||||
|
||||
for (d = ret; d; d = d->next)
|
||||
range_set_check_invariants(&d->ranges);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче