[PATCH v5 4/4] merge: add support for merging from upstream by default
Add the option merge.defaultupstream to add support for merging from the upstream branch by default. The upstream branch is found using branch.[name].merge.
Signed-off-by: Jared Hance <jaredhance@gmail.com>
---
Documentation/config.txt | 6 ++++++
builtin/merge.c | 32 +++++++++++++++++++++++---------
2 files changed, 29 insertions(+), 9 deletions(-)
Show changes to 2 files +29 −9
Documentation/config.txt, builtin/merge.c
diff --git a/Documentation/config.txt b/Documentation/config.txt
index c5e1835..4415691 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1389,6 +1389,12 @@ man.<tool>.path::
include::merge-config.txt[]
+merge.defaultUpstream::
+ If merge is called without any ref arguments, merge from the branch
+ specified in branch.<current branch>.merge, which is considered to be
+ the upstream branch for the current branch, possibly set by --track or
+ --set-upstream.
+
mergetool.<tool>.path::
Override the path for the given tool. This is useful in case
your tool is not in the PATH.
diff --git a/builtin/merge.c b/builtin/merge.c
index 71b392d..a3ca6a0 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -37,7 +37,7 @@ struct strategy {
};
static const char * const builtin_merge_usage[] = {
- "git merge [options] <branch>...",
+ "git merge [options] [<branch>...]",
"git merge [options] <msg> HEAD <branch>",
NULL
};
@@ -58,6 +58,8 @@ static int option_renormalize;
static int verbosity;
static int allow_rerere_auto;
static int abort_current_merge;
+static int default_upstream;
+static const char *upstream_branch;
static struct strategy all_strategy[] = {
{ "recursive", DEFAULT_TWOHEAD | NO_TRIVIAL },
@@ -524,7 +526,8 @@ static int per_branch_config(const char *k, const char *v, void *cb)
free(buf);
return 0;
- }
+ } else if (!strcmp(variable, ".merge"))
+ return git_config_string(&upstream_branch, k, v);
return 1; /* not what I handle */
}
@@ -536,7 +539,9 @@ static int git_merge_config(const char *k, const char *v, void *cb)
if (status <= 0)
return status;
- if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat"))
+ if (!strcmp(k, "merge.defaultupstream"))
+ default_upstream = git_config_bool(k, v);
+ else if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat"))
show_diffstat = git_config_bool(k, v);
else if (!strcmp(k, "pull.twohead"))
return git_config_string(&pull_twohead, k, v);
@@ -1017,9 +1022,13 @@ 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)
- usage_with_options(builtin_merge_usage,
- builtin_merge_options);
+ if (!argc) {
+ if (!default_upstream || !upstream_branch)
+ usage_with_options(builtin_merge_usage,
+ builtin_merge_options);
+
+ setup_merge_commit(&buf, &remotes, upstream_branch);
+ }
/*
* This could be traditional "merge <msg> HEAD <commit>..." and
@@ -1082,9 +1091,14 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
}
}
- if (head_invalid || !argc)
- usage_with_options(builtin_merge_usage,
- builtin_merge_options);
+ if (head_invalid)
+ usage_msg_opt("cannot use old-style invocation from an unborn"
+ "branch",
+ builtin_merge_usage, builtin_merge_options);
+
+ if (!argc && !(default_upstream && upstream_branch))
+ usage_msg_opt("no commit to merge specified",
+ builtin_merge_usage, builtin_merge_options);
strbuf_addstr(&buf, "merge");
for (i = 0; i < argc; i++)
--
1.7.4