Re: [PATCH v8 23/44] fetch.c: change s_update_ref to use a ref transaction
- From
Ronnie Sahlberg <sahlberg@google.com>
- Date
- May 16, 2014, 22:22 UTC
- Message-ID
- <CAL=YDW=0DA_pxrD75n-MN1N5QyEJV36w5HkvoBUC04gZyaxNUw@mail.gmail.com>
- In-Reply-To
- <20140516191231.GE12314@google.com>
On Fri, May 16, 2014 at 12:12 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 23 quoted lines
> (+cc: peff for STORE_REF_ERROR_DF_CONFLICT expertise)
> Ronnie Sahlberg wrote:
>
>> --- a/builtin/fetch.c
>> +++ b/builtin/fetch.c
>> @@ -375,7 +375,7 @@ static int s_update_ref(const char *action,
> [...]
>> + transaction = ref_transaction_begin();
>> + if (!transaction ||
>> + ref_transaction_update(transaction, ref->name, ref->new_sha1,
>> + ref->old_sha1, 0, check_old) ||
>> + ref_transaction_commit(transaction, msg, NULL)) {
>> + ref_transaction_rollback(transaction);
>> return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
>> STORE_REF_ERROR_OTHER;
>> + }
>
> I'd rather not rely on errno here (see the previous patch for why).
> Is there some other way to distinguish the case where a ref couldn't
> be created because there was a prefix of that ref in the way?
>
> For example, maybe ref_transaction_commit could return a different
> negative integer in this case.I have changed it to make transaction_commit will return a special error if there is a name conflict and fetch.c now uses that instead of looking at errno to decide if to print the "try pruning" message.
> > Thanks, > Jonathan