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

Re: phpdoc diff in git -L is not the correct one

From
René Scharfe <l.s.r@web.de>
Date
Nov 14, 2020, 23:40 UTC
Message-ID
<5a2d70eb-da75-ff59-8ac1-6ba81e1632da@web.de>
In-Reply-To
<CAN0heSr9=_So-sUhQN86vawBEkJhnrHHsd3OcSYZMZ-idZGFAQ@mail.gmail.com>
Am 14.11.20 um 18:35 schrieb Martin Ågren:
Show 30 quoted lines
> Hi,
>
> On Sat, 14 Nov 2020 at 16:55, Grégoire PARIS <postmaster@greg0ire.fr> wrote:
>
>>> In the end I think your best option right now is to give explicit line
>>> numbers for <end> and <start>.
>> That is indeed what I currently do, I plugged that to vim's visual
>> selection with
>>
>>    vnoremap <leader>l :<c-u>exe '!git log -L'
>> line("'<").','.line("'>").':'.expand('%')<CR>
>>
>> and it works great!
>
> Great!
>
>> I also suppose the issue is the same for any other language that has
>> documentation above function declarations.
>
> Yeah, you'll see the same thing for C files, e.g., using this in the
> repo of Git itself:
>
>   git log -L :strbuf_swap:strbuf.h
>
> It will follow the lines from the function definition all the way down
> to the next function, but just as you saw in your example, it will not
> match the comment immediately *before* the function. That is, these
> lines will be followed:
>
>   https://github.com/git/git/blob/v2.29.2/strbuf.h#L125-L138

The --function-context options of git diff and git grep try to show comments by including non-empty lines before function lines. This heuristic might work for -L :funcname:file as well (patch below), but breaks seven tests in each of t8001-annotate.sh, t8002-blame.sh and t8012-blame-colors.sh.

René
---
 line-range.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
diff --git a/line-range.c b/line-range.c
index 9b50583dc0..5d55fa255f 100644
--- a/line-range.c
+++ b/line-range.c
@@ -163,6 +163,13 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char
 	}
 }

+static int is_empty_line(const char *bol, const char *eol)
+{
+	while (bol < eol && isspace(*bol))
+		bol++;
+	return bol == eol;
+}
+
 static const char *parse_range_funcname(
 	const char *arg, nth_line_fn_t nth_line_cb,
 	void *cb_data, long lines, long anchor, long *begin, long *end,
@@ -233,6 +240,18 @@ static const char *parse_range_funcname(
 		(*end)++;
 	}

+	/*
+	 * Include non-empty, non-funcname lines before the found
+	 * funcname line, as they probably contain related comments.
+	 */
+	while (*begin > 0) {
+		const char *bol = nth_line_cb(cb_data, *begin - 1);
+		const char *eol = nth_line_cb(cb_data, *begin);
+		if (is_empty_line(bol, eol) || match_funcname(xecfg, bol, eol))
+			break;
+		(*begin)--;
+	}
+
 	regfree(&regexp);
 	free(xecfg);
 	free(pattern);
--
2.29.2
Previous: Martin ÅgrenNext: Grégoire PARIS
Message 5 of 7 in “phpdoc diff in git -L is not the correct one”
  1. Grégoire PARISNov 14, 2020
  2. Martin ÅgrenNov 14, 2020
  3. Grégoire PARISNov 14, 2020
  4. Martin ÅgrenNov 14, 2020
  5. René ScharfeNov 14, 2020
  6. Grégoire PARISNov 18, 2020
  7. Martin ÅgrenNov 18, 2020

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.