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

[PATCH] When rewriting parents, cull duplicates

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 18, 2006, 14:26 UTC
Message-ID
<Pine.LNX.4.63.0610181622320.14200@wbgn013.biozentrum.uni-wuerzburg.de>
In-Reply-To
<200610181602.36856.jnareb@gmail.com>
Earlier, when calling
	git log --parents some-ref -- path/file

it was possible that in case of merges, multiple parents would be rewritten as the _same_ commit, which would happily be printed multiple times.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
	Subject: Re: [BUG] git-log shows first parent and repeated last 
	for octopus merge
	On Wed, 18 Oct 2006, Jakub Narebski wrote:
	> Johannes Schindelin wrote:
	> > On Wed, 18 Oct 2006, Jakub Narebski wrote:
	> > 
	> > > When trying to find how many merges and how many octopus 
	> > > merges (merges with more than two parents) are in git.git 
	> > > repository I have encountered the following strange output 
	> > > of git-log:
	> > > 
	> > > 1000:jnareb@roke:~/git> git log --parents --full-history \
	> > > --max-count=1 211232bae64bcc60bbf5d1b5e5b2344c22ed767e -- a//b
	> > >  commit 211232bae64bcc60bbf5d1b5e5b2344c22ed767e <...>
	> > >  Merge: d0d0d0b... d0d0d0b... d0d0d0b... d0d0d0b... d0d0d0b...
	> > >  [...]
	> > 
	> > This happens because a//b rewrites the history, i.e. the 
	> > parents are edited. IMHO it makes no sense at all to show the 
	> > parents in such a case, since they are bogus.
	> 
	> Or rather it has no sense to _repeat_ rewritten parent the 
	> number of times the commit has parents originally.
	Here you are.
 revision.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/revision.c b/revision.c
index 280e92b..8a2ca52 100644
--- a/revision.c
+++ b/revision.c
@@ -1086,12 +1086,23 @@ static int rewrite_one(struct rev_info *
 	}
 }
 
+static int parent_is_duplicate(struct commit_list *parents,
+		struct commit_list *current)
+{
+	for (; parents != current; parents = parents->next)
+		if (parents->item == current->item)
+			return 1;
+	return 0;
+}
+
 static void rewrite_parents(struct rev_info *revs, struct commit *commit)
 {
 	struct commit_list **pp = &commit->parents;
 	while (*pp) {
 		struct commit_list *parent = *pp;
-		if (rewrite_one(revs, &parent->item) < 0) {
+		if (rewrite_one(revs, &parent->item) < 0 ||
+				/* cull duplicates */
+				parent_is_duplicate(commit->parents, parent)) {
 			*pp = parent->next;
 			continue;
 		}
-- 
1.4.2.4.g21cef-dirty
Previous: Jakub NarebskiNext: Junio C Hamano
Message 4 of 6 in “[BUG] git-log shows first parent and repeated last for octopus merge”
  1. Jakub NarebskiOct 18, 2006
  2. Johannes SchindelinOct 18, 2006
  3. Jakub NarebskiOct 18, 2006
  4. When rewriting parents, cull duplicatesJohannes Schindelin, Oct 18, 2006
  5. Junio C HamanoOct 18, 2006
  6. A Large Angry SCMOct 18, 2006

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.