From: Michael Haggerty <mhagger@alum.mit.edu>
To: Ronnie Sahlberg <sahlberg@google.com>, git@vger.kernel.org
Subject: Re: [PATCH v10 04/44] refs.c: add an err argument to repack_without_refs
Date: Sat, 17 May 2014 14:40:01 +0200 [thread overview]
Message-ID: <537758A1.9080809@alum.mit.edu> (raw)
In-Reply-To: <1400261852-31303-5-git-send-email-sahlberg@google.com>
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 <sahlberg@google.com>
> ---
> 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.
> 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?
> + }
> 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
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
next prev parent reply other threads:[~2014-05-17 12:40 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-16 17:36 [PATCH v10 00/44] Use ref transactions for all ref updates Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 01/44] refs.c: constify the sha arguments for ref_transaction_create|delete|update Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 02/44] refs.c: allow passing NULL to ref_transaction_free Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 03/44] refs.c: add a strbuf argument to ref_transaction_commit for error logging Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 04/44] refs.c: add an err argument to repack_without_refs Ronnie Sahlberg
2014-05-17 12:40 ` Michael Haggerty [this message]
2014-05-27 19:21 ` Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 05/44] refs.c: make ref_update_reject_duplicates take a strbuf argument for errors Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 06/44] refs.c: add an err argument to delete_ref_loose Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 07/44] refs.c: make update_ref_write update a strbuf on failure Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 08/44] update-ref.c: log transaction error from the update_ref Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 09/44] refs.c: remove the onerr argument to ref_transaction_commit Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 10/44] refs.c: change ref_transaction_update() to do error checking and return status Ronnie Sahlberg
2014-05-16 17:36 ` [PATCH v10 11/44] refs.c: change ref_transaction_create " Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 12/44] refs.c: ref_transaction_delete to check for error " Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 13/44] tag.c: use ref transactions when doing updates Ronnie Sahlberg
2014-05-17 13:09 ` Michael Haggerty
2014-05-19 17:16 ` Ronnie Sahlberg
2014-05-19 18:03 ` Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 14/44] replace.c: use the ref transaction functions for updates Ronnie Sahlberg
2014-05-17 13:14 ` Michael Haggerty
2014-05-19 18:04 ` Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 15/44] commit.c: use ref transactions " Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 16/44] sequencer.c: use ref transactions for all ref updates Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 17/44] fast-import.c: change update_branch to use ref transactions Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 18/44] branch.c: use ref transaction for all ref updates Ronnie Sahlberg
2014-05-17 13:33 ` Michael Haggerty
2014-05-19 17:22 ` Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 19/44] refs.c: change update_ref to use a transaction Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 20/44] refs.c: free the transaction before returning when number of updates is 0 Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 21/44] refs.c: ref_transaction_commit should not free the transaction Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 22/44] fetch.c: clear errno before calling functions that might set it Ronnie Sahlberg
2014-05-17 14:56 ` Michael Haggerty
2014-05-27 19:14 ` Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 23/44] fetch.c: change s_update_ref to use a ref transaction Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 24/44] fetch.c: use a single ref transaction for all ref updates Ronnie Sahlberg
2014-05-17 15:05 ` Michael Haggerty
2014-05-17 15:17 ` Michael Haggerty
2014-05-16 17:37 ` [PATCH v10 25/44] receive-pack.c: use a reference transaction for updating the refs Ronnie Sahlberg
2014-05-17 15:35 ` Michael Haggerty
2014-05-19 19:02 ` Ronnie Sahlberg
2014-05-23 13:49 ` Michael Haggerty
2014-05-23 16:14 ` Ronnie Sahlberg
2014-05-23 21:02 ` Michael Haggerty
2014-05-27 19:30 ` Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 26/44] fast-import.c: use a ref transaction when dumping tags Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 27/44] walker.c: use ref transaction for ref updates Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 28/44] refs.c: make write_ref_sha1 static Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 29/44] refs.c: make lock_ref_sha1 static Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 30/44] refs.c: add transaction.status and track OPEN/CLOSED/ERROR Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 31/44] refs.c: remove the update_ref_lock function Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 32/44] refs.c: remove the update_ref_write function Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 33/44] refs.c: remove lock_ref_sha1 Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 34/44] refs.c: make prune_ref use a transaction to delete the ref Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 35/44] refs.c: make delete_ref use a transaction Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 36/44] refs.c: pass the ref log message to _create/delete/update instead of _commit Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 37/44] refs.c: pass NULL as *flags to read_ref_full Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 38/44] refs.c: pack all refs before we start to rename a ref Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 39/44] refs.c: move the check for valid refname to lock_ref_sha1_basic Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 40/44] refs.c: call lock_ref_sha1_basic directly from commit Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 41/44] refs.c: add a new flag for transaction delete for refs we know are packed only Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 42/44] refs.c: pass a skip list to name_conflict_fn Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 43/44] refs.c: make rename_ref use a transaction Ronnie Sahlberg
2014-05-16 17:37 ` [PATCH v10 44/44] refs.c: remove forward declaration of write_ref_sha1 Ronnie Sahlberg
2014-05-16 18:39 ` [PATCH v10 00/44] Use ref transactions for all ref updates Jonathan Nieder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=537758A1.9080809@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=sahlberg@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).