If the -L option is used to specify a line range in git blame, and the end of the range is past the end of the file, at present git will fail with a fatal error. This commit prevents such behavior - instead the blame is displayed for existing lines within the specified range. Blaming a range that is entirely outside the bounds of the file will still fail. This commit also ammends the relevant test and adds clarification to the documentation. Signed-off-by: Isabella Stephens <istephens@xxxxxxxxxxxxx> --- Documentation/git-blame.txt | 10 ++++++++++ builtin/blame.c | 4 ++-- t/t8003-blame-corner-cases.sh | 7 +++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index fdc3aea30..8a28b4114 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -154,6 +154,16 @@ Also you can use a regular expression to specify the line range: which limits the annotation to the body of the `hello` subroutine. +A range that begins or ends outside the bounds of the file will +blame the relevant lines. For example: + + git blame -L 10,-20 foo + git blame -L 10,+20 foo + +will respectively blame the first 10 and last 11 lines of a +20 line file. However, blaming a line range that is entirely +outside the bounds of the file will fail. + When you are not interested in changes older than version v2.6.18, or changes older than 3 weeks, you can use revision range specifiers similar to 'git rev-list': diff --git a/builtin/blame.c b/builtin/blame.c index 67adaef4d..b5b9db147 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -878,13 +878,13 @@ int cmd_blame(int argc, const char **argv, const char *prefix) nth_line_cb, &sb, lno, anchor, &bottom, &top, sb.path)) usage(blame_usage); - if (lno < top || ((lno || bottom) && lno < bottom)) + if ((lno || bottom) && lno < bottom) die(Q_("file %s has only %lu line", "file %s has only %lu lines", lno), path, lno); if (bottom < 1) bottom = 1; - if (top < 1) + if (top < 1 || lno < top) top = lno; bottom--; range_set_append_unsafe(&ranges, bottom, top); diff --git a/t/t8003-blame-corner-cases.sh b/t/t8003-blame-corner-cases.sh index 661f9d430..728209fa3 100755 --- a/t/t8003-blame-corner-cases.sh +++ b/t/t8003-blame-corner-cases.sh @@ -216,14 +216,13 @@ test_expect_success 'blame -L with invalid start' ' ' test_expect_success 'blame -L with invalid end' ' - test_must_fail git blame -L1,5 tres 2>errors && - test_i18ngrep "has only 2 lines" errors + git blame -L1,5 tres >out && + test_line_count = 2 out ' test_expect_success 'blame parses <end> part of -L' ' git blame -L1,1 tres >out && - cat out && - test $(wc -l < out) -eq 1 + test_line_count = 1 out ' test_expect_success 'indent of line numbers, nine lines' ' -- 2.14.1