git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Check for lock failures early
@ 2014-04-15 23:46 Ronnie Sahlberg
  2014-04-15 23:46 ` [PATCH 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg
  2014-04-15 23:46 ` [PATCH 2/2] commit.c: check for lock error and return early Ronnie Sahlberg
  0 siblings, 2 replies; 4+ messages in thread
From: Ronnie Sahlberg @ 2014-04-15 23:46 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.


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      | 7 +++++++
 2 files changed, 11 insertions(+), 4 deletions(-)

-- 
1.9.1.503.ge4c3920.dirty

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to
  2014-04-15 23:46 [PATCH 0/2] Check for lock failures early Ronnie Sahlberg
@ 2014-04-15 23:46 ` Ronnie Sahlberg
  2014-04-16  1:37   ` Brandon Casey
  2014-04-15 23:46 ` [PATCH 2/2] commit.c: check for lock error and return early Ronnie Sahlberg
  1 sibling, 1 reply; 4+ messages in thread
From: Ronnie Sahlberg @ 2014-04-15 23:46 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 | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/sequencer.c b/sequencer.c
index bde5f04..6aa3b50 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -281,8 +281,15 @@ 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) {
+		ret = error(_("Failed to lock HEAD during fast_forward_to"));
+		goto leave;
+	}
+
 	strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
 	ret = write_ref_sha1(ref_lock, to, sb.buf);
+
+leave:
 	strbuf_release(&sb);
 	return ret;
 }
-- 
1.9.1.503.ge4c3920.dirty

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] commit.c: check for lock error and return early
  2014-04-15 23:46 [PATCH 0/2] Check for lock failures early Ronnie Sahlberg
  2014-04-15 23:46 ` [PATCH 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg
@ 2014-04-15 23:46 ` Ronnie Sahlberg
  1 sibling, 0 replies; 4+ messages in thread
From: Ronnie Sahlberg @ 2014-04-15 23:46 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
 }

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
---
 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.503.ge4c3920.dirty

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to
  2014-04-15 23:46 ` [PATCH 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg
@ 2014-04-16  1:37   ` Brandon Casey
  0 siblings, 0 replies; 4+ messages in thread
From: Brandon Casey @ 2014-04-16  1:37 UTC (permalink / raw)
  To: Ronnie Sahlberg; +Cc: git@vger.kernel.org, Michael Haggerty

On Tue, Apr 15, 2014 at 4:46 PM, Ronnie Sahlberg <sahlberg@google.com> wrote:

<snip well-worded commit message>

> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
> ---
>  sequencer.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/sequencer.c b/sequencer.c
> index bde5f04..6aa3b50 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -281,8 +281,15 @@ 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) {
> +               ret = error(_("Failed to lock HEAD during fast_forward_to"));
> +               goto leave;
> +       }
> +

Or just:

   if (!ref_lock)
       return error(_("Failed to lock HEAD ..."));

We don't need to strbuf_release() since the strbuf has not been
modified at this point.  We've only initialized with a static
initializer.

>         strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
>         ret = write_ref_sha1(ref_lock, to, sb.buf);
> +
> +leave:
>         strbuf_release(&sb);
>         return ret;
>  }
> --

-Brandon

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-04-16  1:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-15 23:46 [PATCH 0/2] Check for lock failures early Ronnie Sahlberg
2014-04-15 23:46 ` [PATCH 1/2] sequencer.c: check for lock failure and bail early in fast_forward_to Ronnie Sahlberg
2014-04-16  1:37   ` Brandon Casey
2014-04-15 23:46 ` [PATCH 2/2] commit.c: check for lock error and return early Ronnie Sahlberg

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).