When deleting a reference, it might be that another process already
holds the lock on the loose reference file and/or the packed-refs
file.  In those cases, there is no alternative but for the delete to
fail.  Verify that in such cases the reference values are left
unchanged.

But in fact, when the packed-refs file lock cannot be acquired, the
loose reference file is deleted anyway, potentially leaving the
reference with a changed value (its packed value, which might even
point at an object that has been garbage collected).  Thus one of the
new tests is marked test_expect_failure.

Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
---
 t/t3204-branch-locks.sh | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100755 t/t3204-branch-locks.sh

diff --git a/t/t3204-branch-locks.sh b/t/t3204-branch-locks.sh
new file mode 100755
index 0000000..cc4e2c1
--- /dev/null
+++ b/t/t3204-branch-locks.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+test_description='git branch lock tests'
+
+. ./test-lib.sh
+
+test_expect_success 'prepare a trivial repository' '
+       git commit --allow-empty -m "Initial" &&
+       git commit --allow-empty -m "First"
+'
+
+test_expect_success 'delete a ref while loose ref file is locked' '
+       git branch b1 master &&
+       git for-each-ref >expected1 &&
+       # Simulate another process holding the loose file lock:
+       : >.git/refs/heads/b1.lock &&
+       test_must_fail git branch -D b1 &&
+       rm .git/refs/heads/b1.lock &&
+       # Delete failed; reference values should be unchanged:
+       git for-each-ref >actual1 &&
+       test_cmp expected1 actual1
+'
+
+test_expect_failure 'delete a ref while packed-refs file is locked' '
+       git branch b2 master &&
+       # Pack current value of b2:
+       git pack-refs --all &&
+       # Overwrite packed value with a loose value:
+       git branch -f b2 master^ &&
+       git for-each-ref >expected2 &&
+       # Simulate another process holding the packed-refs file lock:
+       : >.git/packed-refs.lock &&
+       test_must_fail git branch -D b2 &&
+       rm .git/packed-refs.lock &&
+       # Delete failed; reference values should be unchanged:
+       git for-each-ref >actual2 &&
+       test_cmp expected2 actual2
+'
+
+test_done
-- 
1.9.0

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to