threads / patch / 5472

patchDo 3-way diff between HEAD, index and working directory

Subject: [PATCH] Do 3-way diff between HEAD, index and working directory

## tl;dr

2 messages between Sep 4, 2006 and Sep 4, 2006. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Paul Mackerras· Sep 4, 2006, 11:38 UTC · lore

This implements a 3-way diff between the HEAD commit, the state in the index, and the working directory. This is like the n-way diff for a merge, and uses much of the same code. It is invoked with the -c flag to git-diff-index, which it already accepted and did nothing with.

Signed-off-by: Paul Mackerras <paulus@samba.org>
---
Junio, does this look right?  It seems to work OK, and I need it for
my new git commit tool, for the cases where the user has done a
checkin and then further modified the working file.  It will be needed
even more when I implement partial checkins within a file.

Thanks, Paul.

Show changes to diff-lib.c +25 −0
diff --git a/diff-lib.c b/diff-lib.c
index 9edfa92..fc69fb9 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -213,6 +213,31 @@ static int show_modified(struct rev_info
 		return -1;
 	}
 
+	if (revs->combine_merges && !cached &&
+	    (hashcmp(sha1, old->sha1) || hashcmp(old->sha1, new->sha1))) {
+		struct combine_diff_path *p;
+		int pathlen = ce_namelen(new);
+
+		p = xmalloc(combine_diff_path_size(2, pathlen));
+		p->path = (char *) &p->parent[2];
+		p->next = NULL;
+		p->len = pathlen;
+		memcpy(p->path, new->name, pathlen);
+		p->path[pathlen] = 0;
+		p->mode = ntohl(mode);
+		hashclr(p->sha1);
+		memset(p->parent, 0, 2 * sizeof(struct combine_diff_parent));
+		p->parent[0].status = DIFF_STATUS_MODIFIED;
+		p->parent[0].mode = ntohl(new->ce_mode);
+		hashcpy(p->parent[0].sha1, new->sha1);
+		p->parent[1].status = DIFF_STATUS_MODIFIED;
+		p->parent[1].mode = ntohl(old->ce_mode);
+		hashcpy(p->parent[1].sha1, old->sha1);
+		show_combined_diff(p, 2, revs->dense_combined_merges, revs);
+		free(p);
+		return 0;
+	}
+
 	oldmode = old->ce_mode;
 	if (mode == oldmode && !hashcmp(sha1, old->sha1) &&
 	    !revs->diffopt.find_copies_harder)
-- 
VGER BF report: U 0.519891
Junio C Hamano· Sep 4, 2006, 22:23 UTC · re: Paul Mackerras · lore

Re: [PATCH] Do 3-way diff between HEAD, index and working directory

Paul Mackerras <paulus@samba.org> writes:
Show 8 quoted lines
> This implements a 3-way diff between the HEAD commit, the state in the
> index, and the working directory.  This is like the n-way diff for a
> merge, and uses much of the same code.  It is invoked with the -c flag
> to git-diff-index, which it already accepted and did nothing with.
>
> Signed-off-by: Paul Mackerras <paulus@samba.org>
> ---
> Junio, does this look right?

Seems correct from a cursory look. This also seems to change the behaviour for an unmerged entry case slightly but I think it is for the better (depending on the definition of "better" -- some people may feel combined diff to be weird and confusing).

← back to recent threads