summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Johannes Schindelin <johannes.schindelin@gmx.de>2016-09-09 16:37:47 +0200
committerLibravatar Junio C Hamano <gitster@pobox.com>2016-09-09 11:24:52 -0700
commit311fd397f0e750333e0aaa8e45b9284a5227e353 (patch)
treec02123c1b04e1eb7b4f5bc11f7a6d9f4e9c16a73
parentsequencer: lib'ify create_seq_dir() (diff)
downloadtgif-311fd397f0e750333e0aaa8e45b9284a5227e353.tar.xz
sequencer: lib'ify save_head()
Instead of dying there, let the caller high up in the callchain notice the error and handle it (by dying, still). The only caller of save_head(), sequencer_pick_revisions() can already return errors, so its caller must be already prepared to handle error returns, and with this step, we make it notice an error return from this function. So this is a safe conversion to make save_head() callable from new callers that want it not to die, without changing the external behaviour of anything existing. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--sequencer.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sequencer.c b/sequencer.c
index eb9c473328..7a1561e6a0 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -852,18 +852,28 @@ static int create_seq_dir(void)
return 0;
}
-static void save_head(const char *head)
+static int save_head(const char *head)
{
static struct lock_file head_lock;
struct strbuf buf = STRBUF_INIT;
int fd;
- fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), LOCK_DIE_ON_ERROR);
+ fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
+ if (fd < 0) {
+ rollback_lock_file(&head_lock);
+ return error_errno(_("Could not lock HEAD"));
+ }
strbuf_addf(&buf, "%s\n", head);
- if (write_in_full(fd, buf.buf, buf.len) < 0)
- die_errno(_("Could not write to %s"), git_path_head_file());
- if (commit_lock_file(&head_lock) < 0)
- die(_("Error wrapping up %s."), git_path_head_file());
+ if (write_in_full(fd, buf.buf, buf.len) < 0) {
+ rollback_lock_file(&head_lock);
+ return error_errno(_("Could not write to %s"),
+ git_path_head_file());
+ }
+ if (commit_lock_file(&head_lock) < 0) {
+ rollback_lock_file(&head_lock);
+ return error(_("Error wrapping up %s."), git_path_head_file());
+ }
+ return 0;
}
static int reset_for_rollback(const unsigned char *sha1)
@@ -1127,7 +1137,8 @@ int sequencer_pick_revisions(struct replay_opts *opts)
return -1;
if (get_sha1("HEAD", sha1) && (opts->action == REPLAY_REVERT))
return error(_("Can't revert as initial commit"));
- save_head(sha1_to_hex(sha1));
+ if (save_head(sha1_to_hex(sha1)))
+ return -1;
save_opts(opts);
return pick_commits(todo_list, opts);
}