From e2f5df42449ace700e5a237f604c34b4657c0edf Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 30 Dec 2013 11:37:49 -0800 Subject: merge-base: separate "--independent" codepath into its own helper It piggybacks on an unrelated handle_octopus() function only because there are some similarities between the way they need to preprocess their input and output their result. There is nothing similar in the true logic between these two operations. Signed-off-by: Junio C Hamano --- builtin/merge-base.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'builtin') diff --git a/builtin/merge-base.c b/builtin/merge-base.c index 0c4cd2f9f7..daa96c7909 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -44,19 +44,36 @@ static struct commit *get_commit_reference(const char *arg) return r; } -static int handle_octopus(int count, const char **args, int reduce, int show_all) +static int handle_independent(int count, const char **args) { struct commit_list *revs = NULL; struct commit_list *result; int i; - if (reduce) - show_all = 1; + for (i = count - 1; i >= 0; i--) + commit_list_insert(get_commit_reference(args[i]), &revs); + + result = reduce_heads(revs); + if (!result) + return 1; + + while (result) { + printf("%s\n", sha1_to_hex(result->item->object.sha1)); + result = result->next; + } + return 0; +} + +static int handle_octopus(int count, const char **args, int show_all) +{ + struct commit_list *revs = NULL; + struct commit_list *result; + int i; for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); - result = reduce ? reduce_heads(revs) : get_octopus_merge_bases(revs); + result = get_octopus_merge_bases(revs); if (!result) return 1; @@ -114,8 +131,10 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) if (reduce && (show_all || octopus)) die("--independent cannot be used with other options"); - if (octopus || reduce) - return handle_octopus(argc, argv, reduce, show_all); + if (octopus) + return handle_octopus(argc, argv, show_all); + else if (reduce) + return handle_independent(argc, argv); rev = xmalloc(argc * sizeof(*rev)); while (argc-- > 0) -- cgit v1.2.3 From 8f29299136c2f11730d876cd62637a9e37d4c388 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 30 Dec 2013 11:58:54 -0800 Subject: merge-base --octopus: reduce the result from get_octopus_merge_bases() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scripts that use "merge-base --octopus" could do the reducing themselves, but most of them are expected to want to get the reduced results without having to do any work themselves. Tests are taken from a message by Василий Макаров Signed-off-by: Junio C Hamano --- We might want to vet the existing callers of the underlying get_octopus_merge_bases() and find out if _all_ of them are doing anything extra (like deduping) because the machinery can return duplicate results. And if that is the case, then we may want to move the dedupling down the callchain instead of having it here. --- builtin/merge-base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'builtin') diff --git a/builtin/merge-base.c b/builtin/merge-base.c index daa96c7909..87f4dbccae 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -73,7 +73,7 @@ static int handle_octopus(int count, const char **args, int show_all) for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); - result = get_octopus_merge_bases(revs); + result = reduce_heads(get_octopus_merge_bases(revs)); if (!result) return 1; -- cgit v1.2.3