On Mon, May 2, 2011 at 1:19 PM, Michael Grubb <devel@xxxxxxxxxxxxx> wrote: > Introduce a new configuration variable, merge.mergeoptions. > The semantics of this new variable are the same as the branch specific > branch.<branch>.mergeoptions. ÂHowever, if a branch specific setting is > found, this option will not override it. > > 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. > > The approach taken is to make note of whether a branch specific > mergeoptions key has been seen and only apply the global value if it > hasn't. An alternative method would be to keep the > branch.<branch>.mergeoptions semantics, but assign a special value for > <branch> to be the global default. > > Signed-off-by: Michael Grubb <devel@xxxxxxxxxxxxx> > --- > ÂDocumentation/merge-config.txt |  Â7 +++++++ > Âbuiltin/merge.c        Â|  27 ++++++++++++++++++++++----- > Ât/t7600-merge.sh        |  27 +++++++++++++++++++++++++++ > Â3 files changed, 56 insertions(+), 5 deletions(-) > > diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt > index 8920258..0fc7511 100644 > --- a/Documentation/merge-config.txt > +++ b/Documentation/merge-config.txt > @@ -57,6 +57,13 @@ merge.verbosity:: >    Âabove outputs debugging information. ÂThe default is level 2. >    ÂCan be overridden by the 'GIT_MERGE_VERBOSITY' environment variable. > Â+merge.mergeoptions:: > +    Sets default options for merging any branch. This value is only > +    used if there is not a branch.<name>.mergeoptions value set. > +    The syntax and supported options are the same as those of 'git > +    merge', but option values containing whitespace characters are > +    currently not supported. > + > Âmerge.<driver>.name:: >    ÂDefines a human-readable name for a custom low-level >    Âmerge driver. ÂSee linkgit:gitattributes[5] for details. > diff --git a/builtin/merge.c b/builtin/merge.c > index 0bdd19a..1d4f852 100644 > --- a/builtin/merge.c > +++ b/builtin/merge.c > @@ -505,9 +505,18 @@ cleanup: > Âstatic int git_merge_config(const char *k, const char *v, void *cb) > Â{ > -    if (branch && !prefixcmp(k, "branch.") && > -        !prefixcmp(k + 7, branch) && > -        !strcmp(k + 7 + strlen(branch), ".mergeoptions")) { > +    static int branch_merge_options_set = 0; > +    int merge_option_mode = 0; > + > +    if ( !strcmp(k, "merge.mergeoptions") ) please, no need of spaces between if ( ... ) There are more cases in this change below. I don't know if Junio is strong about this and if you need to resend. But at least that is not consistent with the rest of the file. Just my 0.02 cents. > +        merge_option_mode = 1; > +    else if ( branch && !prefixcmp(k, "branch.") && > +            Â!prefixcmp(k + 7, branch) && > +            Â!strcmp(k + 7 + strlen(branch), ".mergeoptions")) > +        merge_option_mode = 2; > + > +    if ( (merge_option_mode == 1 && !branch_merge_options_set) || > +         merge_option_mode == 2) { >        Âconst char **argv; >        Âint argc; >        Âchar *buf; > @@ -515,14 +524,22 @@ static int git_merge_config(const char *k, const > char *v, void *cb) >        Âbuf = xstrdup(v); >        Âargc = split_cmdline(buf, &argv); >        Âif (argc < 0) > -            die(_("Bad branch.%s.mergeoptions string: %s"), branch, > -              split_cmdline_strerror(argc)); > +        { > +            if ( merge_option_mode == 1 ) > +                die(_("Bad merge.mergeoptions string: %s"), + > split_cmdline_strerror(argc)); > +            else > +                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); > +        if ( merge_option_mode == 2 ) > +            branch_merge_options_set = 1; >    Â} >    Âif (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat")) > diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh > index 87d5d78..15e9418 100755 > --- a/t/t7600-merge.sh > +++ b/t/t7600-merge.sh > @@ -415,6 +415,33 @@ test_expect_success 'merge c0 with c1 (no-ff)' ' > Âtest_debug 'git log --graph --decorate --oneline --all' > Â+test_expect_success 'merge c0 with c1 (global no-ff)' ' > +    git reset --hard c0 && > +    git config --unset branch.master.mergeoptions && > +    git config merge.mergeoptions "--no-ff" && > +    test_tick && > +    git merge c1 && > +    git config --remove-section merge && > +    verify_merge file result.1 && > +    verify_parents $c0 $c1 > +' > + > +test_debug 'git log --graph --decorate --oneline --all' > + > +test_expect_success 'combine merge.mergeoptions with > branch.x.mergeoptions' ' > +    git reset --hard c0 && > +    git config --remove-section branch.master && > +    git config merge.mergeoptions "--no-ff" && > +    git config branch.master.mergeoptions "--ff" && > +    test_tick && > +    git merge c1 && > +    git config --remove-section merge && > +    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 > -- > 1.7.5 > > -- > To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html