summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2016-05-05 14:09:41 +0200
committerMichael Haggerty <mhagger@alum.mit.edu>2016-05-05 16:37:04 +0200
commite167a5673e25b960dce118fb967d54da30b69def (patch)
treeb3c53b071f76ae1c3c50fd49b531a644b06572e9
parent5387c0d8839e366c44838c808ccc20eb7f9bd358 (diff)
downloadgit-e167a5673e25b960dce118fb967d54da30b69def.tar.gz
read_raw_ref(): don't get confused by an empty directory
Even if there is an empty directory where we look for the loose version of a reference, check for a packed reference before giving up. This fixes the failing test that was introduced two commits ago. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
-rw-r--r--refs/files-backend.c11
-rwxr-xr-xt/t1404-update-ref-df-conflicts.sh2
2 files changed, 11 insertions, 2 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index ad9cd86457..0cc116d67c 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -1477,7 +1477,16 @@ stat_ref:
/* Is it a directory? */
if (S_ISDIR(st.st_mode)) {
- errno = EISDIR;
+ /*
+ * Even though there is a directory where the loose
+ * ref is supposed to be, there could still be a
+ * packed ref:
+ */
+ if (resolve_missing_loose_ref(refname, sha1, flags)) {
+ errno = EISDIR;
+ goto out;
+ }
+ ret = 0;
goto out;
}
diff --git a/t/t1404-update-ref-df-conflicts.sh b/t/t1404-update-ref-df-conflicts.sh
index 16752a999f..6d869d1285 100755
--- a/t/t1404-update-ref-df-conflicts.sh
+++ b/t/t1404-update-ref-df-conflicts.sh
@@ -106,7 +106,7 @@ test_expect_success 'one new ref is a simple prefix of another' '
'
-test_expect_failure 'empty directory should not fool rev-parse' '
+test_expect_success 'empty directory should not fool rev-parse' '
prefix=refs/e-rev-parse &&
git update-ref $prefix/foo $C &&
git pack-refs --all &&