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

2014-07-16 Thread Ronnie Sahlberg
On Tue, Jul 8, 2014 at 7:19 AM, Michael Haggerty  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 
>> ---
>>  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
> mhag...@alum.mit.edu
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

2014-07-08 Thread Michael Haggerty
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.

> Signed-off-by: Ronnie Sahlberg 
> ---
>  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
mhag...@alum.mit.edu

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html