From: Jonathan Nieder <jrnieder@gmail.com>
To: git@vger.kernel.org
Cc: Lars Hjemli <hjemli@gmail.com>, Tay Ray Chuan <rctay89@gmail.com>,
Matthieu Moy <Matthieu.Moy@imag.fr>,
Clemens Buchacher <drizzd@aon.at>, Jeff King <peff@peff.net>
Subject: [PATCH 09/24] merge-base --octopus to mimic show-branch --merge-base
Date: Tue, 17 Aug 2010 02:01:15 -0500 [thread overview]
Message-ID: <20100817070115.GI22057@burratino> (raw)
In-Reply-To: <20100817065147.GA18293@burratino>
While show-branch --merge-base does not support more than MAX_REVS
revs, git supports more with a different algorithm
(v1.6.0-rc0~51^2~13, Introduce get_octopus_merge_bases() in commit.c,
2008-06-27). Expose that functionality.
This should help scripts to catch up with builtin merge in supporting
dodecapus.
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Documentation/git-merge-base.txt | 19 ++++++++++++-------
builtin/merge-base.c | 35 ++++++++++++++++++++++++++++++++---
t/t6010-merge-base.sh | 2 ++
3 files changed, 46 insertions(+), 10 deletions(-)
diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt
index 09b34b0..125207e 100644
--- a/Documentation/git-merge-base.txt
+++ b/Documentation/git-merge-base.txt
@@ -8,7 +8,7 @@ git-merge-base - Find as good common ancestors as possible for a merge
SYNOPSIS
--------
-'git merge-base' [-a|--all] <commit> <commit>...
+'git merge-base' [-a|--all] [--octopus] <commit> <commit>...
DESCRIPTION
-----------
@@ -20,12 +20,12 @@ that does not have any better common ancestor is a 'best common
ancestor', i.e. a 'merge base'. Note that there can be more than one
merge base for a pair of commits.
-Among the two commits to compute the merge base from, one is specified by
-the first commit argument on the command line; the other commit is a
-(possibly hypothetical) commit that is a merge across all the remaining
-commits on the command line. As the most common special case, specifying only
-two commits on the command line means computing the merge base between
-the given two commits.
+Unless `--octopus` is given, among the two commits to compute the merge
+base from, one is specified by the first commit argument on the command
+line; the other commit is a (possibly hypothetical) commit that is a merge
+across all the remaining commits on the command line. As the most common
+special case, specifying only two commits on the command line means
+computing the merge base between the given two commits.
As a consequence, the 'merge base' is not necessarily contained in each of the
commit arguments if more than two commits are specified. This is different
@@ -37,6 +37,11 @@ OPTIONS
--all::
Output all merge bases for the commits, instead of just one.
+--octopus::
+ Compute the best common ancestors of all supplied commits,
+ in preparation for an n-way merge. This mimics the behavior
+ of 'git show-branch --merge-base'.
+
DISCUSSION
----------
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index 54e7ec2..c301286 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -23,7 +23,7 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
}
static const char * const merge_base_usage[] = {
- "git merge-base [-a|--all] <commit> <commit>...",
+ "git merge-base [-a|--all] [--octopus] <commit> <commit>...",
NULL
};
@@ -41,21 +41,50 @@ static struct commit *get_commit_reference(const char *arg)
return r;
}
+static int show_octopus_merge_bases(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 = get_octopus_merge_bases(revs);
+
+ if (!result)
+ return 1;
+
+ while (result) {
+ printf("%s\n", sha1_to_hex(result->item->object.sha1));
+ if (!show_all)
+ return 0;
+ result = result->next;
+ }
+
+ return 0;
+}
+
int cmd_merge_base(int argc, const char **argv, const char *prefix)
{
struct commit **rev;
int rev_nr = 0;
int show_all = 0;
+ int octopus = 0;
struct option options[] = {
- OPT_BOOLEAN('a', "all", &show_all, "outputs all common ancestors"),
+ OPT_BOOLEAN('a', "all", &show_all, "output all common ancestors"),
+ OPT_BOOLEAN(0, "octopus", &octopus, "find ancestors for a single n-way merge"),
OPT_END()
};
git_config(git_default_config, NULL);
argc = parse_options(argc, argv, prefix, options, merge_base_usage, 0);
- if (argc < 2)
+ if (!octopus && argc < 2)
usage_with_options(merge_base_usage, options);
+
+ if (octopus)
+ return show_octopus_merge_bases(argc, argv, show_all);
+
rev = xmalloc(argc * sizeof(*rev));
while (argc-- > 0)
rev[rev_nr++] = get_commit_reference(*argv++);
diff --git a/t/t6010-merge-base.sh b/t/t6010-merge-base.sh
index 4466e45..001431b 100755
--- a/t/t6010-merge-base.sh
+++ b/t/t6010-merge-base.sh
@@ -164,9 +164,11 @@ test_expect_success 'merge-base A B C' '
git rev-parse --verify MMR >expected.sb &&
git merge-base --all MMA MMB MMC >actual &&
+ git merge-base --all --octopus MMA MMB MMC >actual.common &&
git show-branch --merge-base MMA MMB MMC >actual.sb &&
test_cmp expected actual &&
+ test_cmp expected.sb actual.common &&
test_cmp expected.sb actual.sb
'
--
1.7.2.1.544.ga752d.dirty
next prev parent reply other threads:[~2010-08-17 7:03 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-17 6:51 [PATCH/RFC] updating examples/git-merge (plus a builtin/merge fix) Jonathan Nieder
2010-08-17 6:52 ` [PATCH 01/24] merge: do not mistake (ancestor of) tag for branch Jonathan Nieder
2010-08-17 6:53 ` [PATCH 02/24] t7600 (merge): modernize style Jonathan Nieder
2010-08-17 6:54 ` [PATCH 03/24] t7600 (merge): do not launch gitk for --debug Jonathan Nieder
2010-08-17 7:31 ` Ævar Arnfjörð Bjarmason
2010-08-17 17:50 ` Sverre Rabbelier
2010-08-18 2:29 ` Jonathan Nieder
2010-08-18 8:55 ` Ævar Arnfjörð Bjarmason
2010-08-18 10:44 ` Jonathan Nieder
2010-08-17 6:56 ` [PATCH 04/24] t7600 (merge): check reflog entry Jonathan Nieder
2010-08-17 6:56 ` [PATCH 05/24] t7600 (merge): test merge from branch yet to be born Jonathan Nieder
2010-08-17 6:57 ` [PATCH 06/24] t6010 (merge-base): modernize style Jonathan Nieder
2010-08-17 6:57 ` [PATCH 07/24] t6200 (fmt-merge-msg): style nitpicks Jonathan Nieder
2010-08-17 6:59 ` [PATCH 08/24] Documentation: add a SEE ALSO section for merge-base Jonathan Nieder
2010-08-17 7:01 ` Jonathan Nieder [this message]
2010-08-17 7:01 ` [PATCH 10/24] merge-base --independent to print reduced parent list in a merge Jonathan Nieder
2010-08-17 7:02 ` [PATCH 11/24] fmt-merge-msg -m to override subject line Jonathan Nieder
2010-08-17 23:00 ` [PATCH 11/24 v2] fmt-merge-msg -m to override merge title Jonathan Nieder
2010-08-17 7:03 ` [PATCH 12/24] merge script: --squash, --ff from unborn branch are errors Jonathan Nieder
2010-08-17 7:03 ` [PATCH 13/24] merge script: tweak unmerged files message to match builtin Jonathan Nieder
2010-08-17 7:36 ` Ævar Arnfjörð Bjarmason
2010-08-17 7:03 ` [PATCH 14/24] merge script: refuse to merge during merge Jonathan Nieder
2010-08-17 7:04 ` [PATCH 15/24] merge script: improve log message subject Jonathan Nieder
2010-08-17 7:05 ` [PATCH 16/24] merge script: merge -X<option> Jonathan Nieder
2010-08-17 7:05 ` [PATCH 17/24] merge script: allow custom strategies Jonathan Nieder
2010-08-17 7:06 ` [PATCH 18/24] merge script: forbid merge -s index Jonathan Nieder
2010-08-17 7:06 ` [PATCH 19/24] merge script: handle -m --log correctly Jonathan Nieder
2010-08-17 9:55 ` Tay Ray Chuan
2010-08-17 21:54 ` Jonathan Nieder
2010-08-17 7:09 ` [PATCH 20/24] merge script: handle many-way octopus Jonathan Nieder
2010-08-17 7:10 ` [PATCH 21/24] merge script: --ff-only to disallow true merge Jonathan Nieder
2010-08-17 7:11 ` [PATCH 22/24] merge script: handle --no-ff --no-commit correctly Jonathan Nieder
2010-08-17 7:11 ` [PATCH 23/24] merge script: notice @{-1} shorthand Jonathan Nieder
2010-08-17 7:13 ` [PATCH 24/24] merge script: learn --[no-]rerere-autoupdate Jonathan Nieder
2010-08-17 7:46 ` [PATCH/RFC] updating examples/git-merge (plus a builtin/merge fix) Ævar Arnfjörð Bjarmason
2010-08-17 8:10 ` Jonathan Nieder
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=20100817070115.GI22057@burratino \
--to=jrnieder@gmail.com \
--cc=Matthieu.Moy@imag.fr \
--cc=drizzd@aon.at \
--cc=git@vger.kernel.org \
--cc=hjemli@gmail.com \
--cc=peff@peff.net \
--cc=rctay89@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.