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.internal.storage.file;
44
45 import static org.junit.Assert.assertTrue;
46
47 import java.io.File;
48 import java.io.IOException;
49 import java.nio.file.Path;
50
51 import org.eclipse.jgit.api.Git;
52 import org.eclipse.jgit.api.errors.AbortedByHookException;
53 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
54 import org.eclipse.jgit.api.errors.GitAPIException;
55 import org.eclipse.jgit.api.errors.NoFilepatternException;
56 import org.eclipse.jgit.api.errors.NoHeadException;
57 import org.eclipse.jgit.api.errors.NoMessageException;
58 import org.eclipse.jgit.api.errors.UnmergedPathsException;
59 import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
60 import org.eclipse.jgit.junit.JGitTestUtil;
61 import org.eclipse.jgit.lib.ObjectId;
62 import org.eclipse.jgit.revwalk.RevCommit;
63 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
64 import org.junit.Test;
65
66 public class AlternatesTest extends SampleDataRepositoryTestCase {
67
68 private FileRepository db2;
69
70 @Override
71 public void setUp() throws Exception {
72 super.setUp();
73 db2 = createWorkRepository();
74 }
75
76 private void setAlternate(FileRepository from, FileRepository to)
77 throws IOException {
78 File alt = new File(from.getObjectDatabase().getDirectory(),
79 "info/alternates");
80 alt.getParentFile().mkdirs();
81 File fromDir = from.getObjectDatabase().getDirectory();
82 File toDir = to.getObjectDatabase().getDirectory();
83 Path relative = fromDir.toPath().relativize(toDir.toPath());
84 write(alt, relative.toString() + "\n");
85 }
86
87 @Test
88 public void testAlternate() throws Exception {
89 setAlternate(db2, db);
90 RevCommit c = createCommit();
91 assertCommit(c);
92 assertAlternateObjects(db2);
93 }
94
95 @Test
96 public void testAlternateCyclic2() throws Exception {
97 setAlternate(db2, db);
98 setAlternate(db, db2);
99 RevCommit c = createCommit();
100 assertCommit(c);
101 assertAlternateObjects(db2);
102 }
103
104 @Test
105 public void testAlternateCyclic3() throws Exception {
106 FileRepository db3 = createBareRepository();
107 setAlternate(db2, db3);
108 setAlternate(db3, db);
109 setAlternate(db, db2);
110 RevCommit c = createCommit();
111 assertCommit(c);
112 assertAlternateObjects(db2);
113 }
114
115 private RevCommit createCommit() throws IOException, GitAPIException,
116 NoFilepatternException, NoHeadException, NoMessageException,
117 UnmergedPathsException, ConcurrentRefUpdateException,
118 WrongRepositoryStateException, AbortedByHookException {
119 JGitTestUtil.writeTrashFile(db, "test", "test");
120 Git git = Git.wrap(db2);
121 git.add().addFilepattern("test").call();
122 RevCommit c = git.commit().setMessage("adding test").call();
123 return c;
124 }
125
126 private void assertCommit(RevCommit c) {
127 ObjectDirectory od = db2.getObjectDatabase();
128 assertTrue("can't find expected commit" + c.name(),
129 od.has(c.toObjectId()));
130 }
131
132 private void assertAlternateObjects(FileRepository repo) {
133
134 final ObjectId alternateObjects[] = new ObjectId[] {
135 ObjectId.fromString("49322bb17d3acc9146f98c97d078513228bbf3c0"),
136 ObjectId.fromString("d0114ab8ac326bab30e3a657a0397578c5a1af88"),
137 ObjectId.fromString("f73b95671f326616d66b2afb3bdfcdbbce110b44"),
138 ObjectId.fromString("6020a3b8d5d636e549ccbd0c53e2764684bb3125"),
139 ObjectId.fromString("0a3d7772488b6b106fb62813c4d6d627918d9181"),
140 ObjectId.fromString("da0f8ed91a8f2f0f067b3bdf26265d5ca48cf82c"),
141 ObjectId.fromString(
142 "cd4bcfc27da62c6b840de700be1c60a7e69952a5") };
143 ObjectDirectory od = repo.getObjectDatabase();
144 for (ObjectId o : alternateObjects) {
145 assertTrue(String.format("can't find object %s in alternate",
146 o.getName()), od.has(o));
147 }
148 }
149 }