git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Jay Soffian <jaysoffian@gmail.com>
Cc: git@vger.kernel.org, Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: Re: [RFC PATCH 1/2] git-branch: allow --track to work w/local branches
Date: Fri, 15 Feb 2008 21:10:29 -0800	[thread overview]
Message-ID: <7v7ih5fpve.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: 1203133557-50013-1-git-send-email-jaysoffian@gmail.com

Jay Soffian <jaysoffian@gmail.com> writes:

> diff --git a/builtin-branch.c b/builtin-branch.c
> index e414c88..94ab195 100644
> --- a/builtin-branch.c
> +++ b/builtin-branch.c
> @@ -402,6 +402,16 @@ static int setup_tracking(const char *new_ref, const char *orig_ref)
>  		return error("Tracking not set up: name too long: %s",
>  				new_ref);
>  
> +	if (!prefixcmp(orig_ref, "refs/heads/")) {
> +		sprintf(key, "branch.%s.remote", new_ref);
> +		git_config_set(key, ".");
> +		sprintf(key, "branch.%s.merge", new_ref);
> +		git_config_set(key, orig_ref);
> +		printf("Branch %s set up to track local branch %s.\n",
> +			       new_ref, orig_ref);
> +		return 0;
> +	}
> +
>  	memset(&tracking, 0, sizeof(tracking));
>  	tracking.spec.dst = (char *)orig_ref;
>  	if (for_each_remote(find_tracked_branch, &tracking) ||

Although I am not so familiar with this area, the patch somehow
did not feel right, so I ended up doing a bit of digging.

After the context of the patch, we have this:

	if (tracking.matches == 1) {
		sprintf(key, "branch.%s.remote", new_ref);
		git_config_set(key, tracking.remote ?  tracking.remote : ".");
		sprintf(key, "branch.%s.merge", new_ref);
		git_config_set(key, tracking.src);

So it looks to me that the code already has intention to set the
"branch.*.remote" variable to "." when certain condition is met.
And the condition is "when tracking.remote is NULL, or it is
already a dot".

for_each_remote() iterates thru the remotes and
find_tracked_branch() does this:

        static int find_tracked_branch(struct remote *remote, void *priv)
        {
                struct tracking *tracking = priv;

                if (!remote_find_tracking(remote, &tracking->spec)) {
                        if (++tracking->matches == 1) {
                                tracking->src = tracking->spec.src;
                                tracking->remote = remote->name;
                        } else {
                                free(tracking->spec.src);
                                if (tracking->src) {
                                        free(tracking->src);
                                        tracking->src = NULL;
                                }
                        }
                        tracking->spec.src = NULL;
                }

                return 0;
        }

So if there is a remote whose name is "." (or NULL, but I do not
know when that can happen --- remote.c::make_remote() does not
allow creating such a remote as far as I can tell), that would
be found without the added extra code, wouldn't it?

I did a bit of experiment and with this in .git/config:

	[remote "."]
                fetch = refs/*:refs/*

it turns out that you do not have to patch the code at all.  The
above manual configuration feels somewhat like an ugly hack but
perhaps we should make the above two lines implied?  This area
was last cleaned up in 6f084a5 (branch --track: code cleanup and
saner handling of local branches).  I do not know if the
original intention of the code was to allow a hack like this to
work, or it is just an unintended accident that it happens to
work.  Dscho, any ideas?

  parent reply	other threads:[~2008-02-16  5:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-16  3:45 [RFC PATCH 1/2] git-branch: allow --track to work w/local branches Jay Soffian
2008-02-16  3:45 ` [RFC PATCH 2/2] new --rebase option to set branch.*.rebase for new branches Jay Soffian
2008-02-16  5:10 ` Junio C Hamano [this message]
2008-02-16  7:07   ` [RFC PATCH 1/2] git-branch: allow --track to work w/local branches Jay Soffian
2008-02-16 11:45   ` Johannes Schindelin
2008-02-17 18:05     ` Jay Soffian

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=7v7ih5fpve.fsf@gitster.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=jaysoffian@gmail.com \
    /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).