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

[PATCH] git-status: Detect copies as well as renames

From
Björn Steinbrink <b.steinbrink@gmx.de>
Date
Oct 10, 2008, 16:08 UTC
Message-ID
<20081010160804.GA24515@atjola.homenet>
In-Reply-To
<7vabdcmp4n.fsf@gitster.siamese.dyndns.org>
Signed-off-by: Björn Steinbrink <B.Steinbrink@gmx.de>
---
On 2008.10.10 08:44:08 -0700, Junio C Hamano wrote:
Show 17 quoted lines
> "Michael P. Soulier" <msoulier@digitaltorque.ca> writes:
> 
> > #       renamed:    templates/scrc/index.html -> templates/scrc/cres_taps.html
> > #       modified:   templates/scrc/index.html
> >
> > Looking at the last two lines here, there is obviously an issue.
> 
> I am puzzled.
> 
> Looking at wt-status.c "renamed: A -> B" will be shown only when A and
> B are similar enough *and* there is no A remaining in the final
> result, and in such a case, "modified: A" should not be shown.
> Because git does not care how you created B (IOW, it does not matter
> if B was typed from scratch with copying and pasting, or created by
> copying and editing), the "renamed: A -> B" entry itself is not
> surprising nor look like a bug at all, but its presense at the same
> time as "modified: A" does feel very fishy.

Maybe something like this is required? The "1" meant that only renames were to be detected, so I'm quite puzzled why it detects copies in some cases at all. At least some trivial:

cp Makefile Makefile2 echo 123 >> Makefile git add Makefile*

Now correctly shows the Makefile2 being a copy of Makefile, while the old behaviour was to simply show it as a new file. _BUT_ when you also did:

git mv Makefile Makefile3

You see a rename of Makefile and a copy of Makefile. Even though we didn't request copy detection... Hu?

I feel like stabbing in the dark though, so I intentionally left out a description in the commit message that tells why this change is good. I simply have no idea, it just _felt_ better. ;-)

Björn
 wt-status.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/wt-status.c b/wt-status.c
index 889e50f..3d645b9 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -210,7 +210,7 @@ static void wt_status_print_updated(struct wt_status *s)
 	rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
 	rev.diffopt.format_callback = wt_status_print_updated_cb;
 	rev.diffopt.format_callback_data = s;
-	rev.diffopt.detect_rename = 1;
+	rev.diffopt.detect_rename = DIFF_DETECT_COPY;
 	rev.diffopt.rename_limit = 200;
 	rev.diffopt.break_opt = 0;
 	run_diff_index(&rev, 1);
@@ -310,7 +310,7 @@ static void wt_status_print_verbose(struct wt_status *s)
 	init_revisions(&rev, NULL);
 	setup_revisions(0, NULL, &rev, s->reference);
 	rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
-	rev.diffopt.detect_rename = 1;
+	rev.diffopt.detect_rename = DIFF_DETECT_COPY;
 	rev.diffopt.file = s->fp;
 	rev.diffopt.close_file = 0;
 	run_diff_index(&rev, 1);
-- 
1.6.0.2.307.gc427.dirty
Previous: Michael P. Soulier
Message 6 of 6 in “git confused by rename”
  1. Michael P. SoulierOct 10, 2008
  2. Junio C HamanoOct 10, 2008
  3. Junio C HamanoOct 10, 2008
  4. Björn SteinbrinkOct 10, 2008
  5. Michael P. SoulierOct 10, 2008
  6. git-status: Detect copies as well as renamesBjörn Steinbrink, Oct 10, 2008

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.