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 package org.eclipse.jgit.revwalk;
44
45 import static org.junit.Assert.assertEquals;
46 import static org.junit.Assert.assertFalse;
47 import static org.junit.Assert.assertTrue;
48
49 import org.eclipse.jgit.internal.storage.file.FileRepository;
50 import org.eclipse.jgit.internal.storage.file.GC;
51 import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
52 import org.eclipse.jgit.junit.TestRepository;
53 import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
54 import org.eclipse.jgit.lib.NullProgressMonitor;
55 import org.eclipse.jgit.lib.ProgressMonitor;
56 import org.junit.Before;
57 import org.junit.Test;
58
59 public class BitmapCalculatorTest extends LocalDiskRepositoryTestCase {
60 TestRepository<FileRepository> repo;
61
62
63 @Override
64 @Before
65 public void setUp() throws Exception {
66 super.setUp();
67 FileRepository db = createWorkRepository();
68 repo = new TestRepository<>(db);
69 }
70
71 @Test
72 public void addOnlyCommits() throws Exception {
73 RevBlob abBlob = repo.blob("a_b_content");
74 RevCommit root = repo.commit().add("a/b", abBlob).create();
75 repo.update("refs/heads/master", root);
76
77
78 GC gc = new GC(repo.getRepository());
79 gc.setAuto(false);
80 gc.gc();
81
82
83 RevBlob acBlob = repo.blob("a_c_content");
84 RevCommit head = repo.commit().parent(root).add("a/c", acBlob).create();
85 repo.update("refs/heads/master", head);
86
87 BitmapCalculator bitmapWalker = new BitmapCalculator(repo.getRevWalk());
88 BitmapBuilder bitmap = bitmapWalker
89 .getBitmap(head, NullProgressMonitor.INSTANCE);
90
91 assertTrue(bitmap.contains(root.getId()));
92 assertTrue(bitmap.contains(root.getTree().getId()));
93 assertTrue(bitmap.contains(abBlob.getId()));
94
95
96 assertTrue(bitmap.contains(head.getId()));
97 assertFalse(bitmap.contains(head.getTree().getId()));
98 assertFalse(bitmap.contains(acBlob.getId()));
99 }
100
101 @Test
102 public void walkUntilBitmap() throws Exception {
103 RevCommit root = repo.commit().create();
104 repo.update("refs/heads/master", root);
105
106
107 GC gc = new GC(repo.getRepository());
108 gc.setAuto(false);
109 gc.gc();
110
111
112 RevCommit commit1 = repo.commit(root);
113 RevCommit commit2 = repo.commit(commit1);
114 repo.update("refs/heads/master", commit2);
115
116 CounterProgressMonitor monitor = new CounterProgressMonitor();
117 BitmapCalculator bitmapWalker = new BitmapCalculator(repo.getRevWalk());
118 BitmapBuilder bitmap = bitmapWalker.getBitmap(commit2, monitor);
119
120 assertTrue(bitmap.contains(root));
121 assertTrue(bitmap.contains(commit1));
122 assertTrue(bitmap.contains(commit2));
123 assertEquals(2, monitor.getUpdates());
124 }
125
126 @Test
127 public void noNeedToWalk() throws Exception {
128 RevCommit root = repo.commit().create();
129 RevCommit commit1 = repo.commit(root);
130 RevCommit commit2 = repo.commit(commit1);
131 repo.update("refs/heads/master", commit2);
132
133
134 GC gc = new GC(repo.getRepository());
135 gc.setAuto(false);
136 gc.gc();
137
138 CounterProgressMonitor monitor = new CounterProgressMonitor();
139 BitmapCalculator bitmapWalker = new BitmapCalculator(repo.getRevWalk());
140 BitmapBuilder bitmap = bitmapWalker.getBitmap(commit2, monitor);
141
142 assertTrue(bitmap.contains(root));
143 assertTrue(bitmap.contains(commit1));
144 assertTrue(bitmap.contains(commit2));
145 assertEquals(0, monitor.getUpdates());
146 }
147
148 private static class CounterProgressMonitor implements ProgressMonitor {
149
150 private int counter;
151
152 @Override
153 public void start(int totalTasks) {
154
155 }
156
157 @Override
158 public void beginTask(String title, int totalWork) {
159
160 }
161
162 @Override
163 public void update(int completed) {
164 counter += 1;
165 }
166
167 @Override
168 public void endTask() {
169
170 }
171
172 @Override
173 public boolean isCancelled() {
174 return false;
175 }
176
177 int getUpdates() {
178 return counter;
179 }
180 }
181 }