From 3b463c3f02f83ef0bce2d5daa193459418e5258f Mon Sep 17 00:00:00 2001
From: Junio C Hamano <junkio@cox.net>
Date: Thu, 19 Oct 2006 01:28:47 -0700
Subject: [PATCH] ref-log: fix D/F conflict coming from deleted refs.

After deleting a branch l/k, you should be able to create a
branch l.  Earlier we added remove_empty_directories() on the
ref creation side to remove leftover .git/refs/l directory but
we also need a matching code to remove .git/logs/refs/l
directory.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 refs.c               | 14 ++++++++++++--
 t/t3210-pack-refs.sh |  2 ++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/refs.c b/refs.c
index 3d100df85..ed2e3b16a 100644
--- a/refs.c
+++ b/refs.c
@@ -733,8 +733,18 @@ static int log_ref_write(struct ref_lock *lock,
 	if (logfd < 0) {
 		if (!(oflags & O_CREAT) && errno == ENOENT)
 			return 0;
-		return error("Unable to append to %s: %s",
-			lock->log_file, strerror(errno));
+
+		if ((oflags & O_CREAT) && errno == EISDIR) {
+			if (remove_empty_directories(lock->log_file)) {
+				return error("There are still logs under '%s'",
+					     lock->log_file);
+			}
+			logfd = open(lock->log_file, oflags, 0666);
+		}
+
+		if (logfd < 0)
+			return error("Unable to append to %s: %s",
+				     lock->log_file, strerror(errno));
 	}
 
 	committer = git_committer_info(1);
diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh
index a4fbfda46..b1e9f2eed 100755
--- a/t/t3210-pack-refs.sh
+++ b/t/t3210-pack-refs.sh
@@ -11,6 +11,8 @@ semantic is still the same.
 '
 . ./test-lib.sh
 
+echo '[core] logallrefupdates = true' >>.git/config
+
 test_expect_success \
     'prepare a trivial repository' \
     'echo Hello > A &&
-- 
2.26.2