Re: [PATCH v20 40/48] refs.c: add an err argument to delete_ref_loose

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

 



On Tue, Jul 8, 2014 at 7:19 AM, Michael Haggerty <mhagger@xxxxxxxxxxxx> wrote:
> On 06/20/2014 04:43 PM, Ronnie Sahlberg wrote:
>> Add an err argument to delete_loose_ref so that we can pass a descriptive
>> error string back to the caller. Pass the err argument from transaction
>> commit to this function so that transaction users will have a nice error
>> string if the transaction failed due to delete_loose_ref.
>>
>> Add a new function unlink_or_err that we can call from delete_ref_loose. This
>> function is similar to unlink_or_warn except that we can pass it an err
>> argument. If err is non-NULL the function will populate err instead of
>> printing a warning().
>>
>> Simplify warn_if_unremovable.
>
> The change to warn_if_unremovable() is orthogonal to the rest of the
> commit and should be a separate commit.

Done.
I split it into three patches.
One patch for the warn_if_removable change
another patch to add unlink_or_msg to wrapper.c
and a final patch to change delete_loose_ref.

>
>> Signed-off-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx>
>> ---
>>  refs.c    | 33 ++++++++++++++++++++++++++++-----
>>  wrapper.c | 14 ++++++--------
>>  2 files changed, 34 insertions(+), 13 deletions(-)
>>
>> diff --git a/refs.c b/refs.c
>> index 92a06d4..c7d1f3e 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -2544,16 +2544,38 @@ int repack_without_refs(const char **refnames, int n, struct strbuf *err)
>>       return ret;
>>  }
>>
>> -static int delete_ref_loose(struct ref_lock *lock, int flag)
>> +static int add_err_if_unremovable(const char *op, const char *file,
>> +                               struct strbuf *e, int rc)
>
> This function is only used once.  Given also that its purpose is not
> that obvious from its signature, it seems to me that the code would be
> easier to read if it were inlined.
>
>> +{
>> +     int err = errno;
>> +     if (rc < 0 && errno != ENOENT) {
>> +             strbuf_addf(e, "unable to %s %s: %s",
>> +                         op, file, strerror(errno));
>> +             errno = err;
>> +             return -1;
>> +     }
>> +     return 0;
>> +}
>> +
>> +static int unlink_or_err(const char *file, struct strbuf *err)
>
> The name of this function is misleading; it sounds like it will try to
> unlink the file and if not possible call error().  Maybe a name like
> "unlink_or_report" would be less prejudicial.
>
> It might also make sense to move this function to wrapper.c and
> implement unlink_or_warn() in terms of it rather than vice versa.
>
>> +{
>> +     if (err)
>> +             return add_err_if_unremovable("unlink", file, err,
>> +                                           unlink(file));
>> +     else
>> +             return unlink_or_warn(file);
>> +}
>> +
>> +static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
>>  {
>>       if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
>>               /* loose */
>> -             int err, i = strlen(lock->lk->filename) - 5; /* .lock */
>> +             int res, i = strlen(lock->lk->filename) - 5; /* .lock */
>>
>>               lock->lk->filename[i] = 0;
>> -             err = unlink_or_warn(lock->lk->filename);
>> +             res = unlink_or_err(lock->lk->filename, err);
>>               lock->lk->filename[i] = '.';
>> -             if (err && errno != ENOENT)
>> +             if (res)
>>                       return 1;
>>       }
>>       return 0;
>> @@ -3603,7 +3625,8 @@ int ref_transaction_commit(struct ref_transaction *transaction,
>>               struct ref_update *update = updates[i];
>>
>>               if (update->lock) {
>> -                     ret |= delete_ref_loose(update->lock, update->type);
>> +                     ret |= delete_ref_loose(update->lock, update->type,
>> +                                             err);
>>                       if (!(update->flags & REF_ISPRUNING))
>>                               delnames[delnum++] = update->lock->ref_name;
>>               }
>> diff --git a/wrapper.c b/wrapper.c
>> index bc1bfb8..740e193 100644
>> --- a/wrapper.c
>> +++ b/wrapper.c
>> @@ -429,14 +429,12 @@ int xmkstemp_mode(char *template, int mode)
>>
>>  static int warn_if_unremovable(const char *op, const char *file, int rc)
>>  {
>> -     if (rc < 0) {
>> -             int err = errno;
>> -             if (ENOENT != err) {
>> -                     warning("unable to %s %s: %s",
>> -                             op, file, strerror(errno));
>> -                     errno = err;
>> -             }
>> -     }
>> +     int err;
>> +     if (rc >= 0 || errno == ENOENT)
>> +             return rc;
>> +     err = errno;
>> +     warning("unable to %s %s: %s", op, file, strerror(errno));
>> +     errno = err;
>>       return rc;
>>  }
>>
>>
>
> Michael
>
> --
> Michael Haggerty
> mhagger@xxxxxxxxxxxx
>
--
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]