All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: Jack Nagel <jacknagel@gmail.com>,
	Ramkumar Ramachandra <artagnon@gmail.com>,
	git@vger.kernel.org
Subject: Re: [PATCH] remote: handle pushremote config in any order order
Date: Mon, 24 Feb 2014 09:55:12 -0800	[thread overview]
Message-ID: <xmqqvbw49z0f.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <20140224085903.GA10698@sigill.intra.peff.net> (Jeff King's message of "Mon, 24 Feb 2014 03:59:03 -0500")

Jeff King <peff@peff.net> writes:

> Yes, with a few exceptions, we usually try to make the ordering in the
> config file irrelevant. This is a bug. The patch below should fix it.

Looks good.  Thanks.

> -- >8 --
> Subject: remote: handle pushremote config in any order
>
> The remote we push can be defined either by
> remote.pushdefault or by branch.*.pushremote for the current
> branch. The order in which they appear in the config file
> should not matter to precedence (which should be to prefer
> the branch-specific config).
>
> The current code parses the config linearly and uses a
> single string to store both values, overwriting any
> previous value. Thus, config like:
>
>   [branch "master"]
>   pushremote = foo
>   [remote]
>   pushdefault = bar
>
> erroneously ends up pushing to "bar" from the master branch.
>
> We can fix this by storing both values and resolving the
> correct value after all config is read.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  remote.c              |  7 ++++++-
>  t/t5516-fetch-push.sh | 12 ++++++++++++
>  2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/remote.c b/remote.c
> index e41251e..7232a33 100644
> --- a/remote.c
> +++ b/remote.c
> @@ -49,6 +49,7 @@ static int branches_nr;
>  
>  static struct branch *current_branch;
>  static const char *default_remote_name;
> +static const char *branch_pushremote_name;
>  static const char *pushremote_name;
>  static int explicit_default_remote_name;
>  
> @@ -352,7 +353,7 @@ static int handle_config(const char *key, const char *value, void *cb)
>  			}
>  		} else if (!strcmp(subkey, ".pushremote")) {
>  			if (branch == current_branch)
> -				if (git_config_string(&pushremote_name, key, value))
> +				if (git_config_string(&branch_pushremote_name, key, value))
>  					return -1;
>  		} else if (!strcmp(subkey, ".merge")) {
>  			if (!value)
> @@ -492,6 +493,10 @@ static void read_config(void)
>  			make_branch(head_ref + strlen("refs/heads/"), 0);
>  	}
>  	git_config(handle_config, NULL);
> +	if (branch_pushremote_name) {
> +		free(pushremote_name);
> +		pushremote_name = branch_pushremote_name;
> +	}
>  	alias_all_urls();
>  }
>  
> diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
> index 926e7f6..1309c4d 100755
> --- a/t/t5516-fetch-push.sh
> +++ b/t/t5516-fetch-push.sh
> @@ -536,6 +536,18 @@ test_expect_success 'push with config branch.*.pushremote' '
>  	check_push_result down_repo $the_commit heads/master
>  '
>  
> +test_expect_success 'branch.*.pushremote config order is irrelevant' '
> +	mk_test one_repo heads/master &&
> +	mk_test two_repo heads/master &&
> +	test_config remote.one.url one_repo &&
> +	test_config remote.two.url two_repo &&
> +	test_config branch.master.pushremote two_repo &&
> +	test_config remote.pushdefault one_repo &&
> +	git push &&
> +	check_push_result one_repo $the_first_commit heads/master &&
> +	check_push_result two_repo $the_commit heads/master
> +'
> +
>  test_expect_success 'push with dry-run' '
>  
>  	mk_test testrepo heads/master &&

  reply	other threads:[~2014-02-24 17:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-24  5:10 [BUG] remote.pushdefault and branch.<name>.pushremote definition order Jack Nagel
2014-02-24  8:59 ` [PATCH] remote: handle pushremote config in any order order Jeff King
2014-02-24 17:55   ` Junio C Hamano [this message]
2014-02-24 20:32     ` Junio C Hamano
2014-02-24 20:39       ` Jeff King
2014-02-24 20:53         ` Junio C Hamano
2014-02-24 22:45   ` Ramkumar Ramachandra

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=xmqqvbw49z0f.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox.com \
    --cc=artagnon@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=jacknagel@gmail.com \
    --cc=peff@peff.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.