get_merge_bases(): always clean-up object flags

The callers of get_merge_bases() can choose to leave object flags used during the merge-base traversal by passing cleanup=0 as a parameter, but in practice a very few callers can afford to do so (namely, "git merge-base"), as they need to compute merge base in preparation for other processing of their own and they need to see the object without contaminate flags. Change the function signature of get_merge_bases_many() and get_merge_bases() to drop the cleanup parameter, so that the majority of the callers do not have to say ", 1" at the end. Give a new get_merge_bases_many_dirty() API to support only a few callers that know they do not need to spend cycles cleaning up the object flags. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Oct 30, 2014 at 12:20 UTC 2ce406ccb85c4546b6d19309a6101b37c7bd952e
11 files changed +38 -22
bisect.c
+1 -1
@@ -776,7 +776,7 @@ static void check_merge_bases(int no_checkout)
776 int rev_nr;
777 struct commit **rev = get_bad_and_good_commits(&rev_nr);
778
779 - result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1, 1);
779 + result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1);
780
781 for (; result; result = result->next) {
782 const unsigned char *mb = result->item->object.sha1;
builtin/merge-base.c
+2 -2
@@ -10,7 +10,7 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
10 {
11 struct commit_list *result;
12
13 - result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1, 0);
13 + result = get_merge_bases_many_dirty(rev[0], rev_nr - 1, rev + 1);
14
15 if (!result)
16 return 1;
@@ -176,7 +176,7 @@ static int handle_fork_point(int argc, const char **argv)
176 for (i = 0; i < revs.nr; i++)
177 revs.commit[i]->object.flags &= ~TMP_MARK;
178
179 - bases = get_merge_bases_many(derived, revs.nr, revs.commit, 0);
179 + bases = get_merge_bases_many_dirty(derived, revs.nr, revs.commit);
180
181 /*
182 * There should be one and only one merge base, when we found
builtin/merge.c
+2 -2
@@ -1330,7 +1330,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
1330 if (!remoteheads)
1331 ; /* already up-to-date */
1332 else if (!remoteheads->next)
1333 - common = get_merge_bases(head_commit, remoteheads->item, 1);
1333 + common = get_merge_bases(head_commit, remoteheads->item);
1334 else {
1335 struct commit_list *list = remoteheads;
1336 commit_list_insert(head_commit, &list);
@@ -1427,7 +1427,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
1427 * merge_bases again, otherwise "git merge HEAD^
1428 * HEAD^^" would be missed.
1429 */
1430 - common_one = get_merge_bases(head_commit, j->item, 1);
1430 + common_one = get_merge_bases(head_commit, j->item);
1431 if (hashcmp(common_one->item->object.sha1,
1432 j->item->object.sha1)) {
1433 up_to_date = 0;
builtin/rev-parse.c
+1 -1
@@ -277,7 +277,7 @@ static int try_difference(const char *arg)
277 struct commit *a, *b;
278 a = lookup_commit_reference(sha1);
279 b = lookup_commit_reference(end);
280 - exclude = get_merge_bases(a, b, 1);
280 + exclude = get_merge_bases(a, b);
281 while (exclude) {
282 struct commit_list *n = exclude->next;
283 show_rev(REVERSED,
commit.c
+21 -8
@@ -883,7 +883,7 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in)
883
884 for (j = ret; j; j = j->next) {
885 struct commit_list *bases;
886 - bases = get_merge_bases(i->item, j->item, 1);
886 + bases = get_merge_bases(i->item, j->item);
887 if (!new)
888 new = bases;
889 else
@@ -952,10 +952,10 @@ static int remove_redundant(struct commit **array, int cnt)
952 return filled;
953 }
954
955 -struct commit_list *get_merge_bases_many(struct commit *one,
956 - int n,
957 - struct commit **twos,
958 - int cleanup)
955 +static struct commit_list *get_merge_bases_many_0(struct commit *one,
956 + int n,
957 + struct commit **twos,
958 + int cleanup)
959 {
960 struct commit_list *list;
961 struct commit **rslt;
@@ -998,10 +998,23 @@ struct commit_list *get_merge_bases_many(struct commit *one,
998 return result;
999 }
1000
1001 -struct commit_list *get_merge_bases(struct commit *one, struct commit *two,
1002 - int cleanup)
1001 +struct commit_list *get_merge_bases_many(struct commit *one,
1002 + int n,
1003 + struct commit **twos)
1004 +{
1005 + return get_merge_bases_many_0(one, n, twos, 1);
1006 +}
1007 +
1008 +struct commit_list *get_merge_bases_many_dirty(struct commit *one,
1009 + int n,
1010 + struct commit **twos)
1011 +{
1012 + return get_merge_bases_many_0(one, n, twos, 0);
1013 +}
1014 +
1015 +struct commit_list *get_merge_bases(struct commit *one, struct commit *two)
1016 {
1004 - return get_merge_bases_many(one, 1, &two, cleanup);
1017 + return get_merge_bases_many_0(one, 1, &two, 1);
1018 }
1019
1020 /*
commit.h
+5 -2
@@ -223,10 +223,13 @@ struct commit_graft *read_graft_line(char *buf, int len);
223 int register_commit_graft(struct commit_graft *, int);
224 struct commit_graft *lookup_commit_graft(const unsigned char *sha1);
225
226 -extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);
227 -extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup);
226 +extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2);
227 +extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos);
228 extern struct commit_list *get_octopus_merge_bases(struct commit_list *in);
229
230 +/* To be used only when object flags after this call no longer matter */
231 +extern struct commit_list *get_merge_bases_many_dirty(struct commit *one, int n, struct commit **twos);
232 +
233 /* largest positive number a signed 32-bit integer can contain */
234 #define INFINITE_DEPTH 0x7fffffff
235
merge-recursive.c
+1 -1
@@ -1904,7 +1904,7 @@ int merge_recursive(struct merge_options *o,
1904 }
1905
1906 if (!ca) {
1907 - ca = get_merge_bases(h1, h2, 1);
1907 + ca = get_merge_bases(h1, h2);
1908 ca = reverse_commit_list(ca);
1909 }
1910
notes-merge.c
+1 -1
@@ -594,7 +594,7 @@ int notes_merge(struct notes_merge_options *o,
594 assert(local && remote);
595
596 /* Find merge bases */
597 - bases = get_merge_bases(local, remote, 1);
597 + bases = get_merge_bases(local, remote);
598 if (!bases) {
599 base_sha1 = null_sha1;
600 base_tree_sha1 = EMPTY_TREE_SHA1_BIN;
revision.c
+2 -2
@@ -1383,7 +1383,7 @@ static void prepare_show_merge(struct rev_info *revs)
1383 other = lookup_commit_or_die(sha1, "MERGE_HEAD");
1384 add_pending_object(revs, &head->object, "HEAD");
1385 add_pending_object(revs, &other->object, "MERGE_HEAD");
1386 - bases = get_merge_bases(head, other, 1);
1386 + bases = get_merge_bases(head, other);
1387 add_rev_cmdline_list(revs, bases, REV_CMD_MERGE_BASE, UNINTERESTING | BOTTOM);
1388 add_pending_commit_list(revs, bases, UNINTERESTING | BOTTOM);
1389 free_commit_list(bases);
@@ -1488,7 +1488,7 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
1488 : lookup_commit_reference(b_obj->sha1));
1489 if (!a || !b)
1490 goto missing;
1491 - exclude = get_merge_bases(a, b, 1);
1491 + exclude = get_merge_bases(a, b);
1492 add_rev_cmdline_list(revs, exclude,
1493 REV_CMD_MERGE_BASE,
1494 flags_exclude);
sha1_name.c
+1 -1
@@ -987,7 +987,7 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
987 two = lookup_commit_reference_gently(sha1_tmp, 0);
988 if (!two)
989 return -1;
990 - mbs = get_merge_bases(one, two, 1);
990 + mbs = get_merge_bases(one, two);
991 if (!mbs || mbs->next)
992 st = -1;
993 else {
submodule.c
+1 -1
@@ -301,7 +301,7 @@ static int prepare_submodule_summary(struct rev_info *rev, const char *path,
301 left->object.flags |= SYMMETRIC_LEFT;
302 add_pending_object(rev, &left->object, path);
303 add_pending_object(rev, &right->object, path);
304 - merge_bases = get_merge_bases(left, right, 1);
304 + merge_bases = get_merge_bases(left, right);
305 if (merge_bases) {
306 if (merge_bases->item == left)
307 *fast_forward = 1;