aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorMarco Miller <marco.miller@ericsson.com>2016-05-25 16:45:13 -0400
committerMarco Miller <marco.miller@ericsson.com>2016-06-10 08:49:53 -0400
commit734d5bb3c9566e7349a638b7a2ccc342d0842c61 (patch)
tree01a13c0f4cd7ad83ee3ff81d64675baf69de188f /org.eclipse.jgit.test
parent0900dc08f59de482b38862094936e80fca39df2a (diff)
downloadjgit-734d5bb3c9566e7349a638b7a2ccc342d0842c61.tar.gz
jgit-734d5bb3c9566e7349a638b7a2ccc342d0842c61.zip
RefDirectory: remove ref lock file for following ref dir removal
Before this fix, ref directory removal did not work. That was because the ref lock file was still in the leaf directory at deletion time. Hence no deep ref directories were ever deleted, which negatively impacted performance under large directory structure circumstances. This fix removes the ref lock file before attempting to delete the ref directory (which includes it). The other deep parent directories are therefore now successfully deleted in turn, since leaf's content (lock file) gets removed first. So, given a structure such as refs/any/directory[/**], this fix now deletes all empty directories up to -and including- 'directory'. The 'any' directory (e.g.) does not get deleted even if empty, as before. The ref lock file is still also removed in the calling block's finally clause, just in case, as before. Such double-unlock brought by this fix is harmless (a no-op). A new (private) RefDirectory#delete method is introduced to support this #pack-specific case; other RefDirectory#delete callers remain untouched. Change-Id: I47ba1eeb9bcf0cb93d2ed105d84fea2dac756a5a Signed-off-by: Marco Miller <marco.miller@ericsson.com>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java14
1 files changed, 14 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
index 48ea13b98a..ea8dfa2939 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPackRefsTest.java
@@ -45,11 +45,14 @@ package org.eclipse.jgit.internal.storage.file;
import static java.lang.Integer.valueOf;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CyclicBarrier;
@@ -81,6 +84,17 @@ public class GcPackRefsTest extends GcTestCase {
}
@Test
+ public void emptyRefDirectoryDeleted() throws Exception {
+ String ref = "dir/ref";
+ tr.branch(ref).commit().create();
+ String name = repo.findRef(ref).getName();
+ Path dir = repo.getDirectory().toPath().resolve(name).getParent();
+
+ gc.packRefs();
+ assertFalse(Files.exists(dir));
+ }
+
+ @Test
public void concurrentOnlyOneWritesPackedRefs() throws Exception {
RevBlob a = tr.blob("a");
tr.lightweightTag("t", a);