* [PATCH v2 0/2] Check for lock failures early @ 2014-04-16 18:56 Ronnie Sahlberg 2014-04-16 18:56 ` [PATCH v2 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg 2014-04-16 18:56 ` [PATCH v2 2/2] commit.c: check for lock error and return early Ronnie Sahlberg 0 siblings, 2 replies; 6+ messages in thread From: Ronnie Sahlberg @ 2014-04-16 18:56 UTC (permalink / raw) To: git; +Cc: mhagger, Ronnie Sahlberg Callers outside of refs.c use either lock_ref_sha1() or lock_any_ref_for_update() to lock a ref during an update. Two of these places we do not immediately check the lock for failure making reading the code harder. One place we do some unrelated string manipulation fucntions before we check for failure and the other place we rely on that write_ref_sha1() will check the lock for failure and return an error. These two patches updates these two places so that we immediately check the lock for failure and act on it. It does not change any functionality or logic but makes the code easier to read by being more consistent. Version 2: * Simplify the return on error case in sequencer.c. Ronnie Sahlberg (2): sequencer.c: check for lock failure and bail early in fast_forward_to commit.c: check for lock error and return early builtin/commit.c | 8 ++++---- sequencer.c | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) -- 1.9.1.504.g5a62d94 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to 2014-04-16 18:56 [PATCH v2 0/2] Check for lock failures early Ronnie Sahlberg @ 2014-04-16 18:56 ` Ronnie Sahlberg 2014-04-16 22:03 ` Michael Haggerty 2014-04-16 18:56 ` [PATCH v2 2/2] commit.c: check for lock error and return early Ronnie Sahlberg 1 sibling, 1 reply; 6+ messages in thread From: Ronnie Sahlberg @ 2014-04-16 18:56 UTC (permalink / raw) To: git; +Cc: mhagger, Ronnie Sahlberg Change fast_forward_to() to check if locking the ref failed, print a nice error message and bail out early. The old code did not check if ref_lock was NULL and relied on the fact that the write_ref_sha1() would safely detect this condition and set the return variable ret to indicate an error. While that is safe, it makes the code harder to read for two reasons: * Inconsistency. Almost all other places we do check the lock for NULL explicitely, so the naive reader is confused "why don't we check here". * And relying on write_ref_sha1() to detect and return an error for when a previous lock_any_ref_for_update() feels obfuscated. This change should not change any functionality or logic aside from adding an extra error message when this condition is triggered. (write_ref_sha1() returns an error silently for this condition) Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> --- sequencer.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sequencer.c b/sequencer.c index bde5f04..0a80c58 100644 --- a/sequencer.c +++ b/sequencer.c @@ -281,8 +281,12 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from, exit(1); /* the callee should have complained already */ ref_lock = lock_any_ref_for_update("HEAD", unborn ? null_sha1 : from, 0, NULL); + if (!ref_lock) + return error(_("Failed to lock HEAD during fast_forward_to")); + strbuf_addf(&sb, "%s: fast-forward", action_name(opts)); ret = write_ref_sha1(ref_lock, to, sb.buf); + strbuf_release(&sb); return ret; } -- 1.9.1.504.g5a62d94 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to 2014-04-16 18:56 ` [PATCH v2 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg @ 2014-04-16 22:03 ` Michael Haggerty 0 siblings, 0 replies; 6+ messages in thread From: Michael Haggerty @ 2014-04-16 22:03 UTC (permalink / raw) To: Ronnie Sahlberg, git On 04/16/2014 08:56 PM, Ronnie Sahlberg wrote: > Change fast_forward_to() to check if locking the ref failed, print a nice > error message and bail out early. > The old code did not check if ref_lock was NULL and relied on the fact > that the write_ref_sha1() would safely detect this condition and set the s/the write_ref_sha1()/write_ref_sha1()/ > return variable ret to indicate an error. > While that is safe, it makes the code harder to read for two reasons: > * Inconsistency. Almost all other places we do check the lock for NULL > explicitely, so the naive reader is confused "why don't we check here". s/explicitely/explicitly/ s/here"/here?"/ > * And relying on write_ref_sha1() to detect and return an error for when > a previous lock_any_ref_for_update() feels obfuscated. s/feels/failed feels/ maybe? > > This change should not change any functionality or logic > aside from adding an extra error message when this condition is triggered. > (write_ref_sha1() returns an error silently for this condition) You need a period inside the parentheses. > > Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> > --- > sequencer.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/sequencer.c b/sequencer.c > index bde5f04..0a80c58 100644 > --- a/sequencer.c > +++ b/sequencer.c > @@ -281,8 +281,12 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from, > exit(1); /* the callee should have complained already */ > ref_lock = lock_any_ref_for_update("HEAD", unborn ? null_sha1 : from, > 0, NULL); > + if (!ref_lock) > + return error(_("Failed to lock HEAD during fast_forward_to")); This error message can be emitted to the user in the normal course of things (i.e., it is not a bug). So the message should make sense to the user. Is "fast_forward_to" a user-facing term that the user will understand? I suspect that you took it from the name of the function, which is *not* meaningful to a user. But unfortunately I'm not familiar enough with the sequencer to be able to suggest a better error message. > + > strbuf_addf(&sb, "%s: fast-forward", action_name(opts)); > ret = write_ref_sha1(ref_lock, to, sb.buf); > + > strbuf_release(&sb); > return ret; > } > Michael -- Michael Haggerty mhagger@alum.mit.edu http://softwareswirl.blogspot.com/ ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] commit.c: check for lock error and return early 2014-04-16 18:56 [PATCH v2 0/2] Check for lock failures early Ronnie Sahlberg 2014-04-16 18:56 ` [PATCH v2 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg @ 2014-04-16 18:56 ` Ronnie Sahlberg 2014-04-16 22:06 ` Michael Haggerty 1 sibling, 1 reply; 6+ messages in thread From: Ronnie Sahlberg @ 2014-04-16 18:56 UTC (permalink / raw) To: git; +Cc: mhagger, Ronnie Sahlberg Move the check for the lock failure to happen immediately after lock_any_ref_for_update(). Previously the lock and the check-if-lock-failed was separated by a handful of string manipulation statements. Moving the check to occur immediately after the failed lock makes the code slightly easier to read and makes it follow the pattern of try-to-take-a-lock() if (check-if-lock-failed){ error } --- builtin/commit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/builtin/commit.c b/builtin/commit.c index d9550c5..c6320f1 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1672,6 +1672,10 @@ int cmd_commit(int argc, const char **argv, const char *prefix) ? NULL : current_head->object.sha1, 0, NULL); + if (!ref_lock) { + rollback_index_files(); + die(_("cannot lock HEAD ref")); + } nl = strchr(sb.buf, '\n'); if (nl) @@ -1681,10 +1685,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix) strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg)); strbuf_insert(&sb, strlen(reflog_msg), ": ", 2); - if (!ref_lock) { - rollback_index_files(); - die(_("cannot lock HEAD ref")); - } if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) { rollback_index_files(); die(_("cannot update HEAD ref")); -- 1.9.1.504.g5a62d94 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] commit.c: check for lock error and return early 2014-04-16 18:56 ` [PATCH v2 2/2] commit.c: check for lock error and return early Ronnie Sahlberg @ 2014-04-16 22:06 ` Michael Haggerty 2014-04-17 21:09 ` Junio C Hamano 0 siblings, 1 reply; 6+ messages in thread From: Michael Haggerty @ 2014-04-16 22:06 UTC (permalink / raw) To: Ronnie Sahlberg, git On 04/16/2014 08:56 PM, Ronnie Sahlberg wrote: > Move the check for the lock failure to happen immediately after > lock_any_ref_for_update(). > Previously the lock and the check-if-lock-failed was separated by a handful > of string manipulation statements. Please flow sentences together into paragraphs for easier reading, rather than having an extremely ragged right-hand margin. The rest looks good. Michael > > Moving the check to occur immediately after the failed lock makes the > code slightly easier to read and makes it follow the pattern of > try-to-take-a-lock() > if (check-if-lock-failed){ > error > } > --- > builtin/commit.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/builtin/commit.c b/builtin/commit.c > index d9550c5..c6320f1 100644 > --- a/builtin/commit.c > +++ b/builtin/commit.c > @@ -1672,6 +1672,10 @@ int cmd_commit(int argc, const char **argv, const char *prefix) > ? NULL > : current_head->object.sha1, > 0, NULL); > + if (!ref_lock) { > + rollback_index_files(); > + die(_("cannot lock HEAD ref")); > + } > > nl = strchr(sb.buf, '\n'); > if (nl) > @@ -1681,10 +1685,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix) > strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg)); > strbuf_insert(&sb, strlen(reflog_msg), ": ", 2); > > - if (!ref_lock) { > - rollback_index_files(); > - die(_("cannot lock HEAD ref")); > - } > if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) { > rollback_index_files(); > die(_("cannot update HEAD ref")); > -- Michael Haggerty mhagger@alum.mit.edu http://softwareswirl.blogspot.com/ ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] commit.c: check for lock error and return early 2014-04-16 22:06 ` Michael Haggerty @ 2014-04-17 21:09 ` Junio C Hamano 0 siblings, 0 replies; 6+ messages in thread From: Junio C Hamano @ 2014-04-17 21:09 UTC (permalink / raw) To: Michael Haggerty; +Cc: Ronnie Sahlberg, git Michael Haggerty <mhagger@alum.mit.edu> writes: > On 04/16/2014 08:56 PM, Ronnie Sahlberg wrote: >> Move the check for the lock failure to happen immediately after >> lock_any_ref_for_update(). >> Previously the lock and the check-if-lock-failed was separated by a handful >> of string manipulation statements. > > Please flow sentences together into paragraphs for easier reading, > rather than having an extremely ragged right-hand margin. > > The rest looks good. Thanks, both. I tentatively queued with the suggested log message tweaks, and I think result reads better. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-04-17 21:09 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-04-16 18:56 [PATCH v2 0/2] Check for lock failures early Ronnie Sahlberg 2014-04-16 18:56 ` [PATCH v2 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg 2014-04-16 22:03 ` Michael Haggerty 2014-04-16 18:56 ` [PATCH v2 2/2] commit.c: check for lock error and return early Ronnie Sahlberg 2014-04-16 22:06 ` Michael Haggerty 2014-04-17 21:09 ` Junio C Hamano
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).