blob: 6cba43dbd9e8d30677d19405eb524653afc438d0 [file] [log] [blame]
Dave Borowitz9de65952012-08-13 16:09:45 -07001// Copyright 2012 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles;
16
17import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
18import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
19import static org.eclipse.jgit.lib.Constants.OBJ_TAG;
Dave Borowitz48ca6702013-04-09 11:52:41 -070020
Dave Borowitz9de65952012-08-13 16:09:45 -070021import junit.framework.TestCase;
22
Shawn Pearceb43b2d52013-03-18 10:55:15 -070023import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
24import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
25import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
Dave Borowitz9de65952012-08-13 16:09:45 -070026import org.eclipse.jgit.junit.TestRepository;
27import org.eclipse.jgit.revwalk.RevBlob;
28import org.eclipse.jgit.revwalk.RevCommit;
29import org.eclipse.jgit.revwalk.RevTag;
Shawn Pearceb43b2d52013-03-18 10:55:15 -070030
31import com.google.common.cache.CacheBuilder;
32import com.google.gitiles.RevisionParser.Result;
Dave Borowitz9de65952012-08-13 16:09:45 -070033
34/** Tests for the revision parser. */
35public class RevisionParserTest extends TestCase {
36 private TestRepository<DfsRepository> repo;
37 private RevisionParser parser;
38
39 @Override
40 protected void setUp() throws Exception {
41 repo = new TestRepository<DfsRepository>(
42 new InMemoryRepository(new DfsRepositoryDescription("test")));
43 parser = new RevisionParser(
44 repo.getRepository(),
45 new TestGitilesAccess(repo.getRepository()).forRequest(null),
46 new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
47 }
48
49 public void testParseRef() throws Exception {
50 RevCommit master = repo.branch("refs/heads/master").commit().create();
51 assertEquals(new Result(Revision.peeled("master", master)),
52 parser.parse("master"));
53 assertEquals(new Result(Revision.peeled("refs/heads/master", master)),
54 parser.parse("refs/heads/master"));
55 assertNull(parser.parse("refs//heads//master"));
Dave Borowitz5f7e8b72013-01-07 09:31:41 -080056 assertNull(parser.parse("refs heads master"));
Dave Borowitz9de65952012-08-13 16:09:45 -070057 }
58
59 public void testParseRefParentExpression() throws Exception {
60 RevCommit root = repo.commit().create();
61 RevCommit parent1 = repo.commit().parent(root).create();
62 RevCommit parent2 = repo.commit().parent(root).create();
63 RevCommit merge = repo.branch("master").commit()
64 .parent(parent1)
65 .parent(parent2)
66 .create();
67 assertEquals(new Result(Revision.peeled("master", merge)), parser.parse("master"));
68 assertEquals(new Result(Revision.peeled("master^", parent1)), parser.parse("master^"));
69 assertEquals(new Result(Revision.peeled("master~1", parent1)), parser.parse("master~1"));
70 assertEquals(new Result(Revision.peeled("master^2", parent2)), parser.parse("master^2"));
Dave Borowitz5f7e8b72013-01-07 09:31:41 -080071 assertNull(parser.parse("master^3"));
Dave Borowitz9de65952012-08-13 16:09:45 -070072 assertEquals(new Result(Revision.peeled("master~2", root)), parser.parse("master~2"));
73 }
74
75 public void testParseCommitShaVisibleFromHead() throws Exception {
76 RevCommit parent = repo.commit().create();
77 RevCommit commit = repo.branch("master").commit().parent(parent).create();
78 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
79 assertEquals(new Result(Revision.peeled(parent.name(), parent)), parser.parse(parent.name()));
80
81 String abbrev = commit.name().substring(0, 6);
82 assertEquals(new Result(Revision.peeled(abbrev, commit)), parser.parse(abbrev));
83 }
84
85 public void testParseCommitShaVisibleFromTag() throws Exception {
86 RevCommit parent = repo.commit().create();
87 RevCommit commit = repo.commit().parent(parent).create();
88 repo.branch("master").commit().create();
89 repo.update("refs/tags/tag", repo.tag("tag", commit));
90
91 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
92 assertEquals(new Result(Revision.peeled(parent.name(), parent)), parser.parse(parent.name()));
93 }
94
95 public void testParseCommitShaVisibleFromOther() throws Exception {
96 RevCommit parent = repo.commit().create();
97 RevCommit commit = repo.commit().parent(parent).create();
98 repo.branch("master").commit().create();
99 repo.update("refs/tags/tag", repo.tag("tag", repo.commit().create()));
100 repo.update("refs/meta/config", commit);
101
102 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
103 assertEquals(new Result(Revision.peeled(parent.name(), parent)), parser.parse(parent.name()));
104 }
105
106 public void testParseCommitShaVisibleFromChange() throws Exception {
107 RevCommit parent = repo.commit().create();
108 RevCommit commit = repo.commit().parent(parent).create();
109 repo.branch("master").commit().create();
110 repo.update("refs/changes/01/0001", commit);
111
112 // Matches exactly.
113 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
114 // refs/changes/* is excluded from ancestry search.
115 assertEquals(null, parser.parse(parent.name()));
116 }
117
118 public void testParseNonVisibleCommitSha() throws Exception {
119 RevCommit other = repo.commit().create();
Dave Borowitza12b1472012-11-12 14:46:28 -0800120 repo.branch("master").commit().create();
Dave Borowitz9de65952012-08-13 16:09:45 -0700121 assertEquals(null, parser.parse(other.name()));
122
123 repo.branch("other").update(other);
124 assertEquals(new Result(Revision.peeled(other.name(), other)), parser.parse(other.name()));
125 }
126
127 public void testParseDiffRevisions() throws Exception {
128 RevCommit parent = repo.commit().create();
129 RevCommit commit = repo.branch("master").commit().parent(parent).create();
130 RevCommit other = repo.branch("other").commit().create();
131
132 assertEquals(
133 new Result(
134 Revision.peeled("master", commit),
135 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700136 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700137 parser.parse("master^..master"));
138 assertEquals(
139 new Result(
140 Revision.peeled("master", commit),
141 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700142 "/"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700143 parser.parse("master^..master/"));
144 assertEquals(
145 new Result(
146 Revision.peeled("master", commit),
147 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700148 "/path/to/a/file"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700149 parser.parse("master^..master/path/to/a/file"));
150 assertEquals(
151 new Result(
152 Revision.peeled("master", commit),
153 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700154 "/path/to/a/..file"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700155 parser.parse("master^..master/path/to/a/..file"));
156 assertEquals(
157 new Result(
158 Revision.peeled("refs/heads/master", commit),
159 Revision.peeled("refs/heads/master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700160 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700161 parser.parse("refs/heads/master^..refs/heads/master"));
162 assertEquals(
163 new Result(
164 Revision.peeled("master", commit),
165 Revision.peeled("master~1", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700166 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700167 parser.parse("master~1..master"));
168 // TODO(dborowitz): 2a2362fbb in JGit causes master~2 to resolve to master
169 // rather than null. Uncomment when upstream regression is fixed.
170 //assertNull(parser.parse("master~2..master"));
171 assertEquals(
172 new Result(
173 Revision.peeled("master", commit),
174 Revision.peeled("other", other),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700175 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700176 parser.parse("other..master"));
177 }
178
179 public void testParseFirstParentExpression() throws Exception {
180 RevCommit parent = repo.commit().create();
181 RevCommit commit = repo.branch("master").commit().parent(parent).create();
182
183 assertEquals(
184 new Result(
185 Revision.peeled("master", commit),
186 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700187 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700188 parser.parse("master^!"));
189 assertEquals(
190 new Result(
191 Revision.peeled("master^", parent),
192 Revision.NULL,
Dave Borowitz06b88d22013-06-19 15:19:14 -0700193 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700194 parser.parse("master^^!"));
195 assertEquals(
196 new Result(
197 Revision.peeled(parent.name(), parent),
198 Revision.NULL,
Dave Borowitz06b88d22013-06-19 15:19:14 -0700199 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700200 parser.parse(parent.name() + "^!"));
201
Dave Borowitza12b1472012-11-12 14:46:28 -0800202 repo.update("refs/tags/tag", repo.tag("tag", commit));
Dave Borowitz9de65952012-08-13 16:09:45 -0700203 assertEquals(
204 new Result(
205 Revision.peeled("tag", commit),
206 Revision.peeled("tag^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700207 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700208 parser.parse("tag^!"));
209 assertEquals(
210 new Result(
211 Revision.peeled("tag^", parent),
212 Revision.NULL,
Dave Borowitz06b88d22013-06-19 15:19:14 -0700213 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700214 parser.parse("tag^^!"));
215 }
216
217 public void testNonVisibleDiffShas() throws Exception {
218 RevCommit other = repo.commit().create();
219 RevCommit master = repo.branch("master").commit().create();
220 assertEquals(null, parser.parse("other..master"));
221 assertEquals(null, parser.parse("master..other"));
222
223 repo.branch("other").update(other);
224 assertEquals(
225 new Result(
226 Revision.peeled("master", master),
227 Revision.peeled("other", other),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700228 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700229 parser.parse("other..master"));
230 assertEquals(
231 new Result(
232 Revision.peeled("other", other),
233 Revision.peeled("master", master),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700234 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700235 parser.parse("master..other"));
236 }
237
238 public void testParseTag() throws Exception {
239 RevCommit master = repo.branch("master").commit().create();
240 RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
241 RevTag masterTagTag = repo.update("refs/tags/master-tag-tag",
242 repo.tag("master-tag-tag", master));
243
244 assertEquals(new Result(
245 new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)),
246 parser.parse("master-tag"));
247 assertEquals(new Result(
248 new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)),
249 parser.parse("master-tag-tag"));
250
251 RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
252 RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
253 assertEquals(new Result(Revision.peeled("blob", blob)), parser.parse("blob"));
254 assertEquals(new Result(new Revision("blob-tag", blobTag, OBJ_TAG, blob, OBJ_BLOB)),
255 parser.parse("blob-tag"));
256 }
257
258 public void testParseUnsupportedRevisionExpressions() throws Exception {
259 RevBlob blob = repo.blob("blob contents");
260 RevCommit master = repo.branch("master").commit().add("blob", blob).create();
261
262 assertEquals(master, repo.getRepository().resolve("master^{}"));
263 assertEquals(null, parser.parse("master^{}"));
264
265 assertEquals(master, repo.getRepository().resolve("master^{commit}"));
266 assertEquals(null, parser.parse("master^{commit}"));
267
268 assertEquals(blob, repo.getRepository().resolve("master:blob"));
269 assertEquals(null, parser.parse("master:blob"));
270
271 // TestRepository has no simple way of setting the reflog.
272 //assertEquals(null, repo.getRepository().resolve("master@{0}"));
273 assertEquals(null, parser.parse("master@{0}"));
274 }
Dave Borowitz48ca6702013-04-09 11:52:41 -0700275
276 public void testParseMissingSha() throws Exception {
277 assertNull(parser.parse("deadbeef"));
278 assertNull(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
279 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700280}