git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <junkio@cox.net>
To: git@vger.kernel.org
Subject: Re: A note on merging conflicts..
Date: Sat, 01 Jul 2006 13:14:59 -0700	[thread overview]
Message-ID: <7vpsgpccak.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: <7vveqhccnk.fsf@assigned-by-dhcp.cox.net> (Junio C. Hamano's message of "Sat, 01 Jul 2006 13:07:11 -0700")

Junio C Hamano <junkio@cox.net> writes:

> Linus Torvalds <torvalds@osdl.org> writes:
>
>> On Sat, 1 Jul 2006, Rene Scharfe wrote:
>>> 
>>> I wonder why the two clear_commit_marks() calls at the end of
>>> get_merge_bases() are not sufficient, though.
>>
>> Why does that thing check for "parent->object.parsed"?
>
> Oh, I thought I fixed that up when I merged.  Sorry.
>
>> Also, it only clears commit marks if they are contiguous, but some commit 
>> marking may not be dense (eg, the "UNINTERESTING" mark may have been set 
>> by (PARENT1 && PARENT2) triggering, but is not set in the commits that 
>> reach it.
>
> That is true.

I'll be offline for a few hours, but if anybody is inclined to
fix this up, I'd appreciate it to be based on top of 7c6f8aa
commit (which is the tip of js/merge-base topic branch).

Perhaps as a starter (not even compile tested)... 

diff --git a/commit.c b/commit.c
index 0431027..23ac210 100644
--- a/commit.c
+++ b/commit.c
@@ -397,13 +397,13 @@ void clear_commit_marks(struct commit *c
 {
 	struct commit_list *parents;
 
-	parents = commit->parents;
+	if (!commit)
+		return;
 	commit->object.flags &= ~mark;
+	parents = commit->parents;
 	while (parents) {
 		struct commit *parent = parents->item;
-		if (parent && parent->object.parsed &&
-		    (parent->object.flags & mark))
-			clear_commit_marks(parent, mark);
+		clear_commit_marks(parent, mark);
 		parents = parents->next;
 	}
 }
@@ -1012,7 +1012,8 @@ static void mark_reachable_commits(struc
 	}
 }
 
-struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2)
+struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2,
+				    int cleanup_needed)
 {
 	struct commit_list *list = NULL;
 	struct commit_list *result = NULL;
@@ -1081,8 +1082,10 @@ struct commit_list *get_merge_bases(stru
 	}
 
 	/* reset flags */
-	clear_commit_marks(rev1, PARENT1 | PARENT2 | UNINTERESTING);
-	clear_commit_marks(rev2, PARENT1 | PARENT2 | UNINTERESTING);
+	if (cleanup_needed) {
+		clear_commit_marks(rev1, PARENT1 | PARENT2 | UNINTERESTING);
+		clear_commit_marks(rev2, PARENT1 | PARENT2 | UNINTERESTING);
+	}
 
 	return result;
 }
diff --git a/commit.h b/commit.h
index 89b9dad..53bc697 100644
--- a/commit.h
+++ b/commit.h
@@ -105,6 +105,6 @@ struct commit_graft *read_graft_line(cha
 int register_commit_graft(struct commit_graft *, int);
 int read_graft_file(const char *graft_file);
 
-extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2);
+extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup_needed);
 
 #endif /* COMMIT_H */
diff --git a/merge-base.c b/merge-base.c
index b41f76c..59f723f 100644
--- a/merge-base.c
+++ b/merge-base.c
@@ -6,7 +6,7 @@ static int show_all = 0;
 
 static int merge_base(struct commit *rev1, struct commit *rev2)
 {
-	struct commit_list *result = get_merge_bases(rev1, rev2);
+	struct commit_list *result = get_merge_bases(rev1, rev2, 0);
 
 	if (!result)
 		return 1;

  reply	other threads:[~2006-07-01 20:15 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-01  2:44 A note on merging conflicts Linus Torvalds
2006-07-01  3:08 ` Junio C Hamano
2006-07-01  3:54   ` Linus Torvalds
2006-07-01  3:59     ` Linus Torvalds
2006-07-01 15:09     ` Rene Scharfe
2006-07-01 15:23       ` Johannes Schindelin
2006-07-01 16:25       ` Linus Torvalds
2006-07-01 18:13         ` Rene Scharfe
2006-07-01 18:01       ` J. Bruce Fields
2006-07-01 18:20         ` Linus Torvalds
2006-07-01 22:24           ` Daniel Barkalow
2006-07-01 22:57             ` Linus Torvalds
2006-07-01 23:25               ` Daniel Barkalow
2006-07-01 23:45                 ` Daniel Barkalow
2006-07-02 11:31                   ` Rene Scharfe
2006-07-02 21:42                     ` Daniel Barkalow
2006-07-02  0:08                 ` Linus Torvalds
2006-07-01 18:22         ` Jakub Narebski
2006-07-01 18:52           ` Linus Torvalds
2006-07-01 18:37       ` Junio C Hamano
2006-07-01 19:29         ` Rene Scharfe
2006-07-01 19:56           ` Junio C Hamano
2006-07-01 23:01             ` Johannes Schindelin
2006-07-01 20:04           ` Linus Torvalds
2006-07-01 20:07             ` Junio C Hamano
2006-07-01 20:14               ` Junio C Hamano [this message]
2006-07-01 23:29                 ` [PATCH 1/3] Add get_merge_bases_clean() Rene Scharfe
2006-07-01 23:43                   ` Johannes Schindelin
2006-07-01 23:29                 ` [PATCH 2/3] Add '...' operator for revisions Rene Scharfe
2006-07-01 23:29                 ` [PATCH 3/3] Make clear_commit_marks() clean harder Rene Scharfe
2006-07-03  9:32                   ` Junio C Hamano
2006-07-03 13:56                     ` Johannes Schindelin
2006-07-03 17:05                       ` Linus Torvalds
2006-07-03 21:08                         ` Johannes Schindelin
2006-07-03 19:47                       ` Junio C Hamano
2006-07-03 21:12                         ` Johannes Schindelin
2006-07-03 22:55                           ` Linus Torvalds
2006-07-04  7:53                             ` Johannes Schindelin
2006-07-04  8:20                               ` Junio C Hamano
2006-07-02  9:49                 ` [PATCH 4/3] Fold get_merge_bases_clean() into get_merge_bases() Rene Scharfe
2006-07-02  9:56                   ` Johannes Schindelin
2006-07-02 16:43                   ` Linus Torvalds
2006-07-02 17:40                     ` Rene Scharfe
2006-07-02 18:28                       ` Junio C Hamano
2006-07-02 20:59                         ` Rene Scharfe
2006-07-02 21:15                           ` Rene Scharfe
2006-07-02 21:17                           ` Linus Torvalds
2006-07-02 20:44                       ` Linus Torvalds
2006-07-07  8:26 ` A note on merging conflicts Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7vpsgpccak.fsf@assigned-by-dhcp.cox.net \
    --to=junkio@cox.net \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).