From: Michael Grubb <devel@dailyvoid.com>
To: unlisted-recipients:; (no To-header on input)
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Jonathan Nieder <jrnieder@gmail.com>,
vmiklos@frugalware.org
Subject: Re: [PATCH v4] Add default merge options for all branches
Date: Tue, 03 May 2011 15:36:03 -0500 [thread overview]
Message-ID: <4DC06733.6010904@dailyvoid.com> (raw)
In-Reply-To: <4DC0608F.9040208@dailyvoid.com>
This patch has a trailing whitespace on one line.
I'm resubmitting to fix it.
On 5/3/11 3:07 PM, Michael Grubb wrote:
> Add support for branch.*.mergeoptions for setting default options for
> all branches. This new value shares semantics with the existing
> branch.<name>.mergeoptions variable. If a branch specific value is
> found, that value will be used.
>
> The need for this arises from the fact that there is currently not an
> easy way to set merge options for all branches. Instead of having to
> specify merge options for each individual branch there should be a way
> to set defaults for all branches and then override a specific branch's
> options.
>
> In order to facilitate future features centered around this new
> "globlike" syntax a new struct has been created to keep track of the
> branch.*.* options. Currently it only supports branch.*.mergeoptions,
> but can be easily modified in the future to support other branch
> specific options as well. The mechanism will "vote" on specific-"ness"
> of the configuration key and ultimately only use the most specific
> options. This is not cumulative but overriding.
>
> Signed-off-by: Michael Grubb <devel@dailyvoid.com>
> ---
> Documentation/git-merge.txt | 3 +
> builtin/merge.c | 90 +++++++++++++++++++++++++++++++++---------
> t/t7600-merge.sh | 39 ++++++++++++++++++
> 3 files changed, 112 insertions(+), 20 deletions(-)
>
> diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
> index e2e6aba..eaab3e4 100644
> --- a/Documentation/git-merge.txt
> +++ b/Documentation/git-merge.txt
> @@ -307,6 +307,9 @@ branch.<name>.mergeoptions::
> Sets default options for merging into branch <name>. The syntax and
> supported options are the same as those of 'git merge', but option
> values containing whitespace characters are currently not supported.
> + The special value '*' for <name> may be used to configure default
> + options for all branches. Values for specific branch names will
> + override the this default.
>
> SEE ALSO
> --------
> diff --git a/builtin/merge.c b/builtin/merge.c
> index d171c63..d6ce85e 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -32,6 +32,21 @@
> #define NO_FAST_FORWARD (1<<2)
> #define NO_TRIVIAL (1<<3)
>
> +/* This is for branch.<foo>. blocks
> + * the vote member holds a value between
> + * 0.0 and 1.0 which measures how closely
> + * a branch name matches the key member.
> + * where branch.*.mergeoptions would be 0.1 and
> + * branch.<name>.mergeoptions would be 1.0
> + * Also it is called vote because I couldn't come
> + * up with a better name.
> + */
> +struct merge_options_cb {
> + char *key;
> + char *value;
> + float vote;
> +};
> +
> struct strategy {
> const char *name;
> unsigned attr;
> @@ -503,28 +518,60 @@ cleanup:
> strbuf_release(&bname);
> }
>
> -static int git_merge_config(const char *k, const char *v, void *cb)
> +static void parse_git_merge_options(const char *k, const char *v,
> + void *cb)
> {
> - if (branch && !prefixcmp(k, "branch.") &&
> - !prefixcmp(k + 7, branch) &&
> - !strcmp(k + 7 + strlen(branch), ".mergeoptions")) {
> - const char **argv;
> - int argc;
> - char *buf;
> -
> - buf = xstrdup(v);
> - argc = split_cmdline(buf, &argv);
> - if (argc < 0)
> - die(_("Bad branch.%s.mergeoptions string: %s"), branch,
> - split_cmdline_strerror(argc));
> - argv = xrealloc(argv, sizeof(*argv) * (argc + 2));
> - memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
> - argc++;
> - parse_options(argc, argv, NULL, builtin_merge_options,
> - builtin_merge_usage, 0);
> - free(buf);
> + struct merge_options_cb *merge_options = cb;
> + int changed = 0;
> +
> + /* We only handle mergeoptions for now */
> + if (suffixcmp(k, ".mergeoptions"))
> + return;
> +
> + if (!prefixcmp(k, "branch.*") && merge_options->vote <= 0.1 ) {
> + merge_options->vote = 0.1;
> + changed = 1;
> + } else if (branch && !prefixcmp(k, "branch.") &&
> + !prefixcmp(k + 7, branch) &&
> + merge_options->vote < 1.0) {
> + merge_options->vote = 1.0;
> + changed = 1;
> }
>
> + if (changed) {
> + merge_options->key = (char *)k;
> + merge_options->value = (char *)v;
> + }
> +}
> +
> +static void apply_merge_options(struct merge_options_cb *opts)
> +{
> + const char **argv;
> + int argc;
> + char *buf;
> +
> + if ( opts == NULL )
> + return;
> +
> + buf = xstrdup(opts->value);
> + argc = split_cmdline(buf, &argv);
> + if (argc < 0)
> + die(_("Bad %s string: %s"),
> + opts->key, split_cmdline_strerror(argc));
> +
> + argv = xrealloc(argv, sizeof(*argv) * (argc + 2));
> + memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
> + argc++;
> + parse_options(argc, argv, NULL, builtin_merge_options,
> + builtin_merge_usage, 0);
> + free(buf);
> +}
> +
> +static int git_merge_config(const char *k, const char *v, void *cb)
> +{
> + if (cb != NULL && branch && !prefixcmp(k, "branch."))
> + parse_git_merge_options(k, v, cb);
> +
> if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat"))
> show_diffstat = git_config_bool(k, v);
> else if (!strcmp(k, "pull.twohead"))
> @@ -987,6 +1034,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
> const char *head_arg;
> int flag, head_invalid = 0, i;
> int best_cnt = -1, merge_was_ok = 0, automerge_was_ok = 0;
> + struct merge_options_cb merge_options = {NULL, NULL, 0.0};
> struct commit_list *common = NULL;
> const char *best_strategy = NULL, *wt_strategy = NULL;
> struct commit_list **remotes = &remoteheads;
> @@ -1004,7 +1052,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
> if (is_null_sha1(head))
> head_invalid = 1;
>
> - git_config(git_merge_config, NULL);
> + git_config(git_merge_config, &merge_options);
> + if (merge_options.key != NULL && merge_options.value != NULL)
> + apply_merge_options(&merge_options);
>
> /* for color.ui */
> if (diff_use_color_default == -1)
> diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
> index e84e822..5b1f8e1 100755
> --- a/t/t7600-merge.sh
> +++ b/t/t7600-merge.sh
> @@ -415,6 +415,45 @@ test_expect_success 'merge c0 with c1 (no-ff)' '
>
> test_debug 'git log --graph --decorate --oneline --all'
>
> +test_expect_success 'merge c0 with c1 (default no-ff)' '
> + git reset --hard c0 &&
> + test_might_fail git config --unset branch.master.mergeoptions &&
> + git config "branch.*.mergeoptions" "--no-ff" &&
> + test_tick &&
> + git merge c1 &&
> + git config --remove-section "branch.*" &&
> + verify_merge file result.1 &&
> + verify_parents $c0 $c1
> +'
> +
> +test_debug 'git log --graph --decorate --oneline --all'
> +
> +test_expect_success 'combine branch.*.mergeoptions with branch.x.mergeoptions' '
> + git reset --hard c0 &&
> + test_might_fail git config --remove-section branch.master &&
> + git config "branch.*.mergeoptions" "--no-ff" &&
> + git config branch.master.mergeoptions "--ff" &&
> + test_tick &&
> + git merge c1 &&
> + git config --remove-section "branch.*" &&
> + verify_merge file result.1 &&
> + verify_parents "$c0"
> +'
> +
> +test_expect_success 'reverse branch.x.mergeoptions with branch.*.mergeoptions' '
> + git reset --hard c0 &&
> + test_might_fail git config --remove-section branch.master &&
> + git config branch.master.mergeoptions "--ff" &&
> + git config "branch.*.mergeoptions" "--no-ff" &&
> + test_tick &&
> + git merge c1 &&
> + git config --remove-section "branch.*" &&
> + verify_merge file result.1 &&
> + verify_parents "$c0"
> +'
> +
> +test_debug 'git log --graph --decorate --oneline --all'
> +
> test_expect_success 'combining --squash and --no-ff is refused' '
> test_must_fail git merge --squash --no-ff c1 &&
> test_must_fail git merge --no-ff --squash c1
next prev parent reply other threads:[~2011-05-03 20:36 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-02 19:23 [PATCH 2] Add default merge options for all branches Michael Grubb
2011-05-02 22:47 ` Miklos Vajna
2011-05-02 23:36 ` Junio C Hamano
2011-05-03 5:35 ` Michael Grubb
2011-05-03 5:38 ` [PATCH v3] " Michael Grubb
2011-05-03 9:03 ` Jonathan Nieder
2011-05-03 9:49 ` Jonathan Nieder
2011-05-03 16:46 ` Michael Grubb
2011-05-03 18:16 ` Junio C Hamano
2011-05-03 20:22 ` Michael Grubb
2011-05-03 20:50 ` Jonathan Nieder
2011-05-03 20:37 ` Jens Lehmann
2011-05-03 20:07 ` [PATCH v4] " Michael Grubb
2011-05-03 20:36 ` Michael Grubb [this message]
2011-05-03 20:44 ` Jonathan Nieder
2011-05-03 22:51 ` Junio C Hamano
2011-05-04 4:25 ` Junio C Hamano
2011-05-04 4:28 ` Michael Grubb
2011-05-04 4:58 ` Jonathan Nieder
2011-05-04 18:58 ` Michael Grubb
2011-05-04 21:35 ` Junio C Hamano
2011-05-04 10:58 ` John Szakmeister
2011-05-03 22:03 ` Junio C Hamano
2011-05-03 20:37 ` [PATCH v4.1] " Michael Grubb
2011-05-04 22:07 ` [PATCH v5] " Michael Grubb
2011-05-05 0:42 ` Junio C Hamano
2011-05-06 20:36 ` Junio C Hamano
2011-05-06 21:59 ` Jonathan Nieder
2011-05-06 20:54 ` [PATCH 0/2] tests: make verify_merge check that the number of parents is right Jonathan Nieder
2011-05-06 20:58 ` [PATCH 1/2] tests: eliminate unnecessary setup test assertions Jonathan Nieder
2011-05-06 21:48 ` Jeff King
2011-05-06 22:13 ` Jeff King
2011-05-06 22:27 ` Junio C Hamano
2011-05-06 22:29 ` Jeff King
2011-05-07 22:05 ` Junio C Hamano
2011-05-09 13:31 ` [PATCH 0/3] blame --line-porcelain Jeff King
2011-05-09 13:33 ` [PATCH 1/3] add tests for various blame formats Jeff King
2011-05-09 13:34 ` [PATCH 2/3] blame: refactor porcelain output Jeff King
2011-05-09 15:39 ` Thiago Farina
2011-05-09 13:34 ` [PATCH 3/3] blame: add --line-porcelain output format Jeff King
2011-05-06 22:26 ` [PATCH 1/2] tests: eliminate unnecessary setup test assertions Jonathan Nieder
2011-05-06 21:00 ` [PATCH 2/2] tests: teach verify_parents to check for extra parents Jonathan Nieder
2011-05-06 21:34 ` Junio C Hamano
2011-05-06 21:42 ` Jonathan Nieder
2011-05-06 21:32 ` [PATCH v5] Add default merge options for all branches Jonathan Nieder
2011-05-06 22:01 ` Junio C Hamano
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=4DC06733.6010904@dailyvoid.com \
--to=devel@dailyvoid.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=vmiklos@frugalware.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).