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

Re: Git has two ways to count modified lines

From
René Scharfe <l.s.r@web.de>
Date
Apr 4, 2022, 21:08 UTC
Message-ID
<c35bd0aa-2e46-e710-2b39-89f18bad0097@web.de>
In-Reply-To
<xmqqh779u72a.fsf@gitster.g>
Am 04.04.22 um 00:37 schrieb Junio C Hamano:
Show 19 quoted lines
> René Scharfe <l.s.r@web.de> writes:
>
>> Git stores the file contents before and after your change.  It doesn't
>> store any diff, but calculates them as needed, e.g. for the commit
>> confirmation message, or when you run git diff.  So in that sense there
>> is no "the diff".  The difference between two stored states can be
>> represented in many ways.
>
> That's the crucial point to answer this question.  Even without
> break/rewrite transformation, depending on the choice of the diff
> algorithm, the same change may be shown as different patch (with
> different line count, obviously).
>
>> But I have a question to the list as well: Why is break_opt (the
>> diff_options member for --break-rewrites) enabled for git commit by
>> default?
>
> If it is, that is a bug, I would say.  Don't we initialize the
> member to "-1" at around diff.c:4580 though?

Yes, but it's set to 0 in print_commit_summary() at sequencer.c:1330. That line was introduced by 3eb2a15eb3 (builtin-commit: make summary output consistent with status, 2007-12-16).

--- >8 ----
Subject: [PATCH] commit, sequencer: turn off break_opt for commit summary

dc6b1d92ca (wt-status: use settings from git_diff_ui_config, 2018-05-04) disabled diffopt.break_opt for diffstats shown by git status and in commit templates. For git status there isn't even a way to enable it. Make the commit summary (shown after the commit) consistent by disabling it there as well.

Reported-by: Laurent Lyaudet <laurent.lyaudet@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
---
 sequencer.c               |  1 -
 t/t7524-commit-summary.sh | 31 +++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100755 t/t7524-commit-summary.sh
diff --git a/sequencer.c b/sequencer.c
index a1bb39383d..85a17d45bd 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -1327,7 +1327,6 @@ void print_commit_summary(struct repository *r,
 	get_commit_format(format.buf, &rev);
 	rev.always_show_header = 0;
 	rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
-	rev.diffopt.break_opt = 0;
 	diff_setup_done(&rev.diffopt);

 	refs = get_main_ref_store(the_repository);
diff --git a/t/t7524-commit-summary.sh b/t/t7524-commit-summary.sh
new file mode 100755
index 0000000000..47b2f1dc22
--- /dev/null
+++ b/t/t7524-commit-summary.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+test_description='git commit summary'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	test_seq 101 200 >file &&
+	git add file &&
+	git commit -m initial &&
+	git tag initial
+'
+
+test_expect_success 'commit summary ignores rewrites' '
+	git reset --hard initial &&
+	test_seq 200 300 >file &&
+
+	git diff --stat >diffstat &&
+	git diff --stat --break-rewrites >diffstatrewrite &&
+
+	# make sure this scenario is a detectable rewrite
+	! test_cmp_bin diffstat diffstatrewrite &&
+
+	git add file &&
+	git commit -m second >actual &&
+
+	grep "1 file" <actual >actual.total &&
+	grep "1 file" <diffstat >diffstat.total &&
+	test_cmp diffstat.total actual.total
+'
+
+test_done
--
2.35.1
Previous: Laurent LyaudetNext: Ævar Arnfjörð Bjarmason
Message 5 of 7 in “Git has two ways to count modified lines”
  1. Laurent LyaudetMar 16, 2022
  2. Laurent LyaudetApr 2, 2022
  3. René ScharfeApr 2, 2022
  4. Laurent LyaudetApr 5, 2022
  5. René ScharfeApr 4, 2022
  6. Ævar Arnfjörð BjarmasonApr 5, 2022
  7. René ScharfeApr 5, 2022

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.