Refactor Repository's ref reading/writing for aggressive caching
[egit/zawir.git] / org.spearce.jgit.test / tst / org / spearce / jgit / lib / T0003_Basic.java
blobd4c8e1037d60aaf98e826f02380859f769790184
1 /*
2 * Copyright (C) 2006 Shawn Pearce <spearce@spearce.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License, version 2, as published by the Free Software Foundation.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
17 package org.spearce.jgit.lib;
19 import java.io.ByteArrayInputStream;
20 import java.io.File;
21 import java.io.FileInputStream;
22 import java.io.FileReader;
23 import java.io.FileWriter;
24 import java.io.IOException;
25 import java.io.PrintWriter;
27 public class T0003_Basic extends RepositoryTestCase {
28 public void test001_Initalize() {
29 final File gitdir = new File(trash, ".git");
30 final File objects = new File(gitdir, "objects");
31 final File objects_pack = new File(objects, "pack");
32 final File objects_info = new File(objects, "info");
33 final File refs = new File(gitdir, "refs");
34 final File refs_heads = new File(refs, "heads");
35 final File refs_tags = new File(refs, "tags");
36 final File HEAD = new File(gitdir, "HEAD");
38 assertTrue("Exists " + trash, trash.isDirectory());
39 assertTrue("Exists " + objects, objects.isDirectory());
40 assertTrue("Exists " + objects_pack, objects_pack.isDirectory());
41 assertTrue("Exists " + objects_info, objects_info.isDirectory());
42 assertEquals(2, objects.listFiles().length);
43 assertTrue("Exists " + refs, refs.isDirectory());
44 assertTrue("Exists " + refs_heads, refs_heads.isDirectory());
45 assertTrue("Exists " + refs_tags, refs_tags.isDirectory());
46 assertTrue("Exists " + HEAD, HEAD.isFile());
47 assertEquals(23, HEAD.length());
50 public void test002_WriteEmptyTree() throws IOException {
51 // One of our test packs contains the empty tree object. If the pack is
52 // open when we create it we won't write the object file out as a loose
53 // object (as it already exists in the pack).
55 db.closePacks();
57 final Tree t = new Tree(db);
58 t.accept(new WriteTree(trash, db), TreeEntry.MODIFIED_ONLY);
59 assertEquals("4b825dc642cb6eb9a060e54bf8d69288fbee4904", t.getId()
60 .toString());
61 final File o = new File(new File(new File(trash_git, "objects"), "4b"),
62 "825dc642cb6eb9a060e54bf8d69288fbee4904");
63 assertTrue("Exists " + o, o.isFile());
64 assertTrue("Read-only " + o, !o.canWrite());
67 public void test002_WriteEmptyTree2() throws IOException {
68 // File shouldn't exist as it is in a test pack.
70 final Tree t = new Tree(db);
71 t.accept(new WriteTree(trash, db), TreeEntry.MODIFIED_ONLY);
72 assertEquals("4b825dc642cb6eb9a060e54bf8d69288fbee4904", t.getId()
73 .toString());
74 final File o = new File(new File(new File(trash_git, "objects"), "4b"),
75 "825dc642cb6eb9a060e54bf8d69288fbee4904");
76 assertFalse("Exists " + o, o.isFile());
79 public void test003_WriteShouldBeEmptyTree() throws IOException {
80 final Tree t = new Tree(db);
81 final ObjectId emptyId = new ObjectWriter(db).writeBlob(new byte[0]);
82 t.addFile("should-be-empty").setId(emptyId);
83 t.accept(new WriteTree(trash, db), TreeEntry.MODIFIED_ONLY);
84 assertEquals("7bb943559a305bdd6bdee2cef6e5df2413c3d30a", t.getId()
85 .toString());
87 File o;
88 o = new File(new File(new File(trash_git, "objects"), "7b"),
89 "b943559a305bdd6bdee2cef6e5df2413c3d30a");
90 assertTrue("Exists " + o, o.isFile());
91 assertTrue("Read-only " + o, !o.canWrite());
93 o = new File(new File(new File(trash_git, "objects"), "e6"),
94 "9de29bb2d1d6434b8b29ae775ad8c2e48c5391");
95 assertTrue("Exists " + o, o.isFile());
96 assertTrue("Read-only " + o, !o.canWrite());
99 public void test004_CheckNewConfig() throws IOException {
100 final RepositoryConfig c = db.getConfig();
101 assertNotNull(c);
102 assertEquals("0", c.getString("core", null, "repositoryformatversion"));
103 assertEquals("0", c.getString("CoRe", null, "REPOSITORYFoRmAtVeRsIoN"));
104 assertEquals("true", c.getString("core", null, "filemode"));
105 assertEquals("true", c.getString("cOrE", null, "fIlEModE"));
106 assertNull(c.getString("notavalue", null, "reallyNotAValue"));
107 c.load();
110 public void test005_ReadSimpleConfig() throws IOException {
111 final RepositoryConfig c = db.getConfig();
112 assertNotNull(c);
113 c.load();
114 assertEquals("0", c.getString("core", null, "repositoryformatversion"));
115 assertEquals("0", c.getString("CoRe", null, "REPOSITORYFoRmAtVeRsIoN"));
116 assertEquals("true", c.getString("core", null, "filemode"));
117 assertEquals("true", c.getString("cOrE", null, "fIlEModE"));
118 assertNull(c.getString("notavalue", null, "reallyNotAValue"));
121 public void test006_ReadUglyConfig() throws IOException {
122 final RepositoryConfig c = db.getConfig();
123 final File cfg = new File(db.getDirectory(), "config");
124 final FileWriter pw = new FileWriter(cfg);
125 final String configStr = " [core];comment\n\tfilemode = yes\n"
126 + "[user]\n"
127 + " email = A U Thor <thor@example.com> # Just an example...\n"
128 + " name = \"A Thor \\\\ \\\"\\t \"\n"
129 + " defaultCheckInComment = a many line\\n\\\ncomment\\n\\\n"
130 + " to test\n";
131 pw.write(configStr);
132 pw.close();
133 c.load();
134 assertEquals("yes", c.getString("core", null, "filemode"));
135 assertEquals("A U Thor <thor@example.com>", c
136 .getString("user", null, "email"));
137 assertEquals("A Thor \\ \"\t ", c.getString("user", null, "name"));
138 assertEquals("a many line\ncomment\n to test", c.getString("user",
139 null, "defaultCheckInComment"));
140 c.save();
141 final FileReader fr = new FileReader(cfg);
142 final char[] cbuf = new char[configStr.length()];
143 fr.read(cbuf);
144 fr.close();
145 assertEquals(configStr, new String(cbuf));
148 public void test007_Open() throws IOException {
149 final Repository db2 = new Repository(db.getDirectory());
150 assertEquals(db.getDirectory(), db2.getDirectory());
151 assertEquals(db.getObjectsDirectory(), db2.getObjectsDirectory());
152 assertNotSame(db.getConfig(), db2.getConfig());
155 public void test008_FailOnWrongVersion() throws IOException {
156 final File cfg = new File(db.getDirectory(), "config");
157 final FileWriter pw = new FileWriter(cfg);
158 final String badvers = "ihopethisisneveraversion";
159 final String configStr = "[core]\n" + "\trepositoryFormatVersion="
160 + badvers + "\n";
161 pw.write(configStr);
162 pw.close();
164 try {
165 new Repository(db.getDirectory());
166 fail("incorrectly opened a bad repository");
167 } catch (IOException ioe) {
168 assertTrue(ioe.getMessage().indexOf("format") > 0);
169 assertTrue(ioe.getMessage().indexOf(badvers) > 0);
173 public void test009_CreateCommitOldFormat() throws IOException {
174 writeTrashFile(".git/config", "[core]\n" + "legacyHeaders=1\n");
175 db.getConfig().load();
177 final Tree t = new Tree(db);
178 final FileTreeEntry f = t.addFile("i-am-a-file");
179 writeTrashFile(f.getName(), "and this is the data in me\n");
180 t.accept(new WriteTree(trash, db), TreeEntry.MODIFIED_ONLY);
181 assertEquals(ObjectId.fromString("00b1f73724f493096d1ffa0b0f1f1482dbb8c936"),
182 t.getTreeId());
184 final Commit c = new Commit(db);
185 c.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
186 c.setCommitter(new PersonIdent(jcommitter, 1154236443000L, -4 * 60));
187 c.setMessage("A Commit\n");
188 c.setTree(t);
189 assertEquals(t.getTreeId(), c.getTreeId());
190 c.commit();
191 final ObjectId cmtid = ObjectId.fromString(
192 "803aec4aba175e8ab1d666873c984c0308179099");
193 assertEquals(cmtid, c.getCommitId());
195 // Verify the commit we just wrote is in the correct format.
196 final XInputStream xis = new XInputStream(new FileInputStream(db
197 .toFile(cmtid)));
198 try {
199 assertEquals(0x78, xis.readUInt8());
200 assertEquals(0x9c, xis.readUInt8());
201 assertTrue(0x789c % 31 == 0);
202 } finally {
203 xis.close();
206 // Verify we can read it.
207 final Commit c2 = db.mapCommit(cmtid);
208 assertNotNull(c2);
209 assertEquals(c.getMessage(), c2.getMessage());
210 assertEquals(c.getTreeId(), c2.getTreeId());
211 assertEquals(c.getAuthor(), c2.getAuthor());
212 assertEquals(c.getCommitter(), c2.getCommitter());
215 public void test012_SubtreeExternalSorting() throws IOException {
216 final ObjectId emptyBlob = new ObjectWriter(db).writeBlob(new byte[0]);
217 final Tree t = new Tree(db);
218 final FileTreeEntry e0 = t.addFile("a-");
219 final FileTreeEntry e1 = t.addFile("a-b");
220 final FileTreeEntry e2 = t.addFile("a/b");
221 final FileTreeEntry e3 = t.addFile("a=");
222 final FileTreeEntry e4 = t.addFile("a=b");
224 e0.setId(emptyBlob);
225 e1.setId(emptyBlob);
226 e2.setId(emptyBlob);
227 e3.setId(emptyBlob);
228 e4.setId(emptyBlob);
230 t.accept(new WriteTree(trash, db), TreeEntry.MODIFIED_ONLY);
231 assertEquals(ObjectId.fromString("b47a8f0a4190f7572e11212769090523e23eb1ea"),
232 t.getId());
235 public void test020_createBlobTag() throws IOException {
236 final ObjectId emptyId = new ObjectWriter(db).writeBlob(new byte[0]);
237 final Tag t = new Tag(db);
238 t.setObjId(emptyId);
239 t.setType("blob");
240 t.setTag("test020");
241 t.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
242 t.setMessage("test020 tagged\n");
243 t.tag();
244 assertEquals("6759556b09fbb4fd8ae5e315134481cc25d46954", t.getTagId().toString());
246 Tag mapTag = db.mapTag("test020");
247 assertEquals("blob", mapTag.getType());
248 assertEquals("test020 tagged\n", mapTag.getMessage());
249 assertEquals(new PersonIdent(jauthor, 1154236443000L, -4 * 60), mapTag.getAuthor());
250 assertEquals("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", mapTag.getObjId().toString());
253 public void test020b_createBlobPlainTag() throws IOException {
254 test020_createBlobTag();
255 Tag t = new Tag(db);
256 t.setTag("test020b");
257 t.setObjId(ObjectId.fromString("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"));
258 t.tag();
260 Tag mapTag = db.mapTag("test020b");
261 assertEquals("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", mapTag.getObjId().toString());
263 // We do not repeat the plain tag test for other object types
266 public void test021_createTreeTag() throws IOException {
267 final ObjectId emptyId = new ObjectWriter(db).writeBlob(new byte[0]);
268 final Tree almostEmptyTree = new Tree(db);
269 almostEmptyTree.addEntry(new FileTreeEntry(almostEmptyTree, emptyId, "empty".getBytes(), false));
270 final ObjectId almostEmptyTreeId = new ObjectWriter(db).writeTree(almostEmptyTree);
271 final Tag t = new Tag(db);
272 t.setObjId(almostEmptyTreeId);
273 t.setType("tree");
274 t.setTag("test021");
275 t.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
276 t.setMessage("test021 tagged\n");
277 t.tag();
278 assertEquals("b0517bc8dbe2096b419d42424cd7030733f4abe5", t.getTagId().toString());
280 Tag mapTag = db.mapTag("test021");
281 assertEquals("tree", mapTag.getType());
282 assertEquals("test021 tagged\n", mapTag.getMessage());
283 assertEquals(new PersonIdent(jauthor, 1154236443000L, -4 * 60), mapTag.getAuthor());
284 assertEquals("417c01c8795a35b8e835113a85a5c0c1c77f67fb", mapTag.getObjId().toString());
287 public void test022_createCommitTag() throws IOException {
288 final ObjectId emptyId = new ObjectWriter(db).writeBlob(new byte[0]);
289 final Tree almostEmptyTree = new Tree(db);
290 almostEmptyTree.addEntry(new FileTreeEntry(almostEmptyTree, emptyId, "empty".getBytes(), false));
291 final ObjectId almostEmptyTreeId = new ObjectWriter(db).writeTree(almostEmptyTree);
292 final Commit almostEmptyCommit = new Commit(db);
293 almostEmptyCommit.setAuthor(new PersonIdent(jauthor, 1154236443000L, -2 * 60)); // not exactly the same
294 almostEmptyCommit.setCommitter(new PersonIdent(jauthor, 1154236443000L, -2 * 60));
295 almostEmptyCommit.setMessage("test022\n");
296 almostEmptyCommit.setTreeId(almostEmptyTreeId);
297 ObjectId almostEmptyCommitId = new ObjectWriter(db).writeCommit(almostEmptyCommit);
298 final Tag t = new Tag(db);
299 t.setObjId(almostEmptyCommitId);
300 t.setType("commit");
301 t.setTag("test022");
302 t.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
303 t.setMessage("test022 tagged\n");
304 t.tag();
305 assertEquals("0ce2ebdb36076ef0b38adbe077a07d43b43e3807", t.getTagId().toString());
307 Tag mapTag = db.mapTag("test022");
308 assertEquals("commit", mapTag.getType());
309 assertEquals("test022 tagged\n", mapTag.getMessage());
310 assertEquals(new PersonIdent(jauthor, 1154236443000L, -4 * 60), mapTag.getAuthor());
311 assertEquals("b5d3b45a96b340441f5abb9080411705c51cc86c", mapTag.getObjId().toString());
314 public void test023_createCommitNonAnullii() throws IOException {
315 final ObjectId emptyId = new ObjectWriter(db).writeBlob(new byte[0]);
316 final Tree almostEmptyTree = new Tree(db);
317 almostEmptyTree.addEntry(new FileTreeEntry(almostEmptyTree, emptyId, "empty".getBytes(), false));
318 final ObjectId almostEmptyTreeId = new ObjectWriter(db).writeTree(almostEmptyTree);
319 Commit commit = new Commit(db);
320 commit.setTreeId(almostEmptyTreeId);
321 commit.setAuthor(new PersonIdent("Joe H\u00e4cker","joe@example.com",4294967295000L,60));
322 commit.setCommitter(new PersonIdent("Joe Hacker","joe2@example.com",4294967295000L,60));
323 commit.setEncoding("UTF-8");
324 commit.setMessage("\u00dcbergeeks");
325 ObjectId cid = new ObjectWriter(db).writeCommit(commit);
326 assertEquals("4680908112778718f37e686cbebcc912730b3154", cid.toString());
329 public void test024_createCommitNonAscii() throws IOException {
330 final ObjectId emptyId = new ObjectWriter(db).writeBlob(new byte[0]);
331 final Tree almostEmptyTree = new Tree(db);
332 almostEmptyTree.addEntry(new FileTreeEntry(almostEmptyTree, emptyId, "empty".getBytes(), false));
333 final ObjectId almostEmptyTreeId = new ObjectWriter(db).writeTree(almostEmptyTree);
334 Commit commit = new Commit(db);
335 commit.setTreeId(almostEmptyTreeId);
336 commit.setAuthor(new PersonIdent("Joe H\u00e4cker","joe@example.com",4294967295000L,60));
337 commit.setCommitter(new PersonIdent("Joe Hacker","joe2@example.com",4294967295000L,60));
338 commit.setEncoding("ISO-8859-1");
339 commit.setMessage("\u00dcbergeeks");
340 ObjectId cid = new ObjectWriter(db).writeCommit(commit);
341 assertEquals("2979b39d385014b33287054b87f77bcb3ecb5ebf", cid.toString());
344 public void test025_packedRefs() throws IOException {
345 test020_createBlobTag();
346 test021_createTreeTag();
347 test022_createCommitTag();
349 if (!new File(db.getDirectory(),"refs/tags/test020").delete()) throw new Error("Cannot delete unpacked tag");
350 if (!new File(db.getDirectory(),"refs/tags/test021").delete()) throw new Error("Cannot delete unpacked tag");
351 if (!new File(db.getDirectory(),"refs/tags/test022").delete()) throw new Error("Cannot delete unpacked tag");
353 // We cannot resolve it now, since we have no ref
354 Tag mapTag20missing = db.mapTag("test020");
355 assertNull(mapTag20missing);
357 // Construct packed refs file
358 PrintWriter w = new PrintWriter(new FileWriter(new File(db.getDirectory(), "packed-refs")));
359 w.println("# packed-refs with: peeled");
360 w.println("6759556b09fbb4fd8ae5e315134481cc25d46954 refs/tags/test020");
361 w.println("^e69de29bb2d1d6434b8b29ae775ad8c2e48c5391");
362 w.println("b0517bc8dbe2096b419d42424cd7030733f4abe5 refs/tags/test021");
363 w.println("^417c01c8795a35b8e835113a85a5c0c1c77f67fb");
364 w.println("0ce2ebdb36076ef0b38adbe077a07d43b43e3807 refs/tags/test022");
365 w.println("^b5d3b45a96b340441f5abb9080411705c51cc86c");
366 w.close();
368 Tag mapTag20 = db.mapTag("test020");
369 assertNotNull("have tag test020", mapTag20);
370 assertEquals("blob", mapTag20.getType());
371 assertEquals("test020 tagged\n", mapTag20.getMessage());
372 assertEquals(new PersonIdent(jauthor, 1154236443000L, -4 * 60), mapTag20.getAuthor());
373 assertEquals("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", mapTag20.getObjId().toString());
375 Tag mapTag21 = db.mapTag("test021");
376 assertEquals("tree", mapTag21.getType());
377 assertEquals("test021 tagged\n", mapTag21.getMessage());
378 assertEquals(new PersonIdent(jauthor, 1154236443000L, -4 * 60), mapTag21.getAuthor());
379 assertEquals("417c01c8795a35b8e835113a85a5c0c1c77f67fb", mapTag21.getObjId().toString());
381 Tag mapTag22 = db.mapTag("test022");
382 assertEquals("commit", mapTag22.getType());
383 assertEquals("test022 tagged\n", mapTag22.getMessage());
384 assertEquals(new PersonIdent(jauthor, 1154236443000L, -4 * 60), mapTag22.getAuthor());
385 assertEquals("b5d3b45a96b340441f5abb9080411705c51cc86c", mapTag22.getObjId().toString());
388 public void test025_computeSha1NoStore() throws IOException {
389 byte[] data = "test025 some data, more than 16 bytes to get good coverage"
390 .getBytes("ISO-8859-1");
391 // TODO: but we do not test legacy header writing
392 final ObjectId id = new ObjectWriter(db).computeBlobSha1(data.length,
393 new ByteArrayInputStream(data));
394 assertEquals("4f561df5ecf0dfbd53a0dc0f37262fef075d9dde", id.toString());
397 public void test026_CreateCommitMultipleparents() throws IOException {
398 db.getConfig().load();
400 final Tree t = new Tree(db);
401 final FileTreeEntry f = t.addFile("i-am-a-file");
402 writeTrashFile(f.getName(), "and this is the data in me\n");
403 t.accept(new WriteTree(trash, db), TreeEntry.MODIFIED_ONLY);
404 assertEquals(ObjectId.fromString("00b1f73724f493096d1ffa0b0f1f1482dbb8c936"),
405 t.getTreeId());
407 final Commit c1 = new Commit(db);
408 c1.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
409 c1.setCommitter(new PersonIdent(jcommitter, 1154236443000L, -4 * 60));
410 c1.setMessage("A Commit\n");
411 c1.setTree(t);
412 assertEquals(t.getTreeId(), c1.getTreeId());
413 c1.commit();
414 final ObjectId cmtid1 = ObjectId.fromString(
415 "803aec4aba175e8ab1d666873c984c0308179099");
416 assertEquals(cmtid1, c1.getCommitId());
418 final Commit c2 = new Commit(db);
419 c2.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
420 c2.setCommitter(new PersonIdent(jcommitter, 1154236443000L, -4 * 60));
421 c2.setMessage("A Commit 2\n");
422 c2.setTree(t);
423 assertEquals(t.getTreeId(), c2.getTreeId());
424 c2.setParentIds(new ObjectId[] { c1.getCommitId() } );
425 c2.commit();
426 final ObjectId cmtid2 = ObjectId.fromString(
427 "95d068687c91c5c044fb8c77c5154d5247901553");
428 assertEquals(cmtid2, c2.getCommitId());
430 Commit rm2 = db.mapCommit(cmtid2);
431 assertNotSame(c2, rm2); // assert the parsed objects is not from the cache
432 assertEquals(c2.getAuthor(), rm2.getAuthor());
433 assertEquals(c2.getCommitId(), rm2.getCommitId());
434 assertEquals(c2.getMessage(), rm2.getMessage());
435 assertEquals(c2.getTree().getTreeId(), rm2.getTree().getTreeId());
436 assertEquals(1, rm2.getParentIds().length);
437 assertEquals(c1.getCommitId(), rm2.getParentIds()[0]);
439 final Commit c3 = new Commit(db);
440 c3.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
441 c3.setCommitter(new PersonIdent(jcommitter, 1154236443000L, -4 * 60));
442 c3.setMessage("A Commit 3\n");
443 c3.setTree(t);
444 assertEquals(t.getTreeId(), c3.getTreeId());
445 c3.setParentIds(new ObjectId[] { c1.getCommitId(), c2.getCommitId() });
446 c3.commit();
447 final ObjectId cmtid3 = ObjectId.fromString(
448 "ce6e1ce48fbeeb15a83f628dc8dc2debefa066f4");
449 assertEquals(cmtid3, c3.getCommitId());
451 Commit rm3 = db.mapCommit(cmtid3);
452 assertNotSame(c3, rm3); // assert the parsed objects is not from the cache
453 assertEquals(c3.getAuthor(), rm3.getAuthor());
454 assertEquals(c3.getCommitId(), rm3.getCommitId());
455 assertEquals(c3.getMessage(), rm3.getMessage());
456 assertEquals(c3.getTree().getTreeId(), rm3.getTree().getTreeId());
457 assertEquals(2, rm3.getParentIds().length);
458 assertEquals(c1.getCommitId(), rm3.getParentIds()[0]);
459 assertEquals(c2.getCommitId(), rm3.getParentIds()[1]);
461 final Commit c4 = new Commit(db);
462 c4.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
463 c4.setCommitter(new PersonIdent(jcommitter, 1154236443000L, -4 * 60));
464 c4.setMessage("A Commit 4\n");
465 c4.setTree(t);
466 assertEquals(t.getTreeId(), c3.getTreeId());
467 c4.setParentIds(new ObjectId[] { c1.getCommitId(), c2.getCommitId(), c3.getCommitId() });
468 c4.commit();
469 final ObjectId cmtid4 = ObjectId.fromString(
470 "d1fca9fe3fef54e5212eb67902c8ed3e79736e27");
471 assertEquals(cmtid4, c4.getCommitId());
473 Commit rm4 = db.mapCommit(cmtid4);
474 assertNotSame(c4, rm3); // assert the parsed objects is not from the cache
475 assertEquals(c4.getAuthor(), rm4.getAuthor());
476 assertEquals(c4.getCommitId(), rm4.getCommitId());
477 assertEquals(c4.getMessage(), rm4.getMessage());
478 assertEquals(c4.getTree().getTreeId(), rm4.getTree().getTreeId());
479 assertEquals(3, rm4.getParentIds().length);
480 assertEquals(c1.getCommitId(), rm4.getParentIds()[0]);
481 assertEquals(c2.getCommitId(), rm4.getParentIds()[1]);
482 assertEquals(c3.getCommitId(), rm4.getParentIds()[2]);
485 public void test027_UnpackedRefHigherPriorityThanPacked() throws IOException {
486 PrintWriter writer = new PrintWriter(new FileWriter(new File(db.getDirectory(), "refs/heads/a")));
487 String unpackedId = "7f822839a2fe9760f386cbbbcb3f92c5fe81def7";
488 writer.println(unpackedId);
489 writer.close();
491 ObjectId resolved = db.resolve("refs/heads/a");
492 assertEquals(unpackedId, resolved.toString());
495 public void test028_LockPackedRef() throws IOException {
496 writeTrashFile(".git/packed-refs", "7f822839a2fe9760f386cbbbcb3f92c5fe81def7 refs/heads/foobar");
497 writeTrashFile(".git/HEAD", "ref: refs/heads/foobar\n");
499 ObjectId resolve = db.resolve("HEAD");
500 assertEquals("7f822839a2fe9760f386cbbbcb3f92c5fe81def7", resolve.toString());
502 RefUpdate lockRef = db.updateRef("HEAD");
503 ObjectId newId = ObjectId.fromString("07f822839a2fe9760f386cbbbcb3f92c5fe81def");
504 lockRef.setNewObjectId(newId);
505 assertEquals(RefUpdate.Result.FORCED, lockRef.forceUpdate());
507 assertTrue(new File(db.getDirectory(), "refs/heads/foobar").exists());
508 assertEquals(newId, db.resolve("refs/heads/foobar"));
510 // Again. The ref already exists
511 RefUpdate lockRef2 = db.updateRef("HEAD");
512 ObjectId newId2 = ObjectId.fromString("7f822839a2fe9760f386cbbbcb3f92c5fe81def7");
513 lockRef2.setNewObjectId(newId2);
514 assertEquals(RefUpdate.Result.FORCED, lockRef2.forceUpdate());
516 assertTrue(new File(db.getDirectory(), "refs/heads/foobar").exists());
517 assertEquals(newId2, db.resolve("refs/heads/foobar"));
520 public void test029_mapObject() throws IOException {
521 assertEquals(new byte[0].getClass(), db.mapObject(ObjectId.fromString("5b6e7c66c276e7610d4a73c70ec1a1f7c1003259"), null).getClass());
522 assertEquals(Commit.class, db.mapObject(ObjectId.fromString("540a36d136cf413e4b064c2b0e0a4db60f77feab"), null).getClass());
523 assertEquals(Tree.class, db.mapObject(ObjectId.fromString("aabf2ffaec9b497f0950352b3e582d73035c2035"), null).getClass());
524 assertEquals(Tag.class, db.mapObject(ObjectId.fromString("17768080a2318cd89bba4c8b87834401e2095703"), null).getClass());