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

2018-05-31 Thread Junio C Hamano
isteph...@atlassian.com writes:

> From: Isabella Stephens 
>
> 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 
> ---
>  line-log.c  | 8 +---
>  t/t4211-line-log.sh | 5 ++---
>  2 files changed, 7 insertions(+), 6 deletions(-)

Thanks.  Will queue.


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

2018-05-30 Thread istephens
From: Isabella Stephens 

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 
---
 line-log.c  | 8 +---
 t/t4211-line-log.sh | 5 ++---
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/line-log.c b/line-log.c
index cdc2257db..4da40dec1 100644
--- a/line-log.c
+++ b/line-log.c
@@ -599,11 +599,13 @@ parse_lines(struct commit *commit, const char *prefix, 
struct string_list *args)
lines, anchor, , ,
full_name))
die("malformed -L argument '%s'", range_part);
-   if (lines < end || ((lines || begin) && lines < begin))
-   die("file %s has only %lu lines", name_part, lines);
+   if ((!lines && (begin || end)) || lines < begin)
+   die(Q_("file %s has only %lu line",
+  "file %s has only %lu lines",
+  lines), name_part, lines);
if (begin < 1)
begin = 1;
-   if (end < 1)
+   if (end < 1 || lines < end)
end = lines;
begin--;
line_log_data_insert(, 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