blob: 92711336c3ab2f7bfaa0b2203448920ecd0fc7a6 [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 Borowitzd40bdf12014-04-19 19:33:56 -070020import static org.junit.Assert.assertEquals;
21import static org.junit.Assert.assertNull;
Dave Borowitz48ca6702013-04-09 11:52:41 -070022
Dave Borowitzd40bdf12014-04-19 19:33:56 -070023import com.google.common.cache.CacheBuilder;
24import com.google.gitiles.RevisionParser.Result;
Dave Borowitz9de65952012-08-13 16:09:45 -070025
Shawn Pearceb43b2d52013-03-18 10:55:15 -070026import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
27import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
28import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
Dave Borowitz9de65952012-08-13 16:09:45 -070029import org.eclipse.jgit.junit.TestRepository;
30import org.eclipse.jgit.revwalk.RevBlob;
31import org.eclipse.jgit.revwalk.RevCommit;
32import org.eclipse.jgit.revwalk.RevTag;
Dave Borowitzd40bdf12014-04-19 19:33:56 -070033import org.junit.Before;
34import org.junit.Test;
Dave Borowitz3dc854f2014-11-04 16:19:37 -080035import org.junit.runner.RunWith;
36import org.junit.runners.JUnit4;
Dave Borowitz9de65952012-08-13 16:09:45 -070037
38/** Tests for the revision parser. */
Dave Borowitz3dc854f2014-11-04 16:19:37 -080039@RunWith(JUnit4.class)
Dave Borowitzd40bdf12014-04-19 19:33:56 -070040public class RevisionParserTest {
Dave Borowitz9de65952012-08-13 16:09:45 -070041 private TestRepository<DfsRepository> repo;
42 private RevisionParser parser;
43
Dave Borowitzd40bdf12014-04-19 19:33:56 -070044 @Before
45 public void setUp() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070046 repo = new TestRepository<DfsRepository>(
47 new InMemoryRepository(new DfsRepositoryDescription("test")));
48 parser = new RevisionParser(
49 repo.getRepository(),
50 new TestGitilesAccess(repo.getRepository()).forRequest(null),
51 new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
52 }
53
Dave Borowitzd40bdf12014-04-19 19:33:56 -070054 @Test
55 public void parseRef() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070056 RevCommit master = repo.branch("refs/heads/master").commit().create();
57 assertEquals(new Result(Revision.peeled("master", master)),
58 parser.parse("master"));
59 assertEquals(new Result(Revision.peeled("refs/heads/master", master)),
60 parser.parse("refs/heads/master"));
61 assertNull(parser.parse("refs//heads//master"));
Dave Borowitz5f7e8b72013-01-07 09:31:41 -080062 assertNull(parser.parse("refs heads master"));
Dave Borowitz9de65952012-08-13 16:09:45 -070063 }
64
Dave Borowitzd40bdf12014-04-19 19:33:56 -070065 @Test
66 public void parseRefParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070067 RevCommit root = repo.commit().create();
68 RevCommit parent1 = repo.commit().parent(root).create();
69 RevCommit parent2 = repo.commit().parent(root).create();
70 RevCommit merge = repo.branch("master").commit()
71 .parent(parent1)
72 .parent(parent2)
73 .create();
74 assertEquals(new Result(Revision.peeled("master", merge)), parser.parse("master"));
75 assertEquals(new Result(Revision.peeled("master^", parent1)), parser.parse("master^"));
76 assertEquals(new Result(Revision.peeled("master~1", parent1)), parser.parse("master~1"));
77 assertEquals(new Result(Revision.peeled("master^2", parent2)), parser.parse("master^2"));
Dave Borowitz5f7e8b72013-01-07 09:31:41 -080078 assertNull(parser.parse("master^3"));
Dave Borowitz9de65952012-08-13 16:09:45 -070079 assertEquals(new Result(Revision.peeled("master~2", root)), parser.parse("master~2"));
80 }
81
Dave Borowitzd40bdf12014-04-19 19:33:56 -070082 @Test
83 public void parseCommitShaVisibleFromHead() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070084 RevCommit parent = repo.commit().create();
85 RevCommit commit = repo.branch("master").commit().parent(parent).create();
86 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
87 assertEquals(new Result(Revision.peeled(parent.name(), parent)), parser.parse(parent.name()));
88
89 String abbrev = commit.name().substring(0, 6);
90 assertEquals(new Result(Revision.peeled(abbrev, commit)), parser.parse(abbrev));
91 }
92
Dave Borowitzd40bdf12014-04-19 19:33:56 -070093 @Test
94 public void parseCommitShaVisibleFromTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070095 RevCommit parent = repo.commit().create();
96 RevCommit commit = repo.commit().parent(parent).create();
97 repo.branch("master").commit().create();
98 repo.update("refs/tags/tag", repo.tag("tag", commit));
99
100 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
101 assertEquals(new Result(Revision.peeled(parent.name(), parent)), parser.parse(parent.name()));
102 }
103
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700104 @Test
105 public void parseCommitShaVisibleFromOther() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700106 RevCommit parent = repo.commit().create();
107 RevCommit commit = repo.commit().parent(parent).create();
108 repo.branch("master").commit().create();
109 repo.update("refs/tags/tag", repo.tag("tag", repo.commit().create()));
110 repo.update("refs/meta/config", commit);
111
112 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
113 assertEquals(new Result(Revision.peeled(parent.name(), parent)), parser.parse(parent.name()));
114 }
115
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700116 @Test
117 public void parseCommitShaVisibleFromChange() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700118 RevCommit parent = repo.commit().create();
119 RevCommit commit = repo.commit().parent(parent).create();
120 repo.branch("master").commit().create();
121 repo.update("refs/changes/01/0001", commit);
122
123 // Matches exactly.
124 assertEquals(new Result(Revision.peeled(commit.name(), commit)), parser.parse(commit.name()));
125 // refs/changes/* is excluded from ancestry search.
Dave Borowitz27058932014-12-03 15:44:46 -0800126 assertNull(parser.parse(parent.name()));
Dave Borowitz9de65952012-08-13 16:09:45 -0700127 }
128
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700129 @Test
130 public void parseNonVisibleCommitSha() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700131 RevCommit other = repo.commit().create();
Dave Borowitza12b1472012-11-12 14:46:28 -0800132 repo.branch("master").commit().create();
Dave Borowitz27058932014-12-03 15:44:46 -0800133 assertNull(parser.parse(other.name()));
Dave Borowitz9de65952012-08-13 16:09:45 -0700134
135 repo.branch("other").update(other);
136 assertEquals(new Result(Revision.peeled(other.name(), other)), parser.parse(other.name()));
137 }
138
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700139 @Test
140 public void parseDiffRevisions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700141 RevCommit parent = repo.commit().create();
142 RevCommit commit = repo.branch("master").commit().parent(parent).create();
143 RevCommit other = repo.branch("other").commit().create();
144
145 assertEquals(
146 new Result(
147 Revision.peeled("master", commit),
148 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700149 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700150 parser.parse("master^..master"));
151 assertEquals(
152 new Result(
153 Revision.peeled("master", commit),
154 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700155 "/"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700156 parser.parse("master^..master/"));
157 assertEquals(
158 new Result(
159 Revision.peeled("master", commit),
160 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700161 "/path/to/a/file"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700162 parser.parse("master^..master/path/to/a/file"));
163 assertEquals(
164 new Result(
165 Revision.peeled("master", commit),
166 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700167 "/path/to/a/..file"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700168 parser.parse("master^..master/path/to/a/..file"));
169 assertEquals(
170 new Result(
171 Revision.peeled("refs/heads/master", commit),
172 Revision.peeled("refs/heads/master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700173 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700174 parser.parse("refs/heads/master^..refs/heads/master"));
175 assertEquals(
176 new Result(
177 Revision.peeled("master", commit),
178 Revision.peeled("master~1", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700179 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700180 parser.parse("master~1..master"));
181 // TODO(dborowitz): 2a2362fbb in JGit causes master~2 to resolve to master
182 // rather than null. Uncomment when upstream regression is fixed.
183 //assertNull(parser.parse("master~2..master"));
184 assertEquals(
185 new Result(
186 Revision.peeled("master", commit),
187 Revision.peeled("other", other),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700188 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700189 parser.parse("other..master"));
190 }
191
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700192 @Test
193 public void parseFirstParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700194 RevCommit parent = repo.commit().create();
195 RevCommit commit = repo.branch("master").commit().parent(parent).create();
196
197 assertEquals(
198 new Result(
199 Revision.peeled("master", commit),
200 Revision.peeled("master^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700201 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700202 parser.parse("master^!"));
203 assertEquals(
204 new Result(
205 Revision.peeled("master^", parent),
206 Revision.NULL,
Dave Borowitz06b88d22013-06-19 15:19:14 -0700207 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700208 parser.parse("master^^!"));
209 assertEquals(
210 new Result(
211 Revision.peeled(parent.name(), parent),
212 Revision.NULL,
Dave Borowitz06b88d22013-06-19 15:19:14 -0700213 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700214 parser.parse(parent.name() + "^!"));
215
Dave Borowitza12b1472012-11-12 14:46:28 -0800216 repo.update("refs/tags/tag", repo.tag("tag", commit));
Dave Borowitz9de65952012-08-13 16:09:45 -0700217 assertEquals(
218 new Result(
219 Revision.peeled("tag", commit),
220 Revision.peeled("tag^", parent),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700221 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700222 parser.parse("tag^!"));
223 assertEquals(
224 new Result(
225 Revision.peeled("tag^", parent),
226 Revision.NULL,
Dave Borowitz06b88d22013-06-19 15:19:14 -0700227 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700228 parser.parse("tag^^!"));
229 }
230
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700231 @Test
232 public void nonVisibleDiffShas() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700233 RevCommit other = repo.commit().create();
234 RevCommit master = repo.branch("master").commit().create();
Dave Borowitz27058932014-12-03 15:44:46 -0800235 assertNull(parser.parse("other..master"));
236 assertNull(parser.parse("master..other"));
Dave Borowitz9de65952012-08-13 16:09:45 -0700237
238 repo.branch("other").update(other);
239 assertEquals(
240 new Result(
241 Revision.peeled("master", master),
242 Revision.peeled("other", other),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700243 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700244 parser.parse("other..master"));
245 assertEquals(
246 new Result(
247 Revision.peeled("other", other),
248 Revision.peeled("master", master),
Dave Borowitz06b88d22013-06-19 15:19:14 -0700249 ""),
Dave Borowitz9de65952012-08-13 16:09:45 -0700250 parser.parse("master..other"));
251 }
252
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700253 @Test
254 public void parseTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700255 RevCommit master = repo.branch("master").commit().create();
256 RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
257 RevTag masterTagTag = repo.update("refs/tags/master-tag-tag",
258 repo.tag("master-tag-tag", master));
259
260 assertEquals(new Result(
261 new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)),
262 parser.parse("master-tag"));
263 assertEquals(new Result(
264 new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)),
265 parser.parse("master-tag-tag"));
266
267 RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
268 RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
269 assertEquals(new Result(Revision.peeled("blob", blob)), parser.parse("blob"));
270 assertEquals(new Result(new Revision("blob-tag", blobTag, OBJ_TAG, blob, OBJ_BLOB)),
271 parser.parse("blob-tag"));
272 }
273
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700274 @Test
275 public void parseUnsupportedRevisionExpressions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700276 RevBlob blob = repo.blob("blob contents");
277 RevCommit master = repo.branch("master").commit().add("blob", blob).create();
278
279 assertEquals(master, repo.getRepository().resolve("master^{}"));
Dave Borowitz27058932014-12-03 15:44:46 -0800280 assertNull(parser.parse("master^{}"));
Dave Borowitz9de65952012-08-13 16:09:45 -0700281
282 assertEquals(master, repo.getRepository().resolve("master^{commit}"));
Dave Borowitz27058932014-12-03 15:44:46 -0800283 assertNull(parser.parse("master^{commit}"));
Dave Borowitz9de65952012-08-13 16:09:45 -0700284
285 assertEquals(blob, repo.getRepository().resolve("master:blob"));
Dave Borowitz27058932014-12-03 15:44:46 -0800286 assertNull(parser.parse("master:blob"));
Dave Borowitz9de65952012-08-13 16:09:45 -0700287
288 // TestRepository has no simple way of setting the reflog.
289 //assertEquals(null, repo.getRepository().resolve("master@{0}"));
Dave Borowitz27058932014-12-03 15:44:46 -0800290 assertNull(parser.parse("master@{0}"));
Dave Borowitz9de65952012-08-13 16:09:45 -0700291 }
Dave Borowitz48ca6702013-04-09 11:52:41 -0700292
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700293 @Test
294 public void parseMissingSha() throws Exception {
Dave Borowitz48ca6702013-04-09 11:52:41 -0700295 assertNull(parser.parse("deadbeef"));
296 assertNull(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
297 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700298}