On Sat, May 17, 2014 at 5:40 AM, Michael Haggerty <[email protected]> wrote:
> On 05/16/2014 07:36 PM, Ronnie Sahlberg wrote:
>> Update repack_without_refs to take an err argument and update it if there
>> is a failure. Pass the err variable from ref_transaction_commit to this
>> function so that callers can print a meaningful error message if _commit
>> fails due to a problem in repack_without_refs.
>>
>> Signed-off-by: Ronnie Sahlberg <[email protected]>
>> ---
>> cache.h | 2 ++
>> lockfile.c | 21 ++++++++++++---------
>> refs.c | 25 +++++++++++++++++++------
>> 3 files changed, 33 insertions(+), 15 deletions(-)
>>
>> diff --git a/cache.h b/cache.h
>> index 8c6cdc2..48548d6 100644
>> --- a/cache.h
>> +++ b/cache.h
>> @@ -559,6 +559,8 @@ struct lock_file {
>> #define LOCK_DIE_ON_ERROR 1
>> #define LOCK_NODEREF 2
>> extern int unable_to_lock_error(const char *path, int err);
>> +extern void unable_to_lock_strbuf(const char *path, int err,
>> + struct strbuf *buf);
>> extern NORETURN void unable_to_lock_index_die(const char *path, int err);
>> extern int hold_lock_file_for_update(struct lock_file *, const char *path,
>> int);
>> extern int hold_lock_file_for_append(struct lock_file *, const char *path,
>> int);
>> diff --git a/lockfile.c b/lockfile.c
>> index 8fbcb6a..9e04b43 100644
>> --- a/lockfile.c
>> +++ b/lockfile.c
>> @@ -157,33 +157,36 @@ static int lock_file(struct lock_file *lk, const char
>> *path, int flags)
>> return lk->fd;
>> }
>>
>> -static char *unable_to_lock_message(const char *path, int err)
>> +void unable_to_lock_strbuf(const char *path, int err, struct strbuf *buf)
>> {
>> - struct strbuf buf = STRBUF_INIT;
>>
>> if (err == EEXIST) {
>> - strbuf_addf(&buf, "Unable to create '%s.lock': %s.\n\n"
>> + strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
>> "If no other git process is currently running, this
>> probably means a\n"
>> "git process crashed in this repository earlier. Make sure
>> no other git\n"
>> "process is running and remove the file manually to
>> continue.",
>> absolute_path(path), strerror(err));
>> } else
>> - strbuf_addf(&buf, "Unable to create '%s.lock': %s",
>> + strbuf_addf(buf, "Unable to create '%s.lock': %s",
>> absolute_path(path), strerror(err));
>> - return strbuf_detach(&buf, NULL);
>> }
>>
>> int unable_to_lock_error(const char *path, int err)
>> {
>> - char *msg = unable_to_lock_message(path, err);
>> - error("%s", msg);
>> - free(msg);
>> + struct strbuf buf = STRBUF_INIT;
>> +
>> + unable_to_lock_strbuf(path, err, &buf);
>> + error("%s", buf.buf);
>> + strbuf_release(&buf);
>> return -1;
>> }
>>
>> NORETURN void unable_to_lock_index_die(const char *path, int err)
>> {
>> - die("%s", unable_to_lock_message(path, err));
>> + struct strbuf buf = STRBUF_INIT;
>> +
>> + unable_to_lock_strbuf(path, err, &buf);
>> + die("%s", buf.buf);
>> }
>>
>> int hold_lock_file_for_update(struct lock_file *lk, const char *path, int
>> flags)
>> diff --git a/refs.c b/refs.c
>> index 686b802..a470e51 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -2208,6 +2208,7 @@ int commit_packed_refs(void)
>> struct packed_ref_cache *packed_ref_cache =
>> get_packed_ref_cache(&ref_cache);
>> int error = 0;
>> + int save_errno;
>>
>> if (!packed_ref_cache->lock)
>> die("internal error: packed-refs not locked");
>> @@ -2217,10 +2218,13 @@ int commit_packed_refs(void)
>> do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
>> 0, write_packed_entry_fn,
>> &packed_ref_cache->lock->fd);
>> - if (commit_lock_file(packed_ref_cache->lock))
>> + if (commit_lock_file(packed_ref_cache->lock)) {
>> + save_errno = errno;
>> error = -1;
>> + }
>> packed_ref_cache->lock = NULL;
>> release_packed_ref_cache(packed_ref_cache);
>> + errno = save_errno;
>
> This code involving save_errno looks like a bug fix orthogonal to the
> rest of the patch. It should at least be mentioned in the commit
> message if not broken into a separate patch.
Text updated.
>
>> return error;
>> }
>>
>> @@ -2427,12 +2431,12 @@ static int curate_packed_ref_fn(struct ref_entry
>> *entry, void *cb_data)
>> return 0;
>> }
>>
>> -static int repack_without_refs(const char **refnames, int n)
>> +static int repack_without_refs(const char **refnames, int n, struct strbuf
>> *err)
>> {
>> struct ref_dir *packed;
>> struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
>> struct string_list_item *ref_to_delete;
>> - int i, removed = 0;
>> + int i, ret, removed = 0;
>>
>> /* Look for a packed ref */
>> for (i = 0; i < n; i++)
>> @@ -2444,6 +2448,11 @@ static int repack_without_refs(const char **refnames,
>> int n)
>> return 0; /* no refname exists in packed refs */
>>
>> if (lock_packed_refs(0)) {
>> + if (err) {
>> + unable_to_lock_strbuf(git_path("packed-refs"), errno,
>> + err);
>> + return 1;
>
> error() returns -1, but here you have changed the return value to 1. Is
> there a reason for the change?
Fixed.
>
>> + }
>> unable_to_lock_error(git_path("packed-refs"), errno);
>> return error("cannot delete '%s' from packed refs",
>> refnames[i]);
>> }
>> @@ -2470,12 +2479,16 @@ static int repack_without_refs(const char
>> **refnames, int n)
>> }
>>
>> /* Write what remains */
>> - return commit_packed_refs();
>> + ret = commit_packed_refs();
>> + if (ret && err)
>> + strbuf_addf(err, "unable to overwrite old ref-pack file: %s",
>> + strerror(errno));
>> + return ret;
>> }
>>
>> static int repack_without_ref(const char *refname)
>> {
>> - return repack_without_refs(&refname, 1);
>> + return repack_without_refs(&refname, 1, NULL);
>> }
>>
>> static int delete_ref_loose(struct ref_lock *lock, int flag)
>> @@ -3481,7 +3494,7 @@ int ref_transaction_commit(struct ref_transaction
>> *transaction,
>> }
>> }
>>
>> - ret |= repack_without_refs(delnames, delnum);
>> + ret |= repack_without_refs(delnames, delnum, err);
>> for (i = 0; i < delnum; i++)
>> unlink_or_warn(git_path("logs/%s", delnames[i]));
>> clear_loose_ref_cache(&ref_cache);
>>
>
>
> --
> Michael Haggerty
> [email protected]
> http://softwareswirl.blogspot.com/
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html