git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v7 2/2] log: prevent error if line range ends past end of file

From
istephens@atlassian.com <istephens@atlassian.com>
Date
Jun 15, 2018, 06:29 UTC
Message-ID
<20180615062928.37165-2-istephens@atlassian.com>
In-Reply-To
<20180615062928.37165-1-istephens@atlassian.com>
From: Isabella Stephens <istephens@atlassian.com>

If the -L option is used to specify a line range in git log, and the end of the range is past the end of the file, git will fail with a fatal error. This commit prevents such behaviour - instead we perform the log for existing lines within the specified range.

This commit also fixes a corner case where -L ,-n:file would be treated as a log over the whole file. Now we treat this as -L 1,-n:file and blame the first line of the file instead.

Signed-off-by: Isabella Stephens <istephens@atlassian.com>
---
 line-log.c          | 4 ++--
 t/t4211-line-log.sh | 5 ++---
 2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/line-log.c b/line-log.c
index cdc2257db..8ad074e58 100644
--- a/line-log.c
+++ b/line-log.c
@@ -599,11 +599,11 @@ parse_lines(struct commit *commit, const char *prefix, struct string_list *args)
 				    lines, anchor, &begin, &end,
 				    full_name))
 			die("malformed -L argument '%s'", range_part);
-		if (lines < end || ((lines || begin) && lines < begin))
+		if ((!lines && (begin || end)) || lines < begin)
 			die("file %s has only %lu lines", name_part, lines);
 		if (begin < 1)
 			begin = 1;
-		if (end < 1)
+		if (end < 1 || lines < end)
 			end = lines;
 		begin--;
 		line_log_data_insert(&ranges, full_name, begin, end);
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh
index d0377fae5..436b13ad2 100755
--- a/t/t4211-line-log.sh
+++ b/t/t4211-line-log.sh
@@ -60,7 +60,6 @@ test_bad_opts "-L 1:nonexistent" "There is no path"
 test_bad_opts "-L 1:simple" "There is no path"
 test_bad_opts "-L '/foo:b.c'" "argument not .start,end:file"
 test_bad_opts "-L 1000:b.c" "has only.*lines"
-test_bad_opts "-L 1,1000:b.c" "has only.*lines"
 test_bad_opts "-L :b.c" "argument not .start,end:file"
 test_bad_opts "-L :foo:b.c" "no match"
 
@@ -86,12 +85,12 @@ test_expect_success '-L ,Y (Y == nlines)' '
 
 test_expect_success '-L ,Y (Y == nlines + 1)' '
 	n=$(expr $(wc -l <b.c) + 1) &&
-	test_must_fail git log -L ,$n:b.c
+	git log -L ,$n:b.c
 '
 
 test_expect_success '-L ,Y (Y == nlines + 2)' '
 	n=$(expr $(wc -l <b.c) + 2) &&
-	test_must_fail git log -L ,$n:b.c
+	git log -L ,$n:b.c
 '
 
 test_expect_success '-L with --first-parent and a merge' '
-- 
2.14.3 (Apple Git-98)
Previous: istephens@atlassian.comNext: Isabella Stephens
Message 6 of 8 in “blame: prevent error if range ends past end of file”
  1. 1/2 blame: prevent error if range ends past end of fileistephens@atlassian.com, May 31, 2018
  2. 2/2 log: prevent error if line range ends past end of fileistephens@atlassian.com, May 31, 2018
  3. Junio C HamanoJun 1, 2018
  4. Junio C HamanoJun 1, 2018
  5. 1/2 blame: prevent error if range ends past end of fileistephens@atlassian.com, Jun 15, 2018
  6. 2/2 log: prevent error if line range ends past end of fileistephens@atlassian.com, Jun 15, 2018
  7. Isabella StephensJun 15, 2018
  8. Junio C HamanoJun 15, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.