diff options
author | Eric Sunshine <sunshine@sunshineco.com> | 2013-08-06 09:59:42 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-08-06 14:44:25 -0700 |
commit | 52f4d1264854485bfd50afeeed1933a3f9e05c96 (patch) | |
tree | 1ed9e978bd06fc744a0b97f324cf27e191121535 | |
parent | 815834e9aa6148b7815b9aea7db5d44640a4383a (diff) | |
download | git-52f4d1264854485bfd50afeeed1933a3f9e05c96.tar.gz |
blame: teach -L/RE/ to search from end of previous -L range
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/blame.c | 5 | ||||
-rw-r--r-- | t/annotate-tests.sh | 20 |
2 files changed, 24 insertions, 1 deletions
diff --git a/builtin/blame.c b/builtin/blame.c index 7b084d8445..1bf8056f6b 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -2280,6 +2280,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) int cmd_is_annotate = !strcmp(argv[0], "annotate"); struct range_set ranges; unsigned int range_i; + long anchor; git_config(git_blame_config, NULL); init_revisions(&revs, NULL); @@ -2475,11 +2476,12 @@ parse_done: if (lno && !range_list.nr) string_list_append(&range_list, xstrdup("1")); + anchor = 1; range_set_init(&ranges, range_list.nr); for (range_i = 0; range_i < range_list.nr; ++range_i) { long bottom, top; if (parse_range_arg(range_list.items[range_i].string, - nth_line_cb, &sb, lno, 1, + nth_line_cb, &sb, lno, anchor, &bottom, &top, sb.path)) usage(blame_usage); if (lno < top || ((lno || bottom) && lno < bottom)) @@ -2490,6 +2492,7 @@ parse_done: top = lno; bottom--; range_set_append_unsafe(&ranges, bottom, top); + anchor = top + 1; } sort_and_merge_range_set(&ranges); diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh index 77083d9dde..b963d36325 100644 --- a/t/annotate-tests.sh +++ b/t/annotate-tests.sh @@ -303,6 +303,26 @@ test_expect_success 'blame -L multiple (superset/subset: unordered)' ' check_count -L3,5 -L2,8 A 1 B 1 B1 1 B2 1 C 1 D 1 "A U Thor" 1 ' +test_expect_success 'blame -L /RE/ (relative)' ' + check_count -L3,3 -L/fox/ B1 1 B2 1 C 1 D 1 "A U Thor" 1 +' + +test_expect_success 'blame -L /RE/ (relative: no preceding range)' ' + check_count -L/dog/ A 1 B 1 B1 1 B2 1 C 1 D 1 "A U Thor" 1 +' + +test_expect_success 'blame -L /RE/ (relative: adjacent)' ' + check_count -L1,1 -L/dog/,+1 A 1 E 1 +' + +test_expect_success 'blame -L /RE/ (relative: not found)' ' + test_must_fail $PROG -L4,4 -L/dog/ file +' + +test_expect_success 'blame -L /RE/ (relative: end-of-file)' ' + test_must_fail $PROG -L, -L/$/ file +' + test_expect_success 'setup -L :regex' ' tr Q "\\t" >hello.c <<-\EOF && int main(int argc, const char *argv[]) |