From: Jonathan Nieder <jrnieder@gmail.com>
To: Michael Grubb <devel@dailyvoid.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
vmiklos@frugalware.org, deskinm@umich.edu
Subject: Re: [PATCH v3] Add default merge options for all branches
Date: Tue, 3 May 2011 04:03:52 -0500 [thread overview]
Message-ID: <20110503090351.GA27862@elie> (raw)
In-Reply-To: <4DBF94E9.2010502@dailyvoid.com>
Hi,
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.
So in the future one might be able to do things like
[branch "git-gui/*"]
mergeoptions = -s subtree
Interesting.
> The need for this arises from the fact that there is currently not an
> easy way to set merge options for all branches.
I'm curious: what merge options/workflows does this tend to be useful
for? The above explanation seems a bit abstract (though already
convincing).
> 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.
What happens if the global value is seen first?
On to the code. Warning: nitpicks ahead.
[...]
> +++ b/builtin/merge.c
> @@ -32,6 +32,13 @@
> #define NO_FAST_FORWARD (1<<2)
> #define NO_TRIVIAL (1<<3)
>
> +#define MERGEOPTIONS_DEFAULT (1<<0)
> +#define MERGEOPTIONS_BRANCH (1<<1)
Are these bitflags?
> @@ -505,24 +512,42 @@ cleanup:
>
> static int git_merge_config(const char *k, const char *v, void *cb)
> {
> + int merge_option_mode = 0;
> + struct merge_options_cb *merge_options =
> + (struct merge_options_cb *)cb;
This cast should not needed, I'd think.
[...]
> - if (branch && !prefixcmp(k, "branch.") &&
> - !prefixcmp(k + 7, branch) &&
> - !strcmp(k + 7 + strlen(branch), ".mergeoptions")) {
> + if (!strcmp(k, "branch.*.mergeoptions"))
> + merge_option_mode = MERGEOPTIONS_DEFAULT;
> + else if (branch && !prefixcmp(k, "branch.") &&
> + !prefixcmp(k + 7, branch) &&
> + !strcmp(k + 7 + strlen(branch), ".mergeoptions"))
> + merge_option_mode = MERGEOPTIONS_BRANCH;
> +
> + if ((merge_option_mode == MERGEOPTIONS_DEFAULT &&
> + !merge_options->override_default) ||
> + merge_option_mode == MERGEOPTIONS_BRANCH) {
> const char **argv;
It is hard to see at a glance where the "if" condition ends and
the body begins. Why not
if ((merge_option_mode == MERGEOPTIONS_DEFAULT &&
!merge_options->override_default) ||
merge_option_mode == MERGEOPTIONS_BRANCH) {
const char **argv;
...
or
if (merge_option_mode == MERGEOPTIONS_BRANCH ? 1 :
merge_option_mode == MERGEOPTIONS_DEFAULT ?
!merge_options->override_default : 0) {
const char **argv;
...
or even
if (merge_option_mode == MERGEOPTIONS_DEFAULT &&
merge_options->override_default)
merge_option_mode = 0;
if (merge_option_mode) {
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));
> + if (argc < 0) {
> + if (merge_option_mode == 1)
> + die(_("Bad merge.mergeoptions string: %s"),
> + split_cmdline_strerror(argc));
merge.*.mergeoptions, no?
> + 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 == MERGEOPTIONS_BRANCH)
> + merge_options->override_default = 1;
Could be clearer to put this next to the code that checks
override_default.
[...]
> --- 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 &&
Better to make that
test_might_fail git config --unset ...
so it will still work if earlier tests stop setting that
variable.
> + 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'
Yuck. Did anything come of the idea of a --between-tests option to
use an arbitrary command here automatically? (Not your fault.)
> +
> +test_expect_success 'combine merge.mergeoptions with branch.x.mergeoptions' '
> + git reset --hard c0 &&
> + git config --remove-section branch.master &&
Could make sense to use test_might_fail for this one, too.
> + 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_debug 'git log --graph --decorate --oneline --all'
Nice, a clean patch with a few reasonable tests.
With whichever of the changes below make sense,
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Thanks.
---
builtin/merge.c | 37 ++++++++++++++++++++-----------------
t/t7600-merge.sh | 4 ++--
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/builtin/merge.c b/builtin/merge.c
index 9fe129f..7156e92 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -32,8 +32,8 @@
#define NO_FAST_FORWARD (1<<2)
#define NO_TRIVIAL (1<<3)
-#define MERGEOPTIONS_DEFAULT (1<<0)
-#define MERGEOPTIONS_BRANCH (1<<1)
+#define MERGEOPTIONS_DEFAULT 1
+#define MERGEOPTIONS_BRANCH 2
struct merge_options_cb {
int override_default;
@@ -513,8 +513,7 @@ cleanup:
static int git_merge_config(const char *k, const char *v, void *cb)
{
int merge_option_mode = 0;
- struct merge_options_cb *merge_options =
- (struct merge_options_cb *)cb;
+ struct merge_options_cb *merge_options = cb;
if (!strcmp(k, "branch.*.mergeoptions"))
merge_option_mode = MERGEOPTIONS_DEFAULT;
@@ -523,31 +522,35 @@ static int git_merge_config(const char *k, const char *v, void *cb)
!strcmp(k + 7 + strlen(branch), ".mergeoptions"))
merge_option_mode = MERGEOPTIONS_BRANCH;
- if ((merge_option_mode == MERGEOPTIONS_DEFAULT &&
- !merge_options->override_default) ||
- merge_option_mode == MERGEOPTIONS_BRANCH) {
+ /*
+ * If an applicable [branch "foo"] mergeoptions setting was
+ * seen already, let it mask the [branch "*"] defaults.
+ */
+ if (merge_options->override_default &&
+ merge_option_mode == MERGEOPTIONS_DEFAULT)
+ merge_option_mode = 0;
+
+ if (merge_option_mode == MERGEOPTIONS_BRANCH)
+ merge_options->override_default = 1;
+
+ if (merge_option_mode) {
const char **argv;
int argc;
char *buf;
buf = xstrdup(v);
argc = split_cmdline(buf, &argv);
- if (argc < 0) {
- 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));
- }
+ if (argc < 0)
+ die(_("Bad merge.%s.mergeoptions string: %s"),
+ merge_option_mode == MERGEOPTIONS_DEFAULT ?
+ "*" : 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 == MERGEOPTIONS_BRANCH)
- merge_options->override_default = 1;
}
if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat"))
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index cea2b31..ff807f4 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -417,7 +417,7 @@ 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 &&
+ test_might_fail git config --unset branch.master.mergeoptions &&
git config "branch.*.mergeoptions" "--no-ff" &&
test_tick &&
git merge c1 &&
@@ -430,7 +430,7 @@ 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 &&
+ test_might_fail git config --remove-section branch.master &&
git config "branch.*.mergeoptions" "--no-ff" &&
git config branch.master.mergeoptions "--ff" &&
test_tick &&
--
1.7.5
next prev parent reply other threads:[~2011-05-03 9:11 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 [this message]
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
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110503090351.GA27862@elie \
--to=jrnieder@gmail.com \
--cc=deskinm@umich.edu \
--cc=devel@dailyvoid.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).