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.assertEquals;
47 import static org.junit.Assert.assertFalse;
48 import static org.junit.Assert.assertTrue;
49
50 import java.io.File;
51 import java.util.Collections;
52 import java.util.Date;
53
54 import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
55 import org.eclipse.jgit.lib.ObjectId;
56 import org.eclipse.jgit.revwalk.RevBlob;
57 import org.eclipse.jgit.revwalk.RevCommit;
58 import org.eclipse.jgit.revwalk.RevTree;
59 import org.junit.Test;
60
61 public class GcPruneNonReferencedTest extends GcTestCase {
62 @Test
63 public void nonReferencedNonExpiredObject_notPruned() throws Exception {
64 RevBlob a = tr.blob("a");
65 gc.setExpire(new Date(lastModified(a)));
66 gc.prune(Collections.<ObjectId> emptySet());
67 assertTrue(repo.getObjectDatabase().has(a));
68 }
69
70 @Test
71 public void nonReferencedExpiredObject_pruned() throws Exception {
72 RevBlob a = tr.blob("a");
73 gc.setExpireAgeMillis(0);
74 fsTick();
75 gc.prune(Collections.<ObjectId> emptySet());
76 assertFalse(repo.getObjectDatabase().has(a));
77 }
78
79 @Test
80 public void nonReferencedExpiredObjectTree_pruned() throws Exception {
81 RevBlob a = tr.blob("a");
82 RevTree t = tr.tree(tr.file("a", a));
83 gc.setExpireAgeMillis(0);
84 fsTick();
85 gc.prune(Collections.<ObjectId> emptySet());
86 assertFalse(repo.getObjectDatabase().has(t));
87 assertFalse(repo.getObjectDatabase().has(a));
88 }
89
90 @Test
91 public void nonReferencedObjects_onlyExpiredPruned() throws Exception {
92 RevBlob a = tr.blob("a");
93 gc.setExpire(new Date(lastModified(a) + 1));
94
95 fsTick();
96 RevBlob b = tr.blob("b");
97
98 gc.prune(Collections.<ObjectId> emptySet());
99 assertFalse(repo.getObjectDatabase().has(a));
100 assertTrue(repo.getObjectDatabase().has(b));
101 }
102
103 @Test
104 public void testPackCommitsAndLooseOneWithPruneNow() throws Exception {
105 BranchBuilder bb = tr.branch("refs/heads/master");
106 RevCommit first = bb.commit().add("A", "A").add("B", "B").create();
107 bb.commit().add("A", "A2").add("B", "B2").create();
108 tr.update("refs/heads/master", first);
109
110 stats = gc.getStatistics();
111 assertEquals(8, stats.numberOfLooseObjects);
112 assertEquals(0, stats.numberOfPackedObjects);
113 gc.setExpireAgeMillis(0);
114 fsTick();
115 gc.gc();
116 stats = gc.getStatistics();
117 assertNoEmptyFanoutDirectories();
118 assertEquals(0, stats.numberOfLooseObjects);
119 assertEquals(8, stats.numberOfPackedObjects);
120 assertEquals(2, stats.numberOfPackFiles);
121 }
122
123 private void assertNoEmptyFanoutDirectories() {
124 File[] fanout = repo.getObjectsDirectory().listFiles();
125 for (File f : fanout) {
126 if (f.isDirectory()) {
127 String[] entries = f.list();
128 if (entries == null || entries.length == 0) {
129 assertFalse(
130 "Found empty fanout directory "
131 + f.getAbsolutePath() + " after pruning",
132 f.getName().length() == 2);
133 }
134 }
135 }
136 }
137 }