Re: [PATCH v8 1/3] branch: accept multiple upstream branches for tracking

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

 



Junio C Hamano <gitster@xxxxxxxxx> writes:

>> +/**
>> + * Install upstream tracking configuration for a branch; specifically, add
>> + * `branch.<name>.remote` and `branch.<name>.merge` entries.
>> + *
>> + * `flag` contains integer flags for options; currently only
>> + * BRANCH_CONFIG_VERBOSE is checked.
>> + *
>> + * `local` is the name of the branch whose configuration we're installing.
>> + *
>> + * `origin` is the name of the remote owning the upstream branches. NULL means
>> + * the upstream branches are local to this repo.
>> + *
>> + * `remotes` is a list of refs that are upstream of local
>> + */
>> +static int install_branch_config_multiple_remotes(int flag, const char *local,
>> +		const char *origin, struct string_list *remotes)
>>  {
>>  	const char *shortname = NULL;
>>  	struct strbuf key = STRBUF_INIT;
>> +	struct string_list_item *item;
>>  	int rebasing = should_setup_rebase(origin);
>>  
>> +	if (!remotes->nr)
>> +		BUG("must provide at least one remote for branch config");
>> +	if (rebasing && remotes->nr > 1)
>> +		die(_("cannot inherit upstream tracking configuration of "
>> +		      "multiple refs when rebasing is requested"));
>> +
>> +	/*
>> +	 * If the new branch is trying to track itself, something has gone
>> +	 * wrong. Warn the user and don't proceed any further.
>> +	 */
>> +	if (!origin)
>> +		for_each_string_list_item(item, remotes)
>> +			if (skip_prefix(item->string, "refs/heads/", &shortname)
>> +			    && !strcmp(local, shortname)) {
>> +				warning(_("not setting branch '%s' as its own upstream."),
>> +					local);
>> +				return 0;
>> +			}
>
> Added comments make it easier to follow what is going on and more
> importantly why.  I very much like it ;-)

Agreed! We made a lot of 'why' decisions and I think the comments do a
great job of capturing that.

>> @@ -87,29 +117,40 @@ int install_branch_config(int flag, const char *local, const char *origin, const
>>  	strbuf_release(&key);
>>  
>>  	if (flag & BRANCH_CONFIG_VERBOSE) {
>> +		struct strbuf tmp_ref_name = STRBUF_INIT;
>> +		struct string_list friendly_ref_names = STRING_LIST_INIT_DUP;
>> +
>> +		for_each_string_list_item(item, remotes) {
>> +			shortname = item->string;
>> +			skip_prefix(shortname, "refs/heads/", &shortname);
>> +			if (origin) {
>> +				strbuf_addf(&tmp_ref_name, "%s/%s",
>> +					    origin, shortname);
>> +				string_list_append_nodup(
>> +					&friendly_ref_names,
>> +					strbuf_detach(&tmp_ref_name, NULL));
>> +			} else {
>> +				string_list_append(
>> +					&friendly_ref_names, shortname);
>> +			}
>> +		}
>> +
>> +		if (remotes->nr == 1) {
>> +			/*
>> +			 * Rebasing is only allowed in the case of a single
>> +			 * upstream branch.
>> +			 */
>
> There does not seem to be any code to forbid "rebasing" when
> remotes->nr != 1, though.  Did I miss a call to die() earlier?

The die() call happens in install_branch_config_multiple_remotes(),
where it belongs.

I think someone who reads this comment will eventually track down the
die() call, but it does look a little out of place. Purely as a matter
of personal taste, I would have expected this comment to be in the
'else' clause, and it might read something like:

  install_branch_config_multiple_remotes() does not allow rebasing with
  multiple upstream branches.

but that's just a suggestion :) This patch looks fine to me.

>
>> +			printf_ln(rebasing ?
>> +				_("branch '%s' set up to track '%s' by rebasing.") :
>> +				_("branch '%s' set up to track '%s'."),
>> +				local, friendly_ref_names.items[0].string);
>>  		} else {
>> +			printf_ln(_("branch '%s' set up to track:"), local);
>> +			for_each_string_list_item(item, &friendly_ref_names)
>> +				printf_ln("  %s", item->string);
>
> In other words, I would have expected something in this else clause.
>
>>  		}
>
> Thanks.



[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