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