aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Casey <casey@nrlssc.navy.mil>2008-02-22 12:47:08 -0600
committerJunio C Hamano <gitster@pobox.com>2008-02-22 22:52:06 -0800
commit4cd883d724ec36a120263d47058e65c6d1de642f (patch)
tree9f163e98fc09d651109323245c71d54a3d403b5f
parent22c430ad8468133fa5ed46d8407d7f4cde2c4a0e (diff)
downloadgit-4cd883d724ec36a120263d47058e65c6d1de642f.tar.gz
git-4cd883d724ec36a120263d47058e65c6d1de642f.tar.xz
builtin-reflog.c: don't install new reflog on write failure
When expiring reflog entries, a new temporary log is written which contains only the entries to retain. After it is written, it is renamed to replace the existing reflog. Currently, we check that writing of the new log is successful and print a message on failure, but the original reflog is still replaced with the new reflog even on failure. This patch causes the original reflog to be retained if we fail when writing the new reflog. Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-reflog.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/builtin-reflog.c b/builtin-reflog.c
index 4836ec951..ab53c8cb7 100644
--- a/builtin-reflog.c
+++ b/builtin-reflog.c
@@ -276,10 +276,11 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
for_each_reflog_ent(ref, expire_reflog_ent, &cb);
finish:
if (cb.newlog) {
- if (fclose(cb.newlog))
+ if (fclose(cb.newlog)) {
status |= error("%s: %s", strerror(errno),
newlog_path);
- if (rename(newlog_path, log_file)) {
+ unlink(newlog_path);
+ } else if (rename(newlog_path, log_file)) {
status |= error("cannot rename %s to %s",
newlog_path, log_file);
unlink(newlog_path);