1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.internal.storage.file;
45
46 import static org.junit.Assert.assertFalse;
47 import static org.junit.Assert.assertTrue;
48
49 import java.io.IOException;
50 import java.nio.file.Files;
51 import java.nio.file.Path;
52 import java.nio.file.Paths;
53 import java.nio.file.attribute.FileTime;
54 import java.time.Instant;
55
56 import org.junit.Before;
57 import org.junit.Test;
58
59 public class GcDeleteEmptyRefsFoldersTest extends GcTestCase {
60 private static final String REF_FOLDER_01 = "A/B/01";
61 private static final String REF_FOLDER_02 = "C/D/02";
62
63 private Path refsDir;
64 private Path heads;
65
66 @Override
67 @Before
68 public void setUp() throws Exception {
69 super.setUp();
70 refsDir = Paths.get(repo.getDirectory().getAbsolutePath())
71 .resolve("refs");
72 heads = refsDir.resolve("heads");
73 }
74
75 @Test
76 public void emptyRefFoldersAreDeleted() throws Exception {
77 FileTime fileTime = FileTime.from(Instant.now().minusSeconds(31));
78 Path refDir01 = Files.createDirectories(heads.resolve(REF_FOLDER_01));
79 Path refDir02 = Files.createDirectories(heads.resolve(REF_FOLDER_02));
80 setLastModifiedTime(fileTime, heads, REF_FOLDER_01);
81 setLastModifiedTime(fileTime, heads, REF_FOLDER_02);
82 assertTrue(refDir01.toFile().exists());
83 assertTrue(refDir02.toFile().exists());
84 gc.gc();
85
86 assertFalse(refDir01.toFile().exists());
87 assertFalse(refDir01.getParent().toFile().exists());
88 assertFalse(refDir01.getParent().getParent().toFile().exists());
89 assertFalse(refDir02.toFile().exists());
90 assertFalse(refDir02.getParent().toFile().exists());
91 assertFalse(refDir02.getParent().getParent().toFile().exists());
92 }
93
94 @Test
95 public void emptyRefFoldersSkipFiles() throws Exception {
96 FileTime fileTime = FileTime.from(Instant.now().minusSeconds(31));
97 Path refFile = Files.createFile(refsDir.resolve(".DS_Store"));
98 Path refDir01 = Files.createDirectories(heads.resolve(REF_FOLDER_01));
99 Path refDir02 = Files.createDirectories(heads.resolve(REF_FOLDER_02));
100 setLastModifiedTime(fileTime, heads, REF_FOLDER_01);
101 setLastModifiedTime(fileTime, heads, REF_FOLDER_02);
102 assertTrue(refDir01.toFile().exists());
103 assertTrue(refDir02.toFile().exists());
104 gc.gc();
105 assertTrue(Files.exists(refFile));
106 }
107
108 private void setLastModifiedTime(FileTime fileTime, Path path, String folder) throws IOException {
109 long numParents = folder.chars().filter(c -> c == '/').count();
110 Path folderPath = path.resolve(folder);
111 for(int folderLevel = 0; folderLevel <= numParents; folderLevel ++ ) {
112 Files.setLastModifiedTime(folderPath, fileTime);
113 folderPath = folderPath.getParent();
114 }
115 }
116
117 @Test
118 public void emptyRefFoldersAreKeptIfTheyAreTooRecent()
119 throws Exception {
120 Path refDir01 = Files.createDirectories(heads.resolve(REF_FOLDER_01));
121 Path refDir02 = Files.createDirectories(heads.resolve(REF_FOLDER_02));
122 assertTrue(refDir01.toFile().exists());
123 assertTrue(refDir02.toFile().exists());
124 gc.gc();
125
126 assertTrue(refDir01.toFile().exists());
127 assertTrue(refDir02.toFile().exists());
128 }
129
130 @Test
131 public void nonEmptyRefsFoldersAreKept() throws Exception {
132 Path refDir01 = Files.createDirectories(heads.resolve(REF_FOLDER_01));
133 Path refDir02 = Files.createDirectories(heads.resolve(REF_FOLDER_02));
134 Path ref01 = Files.createFile(refDir01.resolve("ref01"));
135 Path ref02 = Files.createFile(refDir01.resolve("ref02"));
136 assertTrue(refDir01.toFile().exists());
137 assertTrue(refDir02.toFile().exists());
138 assertTrue(ref01.toFile().exists());
139 assertTrue(ref02.toFile().exists());
140 gc.gc();
141 assertTrue(refDir01.toFile().exists());
142 assertTrue(refDir02.toFile().exists());
143 assertTrue(ref01.toFile().exists());
144 assertTrue(ref02.toFile().exists());
145 }
146 }