Fix GC.deleteEmptyRefsFolders

This method tried to iterate spurious files which may exist in the
.git/refs folder, e.g. on Mac a .DS_Store may have been created there by
inspecting the folder using the finder application. This led to a
NotDirectoryException when deleteEmptyRefsFolders tried to create an
iterator for such a file entry. Skip files contained in the refs folder
to ensure the method only tries to iterate contained folders but not
files.

Change-Id: I5f31e733072a35db1e93908a9c69a8891ae5c206
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
Matthias Sohn 2019-01-27 02:22:34 +01:00 committed by David Pursehouse
parent e7b4d108e1
commit 8cad84ccfb
2 changed files with 16 additions and 1 deletions

View File

@ -91,6 +91,20 @@ public void emptyRefFoldersAreDeleted() throws Exception {
assertFalse(refDir02.getParent().getParent().toFile().exists());
}
@Test
public void emptyRefFoldersSkipFiles() throws Exception {
FileTime fileTime = FileTime.from(Instant.now().minusSeconds(31));
Path refFile = Files.createFile(refsDir.resolve(".DS_Store"));
Path refDir01 = Files.createDirectories(heads.resolve(REF_FOLDER_01));
Path refDir02 = Files.createDirectories(heads.resolve(REF_FOLDER_02));
setLastModifiedTime(fileTime, heads, REF_FOLDER_01);
setLastModifiedTime(fileTime, heads, REF_FOLDER_02);
assertTrue(refDir01.toFile().exists());
assertTrue(refDir02.toFile().exists());
gc.gc();
assertTrue(Files.exists(refFile));
}
private void setLastModifiedTime(FileTime fileTime, Path path, String folder) throws IOException {
long numParents = folder.chars().filter(c -> c == '/').count();
Path folderPath = path.resolve(folder);

View File

@ -910,7 +910,8 @@ private void deleteEmptyRefsFolders() throws IOException {
// Avoid deleting a folder that was created after the threshold so that concurrent
// operations trying to create a reference are not impacted
Instant threshold = Instant.now().minus(30, ChronoUnit.SECONDS);
try (Stream<Path> entries = Files.list(refs)) {
try (Stream<Path> entries = Files.list(refs)
.filter(Files::isDirectory)) {
Iterator<Path> iterator = entries.iterator();
while (iterator.hasNext()) {
try (Stream<Path> s = Files.list(iterator.next())) {