summaryrefslogtreecommitdiff
path: root/builtin/merge.c
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2011-03-23 23:48:24 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2011-03-24 00:37:25 -0700
commit93e535a5b78c9861eca3e9371d1c3e5173c0ab02 (patch)
tree1466d6651b4ae358cc0fc4e141fd7dc368dcf472 /builtin/merge.c
parentmerge: match the help text with the documentation (diff)
downloadtgif-93e535a5b78c9861eca3e9371d1c3e5173c0ab02.tar.xz
merge: merge with the default upstream branch without argument
"git merge" without specifying any commit is a no-op by default. A new option merge.defaultupstream can be set to true to cause such an invocation of the command to merge the upstream branches configured for the current branch by using their last observed values stored in their remote tracking branches. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/merge.c')
-rw-r--r--builtin/merge.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/builtin/merge.c b/builtin/merge.c
index a2105ef90c..309bdd4dc7 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -25,6 +25,7 @@
#include "help.h"
#include "merge-recursive.h"
#include "resolve-undo.h"
+#include "remote.h"
#define DEFAULT_TWOHEAD (1<<0)
#define DEFAULT_OCTOPUS (1<<1)
@@ -37,7 +38,7 @@ struct strategy {
};
static const char * const builtin_merge_usage[] = {
- "git merge [options] <commit>...",
+ "git merge [options] [<commit>...]",
"git merge [options] <msg> HEAD <commit>",
"git merge --abort",
NULL
@@ -59,6 +60,7 @@ static int option_renormalize;
static int verbosity;
static int allow_rerere_auto;
static int abort_current_merge;
+static int default_to_upstream;
static struct strategy all_strategy[] = {
{ "recursive", DEFAULT_TWOHEAD | NO_TRIVIAL },
@@ -537,6 +539,9 @@ static int git_merge_config(const char *k, const char *v, void *cb)
if (is_bool && shortlog_len)
shortlog_len = DEFAULT_MERGE_LOG_LEN;
return 0;
+ } else if (!strcmp(k, "merge.defaulttoupstream")) {
+ default_to_upstream = git_config_bool(k, v);
+ return 0;
}
return git_diff_ui_config(k, v, cb);
}
@@ -912,6 +917,35 @@ static int evaluate_result(void)
return cnt;
}
+/*
+ * Pretend as if the user told us to merge with the tracking
+ * branch we have for the upstream of the current branch
+ */
+static int setup_with_upstream(const char ***argv)
+{
+ struct branch *branch = branch_get(NULL);
+ int i;
+ const char **args;
+
+ if (!branch)
+ die("No current branch.");
+ if (!branch->remote)
+ die("No remote for the current branch.");
+ if (!branch->merge_nr)
+ die("No default upstream defined for the current branch.");
+
+ args = xcalloc(branch->merge_nr + 1, sizeof(char *));
+ for (i = 0; i < branch->merge_nr; i++) {
+ if (!branch->merge[i]->dst)
+ die("No remote tracking branch for %s from %s",
+ branch->merge[i]->src, branch->remote_name);
+ args[i] = branch->merge[i]->dst;
+ }
+ args[i] = NULL;
+ *argv = args;
+ return i;
+}
+
int cmd_merge(int argc, const char **argv, const char *prefix)
{
unsigned char result_tree[20];
@@ -984,6 +1018,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
if (!allow_fast_forward && fast_forward_only)
die("You cannot combine --no-ff with --ff-only.");
+ if (!argc && !abort_current_merge && default_to_upstream)
+ argc = setup_with_upstream(&argv);
+
if (!argc)
usage_with_options(builtin_merge_usage,
builtin_merge_options);