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
45
46 package org.eclipse.jgit.lib;
47
48 import static org.eclipse.jgit.junit.Assert.assertEquals;
49 import static org.junit.Assert.assertEquals;
50 import static org.junit.Assert.assertFalse;
51 import static org.junit.Assert.assertNotNull;
52 import static org.junit.Assert.assertNull;
53 import static org.junit.Assert.assertSame;
54 import static org.junit.Assert.assertTrue;
55 import static org.junit.Assert.fail;
56
57 import java.io.File;
58 import java.io.FileOutputStream;
59 import java.io.IOException;
60 import java.util.List;
61 import java.util.Map;
62 import java.util.TreeSet;
63
64 import org.eclipse.jgit.lib.Ref.Storage;
65 import org.eclipse.jgit.lib.RefUpdate.Result;
66 import org.eclipse.jgit.storage.file.FileBasedConfig;
67 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
68 import org.junit.Test;
69
70
71
72
73
74 public class RefTest extends SampleDataRepositoryTestCase {
75
76 private void writeSymref(String src, String dst) throws IOException {
77 RefUpdate u = db.updateRef(src);
78 switch (u.link(dst)) {
79 case NEW:
80 case FORCED:
81 case NO_CHANGE:
82 break;
83 default:
84 fail("link " + src + " to " + dst);
85 }
86 }
87
88 private void writeNewRef(String name, ObjectId value) throws IOException {
89 RefUpdate updateRef = db.updateRef(name);
90 updateRef.setNewObjectId(value);
91 assertEquals(RefUpdate.Result.NEW, updateRef.update());
92 }
93
94 @Test
95 public void testRemoteNames() throws Exception {
96 FileBasedConfig config = db.getConfig();
97 config.setBoolean(ConfigConstants.CONFIG_REMOTE_SECTION,
98 "origin", "dummy", true);
99 config.setBoolean(ConfigConstants.CONFIG_REMOTE_SECTION,
100 "ab/c", "dummy", true);
101 config.save();
102 assertEquals("[ab/c, origin]",
103 new TreeSet<>(db.getRemoteNames()).toString());
104
105
106 assertEquals("master",
107 db.shortenRemoteBranchName("refs/remotes/origin/master"));
108 assertEquals("origin", db.getRemoteName("refs/remotes/origin/master"));
109
110
111 assertEquals("masta/r",
112 db.shortenRemoteBranchName("refs/remotes/origin/masta/r"));
113 assertEquals("origin", db.getRemoteName("refs/remotes/origin/masta/r"));
114
115
116 assertEquals("xmaster",
117 db.shortenRemoteBranchName("refs/remotes/ab/c/xmaster"));
118 assertEquals("ab/c", db.getRemoteName("refs/remotes/ab/c/xmaster"));
119
120
121 assertEquals("xmasta/r",
122 db.shortenRemoteBranchName("refs/remotes/ab/c/xmasta/r"));
123 assertEquals("ab/c", db.getRemoteName("refs/remotes/ab/c/xmasta/r"));
124
125
126 assertNull(db.getRemoteName("refs/remotes/nosuchremote/x"));
127 assertNull(db.shortenRemoteBranchName("refs/remotes/nosuchremote/x"));
128
129
130 assertNull(db.getRemoteName("refs/remotes/abranch"));
131 assertNull(db.shortenRemoteBranchName("refs/remotes/abranch"));
132
133
134 assertNull(db.getRemoteName("refs/heads/abranch"));
135 assertNull(db.shortenRemoteBranchName("refs/heads/abranch"));
136 }
137
138 @Test
139 public void testReadAllIncludingSymrefs() throws Exception {
140 ObjectId masterId = db.resolve("refs/heads/master");
141 RefUpdate updateRef = db.updateRef("refs/remotes/origin/master");
142 updateRef.setNewObjectId(masterId);
143 updateRef.setForceUpdate(true);
144 updateRef.update();
145 writeSymref("refs/remotes/origin/HEAD",
146 "refs/remotes/origin/master");
147
148 ObjectId r = db.resolve("refs/remotes/origin/HEAD");
149 assertEquals(masterId, r);
150
151 Map<String, Ref> allRefs = db.getAllRefs();
152 Ref refHEAD = allRefs.get("refs/remotes/origin/HEAD");
153 assertNotNull(refHEAD);
154 assertEquals(masterId, refHEAD.getObjectId());
155 assertFalse(refHEAD.isPeeled());
156 assertNull(refHEAD.getPeeledObjectId());
157
158 Ref refmaster = allRefs.get("refs/remotes/origin/master");
159 assertEquals(masterId, refmaster.getObjectId());
160 assertFalse(refmaster.isPeeled());
161 assertNull(refmaster.getPeeledObjectId());
162 }
163
164 @Test
165 public void testReadSymRefToPacked() throws IOException {
166 writeSymref("HEAD", "refs/heads/b");
167 Ref ref = db.exactRef("HEAD");
168 assertEquals(Ref.Storage.LOOSE, ref.getStorage());
169 assertTrue("is symref", ref.isSymbolic());
170 ref = ref.getTarget();
171 assertEquals("refs/heads/b", ref.getName());
172 assertEquals(Ref.Storage.PACKED, ref.getStorage());
173 }
174
175 @Test
176 public void testReadSymRefToLoosePacked() throws IOException {
177 ObjectId pid = db.resolve("refs/heads/master^");
178 RefUpdate updateRef = db.updateRef("refs/heads/master");
179 updateRef.setNewObjectId(pid);
180 updateRef.setForceUpdate(true);
181 Result update = updateRef.update();
182 assertEquals(Result.FORCED, update);
183
184 writeSymref("HEAD", "refs/heads/master");
185 Ref ref = db.exactRef("HEAD");
186 assertEquals(Ref.Storage.LOOSE, ref.getStorage());
187 ref = ref.getTarget();
188 assertEquals("refs/heads/master", ref.getName());
189 assertEquals(Ref.Storage.LOOSE, ref.getStorage());
190 }
191
192 @Test
193 public void testReadLooseRef() throws IOException {
194 RefUpdate updateRef = db.updateRef("ref/heads/new");
195 updateRef.setNewObjectId(db.resolve("refs/heads/master"));
196 Result update = updateRef.update();
197 assertEquals(Result.NEW, update);
198 Ref ref = db.exactRef("ref/heads/new");
199 assertEquals(Storage.LOOSE, ref.getStorage());
200 }
201
202 @Test
203 public void testGetShortRef() throws IOException {
204 Ref ref = db.exactRef("refs/heads/master");
205 assertEquals("refs/heads/master", ref.getName());
206 assertEquals(db.resolve("refs/heads/master"), ref.getObjectId());
207 }
208
209 @Test
210 public void testGetShortExactRef() throws IOException {
211 assertNull(db.getRefDatabase().exactRef("master"));
212
213 Ref ref = db.getRefDatabase().exactRef("HEAD");
214 assertEquals("HEAD", ref.getName());
215 assertEquals("refs/heads/master", ref.getTarget().getName());
216 assertEquals(db.resolve("refs/heads/master"), ref.getObjectId());
217 }
218
219 @Test
220 public void testRefsUnderRefs() throws IOException {
221 ObjectId masterId = db.resolve("refs/heads/master");
222 writeNewRef("refs/heads/refs/foo/bar", masterId);
223
224 assertNull(db.getRefDatabase().exactRef("refs/foo/bar"));
225
226 Ref ref = db.findRef("refs/foo/bar");
227 assertEquals("refs/heads/refs/foo/bar", ref.getName());
228 assertEquals(db.resolve("refs/heads/master"), ref.getObjectId());
229 }
230
231 @Test
232 public void testAmbiguousRefsUnderRefs() throws IOException {
233 ObjectId masterId = db.resolve("refs/heads/master");
234 writeNewRef("refs/foo/bar", masterId);
235 writeNewRef("refs/heads/refs/foo/bar", masterId);
236
237 Ref exactRef = db.getRefDatabase().exactRef("refs/foo/bar");
238 assertEquals("refs/foo/bar", exactRef.getName());
239 assertEquals(masterId, exactRef.getObjectId());
240
241 Ref ref = db.findRef("refs/foo/bar");
242 assertEquals("refs/foo/bar", ref.getName());
243 assertEquals(masterId, ref.getObjectId());
244 }
245
246
247
248
249
250
251
252 @Test
253 public void testReadLoosePackedRef() throws IOException,
254 InterruptedException {
255 Ref ref = db.exactRef("refs/heads/master");
256 assertEquals(Storage.PACKED, ref.getStorage());
257 try (FileOutputStream os = new FileOutputStream(
258 new File(db.getDirectory(), "refs/heads/master"))) {
259 os.write(ref.getObjectId().name().getBytes());
260 os.write('\n');
261 }
262
263 ref = db.exactRef("refs/heads/master");
264 assertEquals(Storage.LOOSE, ref.getStorage());
265 }
266
267
268
269
270
271
272
273 @Test
274 public void testReadSimplePackedRefSameRepo() throws IOException {
275 Ref ref = db.exactRef("refs/heads/master");
276 ObjectId pid = db.resolve("refs/heads/master^");
277 assertEquals(Storage.PACKED, ref.getStorage());
278 RefUpdate updateRef = db.updateRef("refs/heads/master");
279 updateRef.setNewObjectId(pid);
280 updateRef.setForceUpdate(true);
281 Result update = updateRef.update();
282 assertEquals(Result.FORCED, update);
283
284 ref = db.exactRef("refs/heads/master");
285 assertEquals(Storage.LOOSE, ref.getStorage());
286 }
287
288 @Test
289 public void testResolvedNamesBranch() throws IOException {
290 Ref ref = db.findRef("a");
291 assertEquals("refs/heads/a", ref.getName());
292 }
293
294 @Test
295 public void testResolvedSymRef() throws IOException {
296 Ref ref = db.exactRef(Constants.HEAD);
297 assertEquals(Constants.HEAD, ref.getName());
298 assertTrue("is symbolic ref", ref.isSymbolic());
299 assertSame(Ref.Storage.LOOSE, ref.getStorage());
300
301 Ref dst = ref.getTarget();
302 assertNotNull("has target", dst);
303 assertEquals("refs/heads/master", dst.getName());
304
305 assertSame(dst.getObjectId(), ref.getObjectId());
306 assertSame(dst.getPeeledObjectId(), ref.getPeeledObjectId());
307 assertEquals(dst.isPeeled(), ref.isPeeled());
308 }
309
310 private static void checkContainsRef(List<Ref> haystack, Ref needle) {
311 for (Ref ref : haystack) {
312 if (ref.getName().equals(needle.getName()) &&
313 ref.getObjectId().equals(needle.getObjectId())) {
314 return;
315 }
316 }
317 fail("list " + haystack + " does not contain ref " + needle);
318 }
319
320 @Test
321 public void testGetRefsByPrefix() throws IOException {
322 List<Ref> refs = db.getRefDatabase().getRefsByPrefix("refs/heads/g");
323 assertEquals(2, refs.size());
324 checkContainsRef(refs, db.exactRef("refs/heads/g"));
325 checkContainsRef(refs, db.exactRef("refs/heads/gitlink"));
326
327 refs = db.getRefDatabase().getRefsByPrefix("refs/heads/prefix/");
328 assertEquals(1, refs.size());
329 checkContainsRef(refs, db.exactRef("refs/heads/prefix/a"));
330 }
331 }