diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2019-03-21 16:47:08 +0100 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2019-03-21 16:47:14 +0100 |
commit | 5efcbaf7c3e475041de60670e4e1aec46b18334b (patch) | |
tree | e53da9ccb885e1fcabbc9fb89d571b51d2b16b62 | |
parent | c490373e00792dbca03d548d72a2fde77fb2cae6 (diff) | |
parent | c23ccd29b5269e68aa23cbbba30b1b2df521e81f (diff) | |
download | jgit-5efcbaf7c3e475041de60670e4e1aec46b18334b.tar.gz jgit-5efcbaf7c3e475041de60670e4e1aec46b18334b.zip |
Merge branch 'stable-5.3'
* stable-5.3:
Fix GC to delete empty fanout directories after repacking
Change-Id: I080ddb03c6143f0bfa24707a10a4d926676d32b1
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java | 17 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java | 7 |
2 files changed, 22 insertions, 2 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java index 44fb21dada..878dc860ce 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java @@ -47,6 +47,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.io.File; import java.util.Collections; import java.util.Date; @@ -113,8 +114,24 @@ public class GcPruneNonReferencedTest extends GcTestCase { fsTick(); gc.gc(); stats = gc.getStatistics(); + assertNoEmptyFanoutDirectories(); assertEquals(0, stats.numberOfLooseObjects); assertEquals(8, stats.numberOfPackedObjects); assertEquals(2, stats.numberOfPackFiles); } + + private void assertNoEmptyFanoutDirectories() { + File[] fanout = repo.getObjectsDirectory().listFiles(); + for (File f : fanout) { + if (f.isDirectory()) { + String[] entries = f.list(); + if (entries == null || entries.length == 0) { + assertFalse( + "Found empty fanout directory " + + f.getAbsolutePath() + " after pruning", + f.getName().length() == 2); + } + } + } + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java index 76ef1cf4d5..a791ac78e6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java @@ -548,9 +548,12 @@ public class GC { pm.update(1); if (d.length() != 2) continue; - File[] entries = new File(objects, d).listFiles(); - if (entries == null) + File dir = new File(objects, d); + File[] entries = dir.listFiles(); + if (entries == null || entries.length == 0) { + FileUtils.delete(dir, FileUtils.IGNORE_ERRORS); continue; + } for (File f : entries) { checkCancelled(); String fName = f.getName(); |