Add default merge options for all branches
PATCH 1/1 Add default merge options for all branches
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.
--- Documentation/merge-config.txt | 7 +++++++ builtin/merge.c | 27 ++++++++++++++++++++++----- t/t7600-merge.sh | 27 +++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-)
Documentation/merge-config.txt +6 -0
@@ -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.
builtin/merge.c +12 -3
@@ -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" ) ) + 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"))
t/t7600-merge.sh +13 -0
@@ -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
Signature · 1 line
1.7.5
Quoted 5 lines · Michael Grubb
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.
Both my gut feeling and design taste tell me that "branch.*.mergeoptions" (using literal '*' for match-all for now) would be a lot more appropriate here. We could extend the '*' part later to take globs.
The resulting part of the configuration file would look like this:
[branch "*"]
mergeoptions = ...and later we would end up supporting other kinds of defaults, like:
[branch "ko/*"]
remote = korg
[branch "github/*"]
remote = github
mergeoptions = ...
I didn't read the patch carefully but there seems to be many instances of the same "excess whitespace" pattern you should be able to avoid easily to match the style by looking at the surrounding code.
Thanks.
Quoted 46 lines · Michael Grubb
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 <[email protected]>---
Documentation/merge-config.txt | 7 +++++++builtin/merge.c| 27 ++++++++++++++++++++++-----t/t7600-merge.sh| 27 +++++++++++++++++++++++++++3 files changed, 56 insertions(+), 5 deletions(-)Documentation/merge-config.txt +0
-0@@ -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.builtin/merge.c +0
-0
builtin/merge.c cleanup: · line 510
Quoted 9 lines
builtin/merge.c +4
-3@@ -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.
Quoted 81 lines
builtin/merge.c +17
-2+ 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"))
t/t7600-merge.sh +0
-0@@ -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_mergefile result.1 &&
+verify_parents$c0 $c1
+'t/t7600-merge.sh +4
-0+ +test_debug 'git log --graph --decorate --oneline --all' + +test_expect_success 'combine merge.mergeoptions withbranch.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_mergefile result.1 &&
+verify_parents"$c0"
+'t/t7600-merge.sh +3
-0+ +test_debug 'git log --graph --decorate --oneline --all' +test_expect_success 'combining --squash and --no-ff is refused' '
test_must_failgit merge --squash --no-ff c1 &&test_must_failgit 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Sorry for that, it's my own habit I'm afraid, however I did go back and fix it up so that it is consistent with the rest of the file. Should I resubmit the patch in reply to this thread?
Quoted 152 lines · Thiago Farina
Quoted 46 lines · Michael Grubb
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 <[email protected]>--- Documentation/merge-config.txt | 7 +++++++ builtin/merge.c | 27 ++++++++++++++++++++++----- t/t7600-merge.sh | 27 +++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-)Documentation/merge-config.txt +6
-0@@ -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.builtin/merge.c +0
-0builtin/merge.c cleanup: · line 510
Quoted 9 lines
builtin/merge.c +4
-3@@ -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.
Quoted 76 lines
builtin/merge.c +17
-2+ 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" ))t/t7600-merge.sh +13
-0@@ -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 withbranch.x.mergeoptions' '
t/t7600-merge.sh +13
-1+ 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
Quoted 5 lines
--
To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [email protected]
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 5 lines · Thiago Farina
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.
Absolutely.
I made it a policy to refuse cleaning up patches from people who are capable to do so themselves, and make exceptions only to small trivial patches from new contributors.
Otherwise the process would not scale.
Thanks.