blob: c5f287142dda466a08b1f408a62020dedcf2f946 [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
Dave Borowitzfde41fd2015-09-16 15:14:38 -040017import static com.google.common.truth.Truth.assertThat;
Dave Borowitz9de65952012-08-13 16:09:45 -070018import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
19import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT;
20import static org.eclipse.jgit.lib.Constants.OBJ_TAG;
Dave Borowitz48ca6702013-04-09 11:52:41 -070021
Dave Borowitzd40bdf12014-04-19 19:33:56 -070022import com.google.common.cache.CacheBuilder;
23import com.google.gitiles.RevisionParser.Result;
Dave Borowitz9de65952012-08-13 16:09:45 -070024
Shawn Pearceb43b2d52013-03-18 10:55:15 -070025import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
26import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
27import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
Dave Borowitz9de65952012-08-13 16:09:45 -070028import org.eclipse.jgit.junit.TestRepository;
29import org.eclipse.jgit.revwalk.RevBlob;
30import org.eclipse.jgit.revwalk.RevCommit;
31import org.eclipse.jgit.revwalk.RevTag;
Dave Borowitzd40bdf12014-04-19 19:33:56 -070032import org.junit.Before;
33import org.junit.Test;
Dave Borowitz3dc854f2014-11-04 16:19:37 -080034import org.junit.runner.RunWith;
35import org.junit.runners.JUnit4;
Dave Borowitz9de65952012-08-13 16:09:45 -070036
37/** Tests for the revision parser. */
Dave Borowitz3dc854f2014-11-04 16:19:37 -080038@RunWith(JUnit4.class)
Dave Borowitzd40bdf12014-04-19 19:33:56 -070039public class RevisionParserTest {
Dave Borowitz9de65952012-08-13 16:09:45 -070040 private TestRepository<DfsRepository> repo;
41 private RevisionParser parser;
42
Dave Borowitzd40bdf12014-04-19 19:33:56 -070043 @Before
44 public void setUp() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070045 repo = new TestRepository<DfsRepository>(
46 new InMemoryRepository(new DfsRepositoryDescription("test")));
47 parser = new RevisionParser(
48 repo.getRepository(),
49 new TestGitilesAccess(repo.getRepository()).forRequest(null),
50 new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
51 }
52
Dave Borowitzd40bdf12014-04-19 19:33:56 -070053 @Test
54 public void parseRef() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070055 RevCommit master = repo.branch("refs/heads/master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040056 assertThat(parser.parse("master"))
57 .isEqualTo(new Result(Revision.peeled("master", master)));
58 assertThat(parser.parse("refs/heads/master"))
59 .isEqualTo(new Result(Revision.peeled("refs/heads/master", master)));
60 assertThat(parser.parse("refs//heads//master")).isNull();
61 assertThat(parser.parse("refs heads master")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -070062 }
63
Dave Borowitzd40bdf12014-04-19 19:33:56 -070064 @Test
65 public void parseRefParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070066 RevCommit root = repo.commit().create();
67 RevCommit parent1 = repo.commit().parent(root).create();
68 RevCommit parent2 = repo.commit().parent(root).create();
69 RevCommit merge = repo.branch("master").commit()
70 .parent(parent1)
71 .parent(parent2)
72 .create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040073 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", merge)));
74 assertThat(parser.parse("master^")).isEqualTo(new Result(Revision.peeled("master^", parent1)));
75 assertThat(parser.parse("master~1"))
76 .isEqualTo(new Result(Revision.peeled("master~1", parent1)));
77 assertThat(parser.parse("master^2"))
78 .isEqualTo(new Result(Revision.peeled("master^2", parent2)));
79 assertThat(parser.parse("master^3")).isNull();
80 assertThat(parser.parse("master~2")).isEqualTo(new Result(Revision.peeled("master~2", root)));
Dave Borowitz9de65952012-08-13 16:09:45 -070081 }
82
Dave Borowitzd40bdf12014-04-19 19:33:56 -070083 @Test
84 public void parseCommitShaVisibleFromHead() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070085 RevCommit parent = repo.commit().create();
86 RevCommit commit = repo.branch("master").commit().parent(parent).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040087 assertThat(parser.parse(commit.name()))
88 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
89 assertThat(parser.parse(parent.name()))
90 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -070091
92 String abbrev = commit.name().substring(0, 6);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040093 assertThat(parser.parse(abbrev)).isEqualTo(new Result(Revision.peeled(abbrev, commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -070094 }
95
Dave Borowitzd40bdf12014-04-19 19:33:56 -070096 @Test
97 public void parseCommitShaVisibleFromTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070098 RevCommit parent = repo.commit().create();
99 RevCommit commit = repo.commit().parent(parent).create();
100 repo.branch("master").commit().create();
101 repo.update("refs/tags/tag", repo.tag("tag", commit));
102
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400103 assertThat(parser.parse(commit.name()))
104 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
105 assertThat(parser.parse(parent.name()))
106 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700107 }
108
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700109 @Test
110 public void parseCommitShaVisibleFromOther() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700111 RevCommit parent = repo.commit().create();
112 RevCommit commit = repo.commit().parent(parent).create();
113 repo.branch("master").commit().create();
114 repo.update("refs/tags/tag", repo.tag("tag", repo.commit().create()));
115 repo.update("refs/meta/config", commit);
116
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400117 assertThat(parser.parse(commit.name()))
118 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
119 assertThat(parser.parse(parent.name()))
120 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700121 }
122
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700123 @Test
124 public void parseCommitShaVisibleFromChange() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700125 RevCommit parent = repo.commit().create();
126 RevCommit commit = repo.commit().parent(parent).create();
127 repo.branch("master").commit().create();
128 repo.update("refs/changes/01/0001", commit);
129
130 // Matches exactly.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400131 assertThat(parser.parse(commit.name()))
132 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700133 // refs/changes/* is excluded from ancestry search.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400134 assertThat(parser.parse(parent.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700135 }
136
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700137 @Test
138 public void parseNonVisibleCommitSha() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700139 RevCommit other = repo.commit().create();
Dave Borowitza12b1472012-11-12 14:46:28 -0800140 repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400141 assertThat(parser.parse(other.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700142
143 repo.branch("other").update(other);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400144 assertThat(parser.parse(other.name()))
145 .isEqualTo(new Result(Revision.peeled(other.name(), other)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700146 }
147
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700148 @Test
149 public void parseDiffRevisions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700150 RevCommit parent = repo.commit().create();
151 RevCommit commit = repo.branch("master").commit().parent(parent).create();
152 RevCommit other = repo.branch("other").commit().create();
153
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400154 assertThat(parser.parse("master^..master")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700155 new Result(
156 Revision.peeled("master", commit),
157 Revision.peeled("master^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400158 ""));
159 assertThat(parser.parse("master^..master/")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700160 new Result(
161 Revision.peeled("master", commit),
162 Revision.peeled("master^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400163 "/"));
164 assertThat(parser.parse("master^..master/path/to/a/file")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700165 new Result(
166 Revision.peeled("master", commit),
167 Revision.peeled("master^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400168 "/path/to/a/file"));
169 assertThat(parser.parse("master^..master/path/to/a/..file")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700170 new Result(
171 Revision.peeled("master", commit),
172 Revision.peeled("master^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400173 "/path/to/a/..file"));
174 assertThat(parser.parse("refs/heads/master^..refs/heads/master")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700175 new Result(
176 Revision.peeled("refs/heads/master", commit),
177 Revision.peeled("refs/heads/master^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400178 ""));
179 assertThat(parser.parse("master~1..master")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700180 new Result(
181 Revision.peeled("master", commit),
182 Revision.peeled("master~1", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400183 ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700184 // TODO(dborowitz): 2a2362fbb in JGit causes master~2 to resolve to master
185 // rather than null. Uncomment when upstream regression is fixed.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400186 //assertThat(parser.parse("master~2..master")).isNull();
187 assertThat(parser.parse("other..master")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700188 new Result(
189 Revision.peeled("master", commit),
190 Revision.peeled("other", other),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400191 ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700192 }
193
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700194 @Test
195 public void parseFirstParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700196 RevCommit parent = repo.commit().create();
197 RevCommit commit = repo.branch("master").commit().parent(parent).create();
198
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400199 assertThat(parser.parse("master^!")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700200 new Result(
201 Revision.peeled("master", commit),
202 Revision.peeled("master^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400203 ""));
204 assertThat(parser.parse("master^^!")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700205 new Result(
206 Revision.peeled("master^", parent),
207 Revision.NULL,
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400208 ""));
209 assertThat(parser.parse(parent.name() + "^!")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700210 new Result(
211 Revision.peeled(parent.name(), parent),
212 Revision.NULL,
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400213 ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700214
Dave Borowitza12b1472012-11-12 14:46:28 -0800215 repo.update("refs/tags/tag", repo.tag("tag", commit));
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400216 assertThat(parser.parse("tag^!")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700217 new Result(
218 Revision.peeled("tag", commit),
219 Revision.peeled("tag^", parent),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400220 ""));
221 assertThat(parser.parse("tag^^!")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700222 new Result(
223 Revision.peeled("tag^", parent),
224 Revision.NULL,
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400225 ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700226 }
227
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700228 @Test
229 public void nonVisibleDiffShas() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700230 RevCommit other = repo.commit().create();
231 RevCommit master = repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400232 assertThat(parser.parse("other..master")).isNull();
233 assertThat(parser.parse("master..other")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700234
235 repo.branch("other").update(other);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400236 assertThat(parser.parse("other..master")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700237 new Result(
238 Revision.peeled("master", master),
239 Revision.peeled("other", other),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400240 ""));
241 assertThat(parser.parse("master..other")).isEqualTo(
Dave Borowitz9de65952012-08-13 16:09:45 -0700242 new Result(
243 Revision.peeled("other", other),
244 Revision.peeled("master", master),
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400245 ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700246 }
247
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700248 @Test
249 public void parseTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700250 RevCommit master = repo.branch("master").commit().create();
251 RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
252 RevTag masterTagTag = repo.update("refs/tags/master-tag-tag",
253 repo.tag("master-tag-tag", master));
254
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400255 assertThat(parser.parse("master-tag")).isEqualTo(
256 new Result(new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)));
257 assertThat(parser.parse("master-tag-tag")).isEqualTo(
258 new Result(new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700259
260 RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
261 RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400262 assertThat(parser.parse("blob")).isEqualTo(new Result(Revision.peeled("blob", blob)));
263 assertThat(parser.parse("blob-tag"))
264 .isEqualTo(new Result(new Revision("blob-tag", blobTag, OBJ_TAG, blob, OBJ_BLOB)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700265 }
266
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700267 @Test
268 public void parseUnsupportedRevisionExpressions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700269 RevBlob blob = repo.blob("blob contents");
270 RevCommit master = repo.branch("master").commit().add("blob", blob).create();
271
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400272 assertThat(repo.getRepository().resolve("master^{}")).isEqualTo(master);
273 assertThat(parser.parse("master^{}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700274
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400275 assertThat(repo.getRepository().resolve("master^{commit}")).isEqualTo(master);
276 assertThat(parser.parse("master^{commit}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700277
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400278 assertThat(repo.getRepository().resolve("master:blob")).isEqualTo(blob);
279 assertThat(parser.parse("master:blob")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700280
281 // TestRepository has no simple way of setting the reflog.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400282 //assertThat(repo.getRepository().resolve("master@{0}")).isEqualTo(null);
283 assertThat(parser.parse("master@{0}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700284 }
Dave Borowitz48ca6702013-04-09 11:52:41 -0700285
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700286 @Test
287 public void parseMissingSha() throws Exception {
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400288 assertThat(parser.parse("deadbeef")).isNull();
289 assertThat(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).isNull();
Dave Borowitz48ca6702013-04-09 11:52:41 -0700290 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700291}