Re: [RFC PATCH 1/2] git-branch: allow --track to work w/local branches

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jay Soffian <jaysoffian@xxxxxxxxx> 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?
-
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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux