* [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