blob: b2c88ea584a9a2dc8e7cabc7dc2bd6da5b23e16f [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;
Shawn Pearceb43b2d52013-03-18 10:55:15 -070024import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
25import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
26import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
Dave Borowitz9de65952012-08-13 16:09:45 -070027import org.eclipse.jgit.junit.TestRepository;
28import org.eclipse.jgit.revwalk.RevBlob;
29import org.eclipse.jgit.revwalk.RevCommit;
30import org.eclipse.jgit.revwalk.RevTag;
Dave Borowitzd40bdf12014-04-19 19:33:56 -070031import org.junit.Before;
32import org.junit.Test;
Dave Borowitz3dc854f2014-11-04 16:19:37 -080033import org.junit.runner.RunWith;
34import org.junit.runners.JUnit4;
Dave Borowitz9de65952012-08-13 16:09:45 -070035
36/** Tests for the revision parser. */
Dave Borowitz3dc854f2014-11-04 16:19:37 -080037@RunWith(JUnit4.class)
Dave Borowitzd40bdf12014-04-19 19:33:56 -070038public class RevisionParserTest {
Dave Borowitz9de65952012-08-13 16:09:45 -070039 private TestRepository<DfsRepository> repo;
40 private RevisionParser parser;
41
Dave Borowitzd40bdf12014-04-19 19:33:56 -070042 @Before
43 public void setUp() throws Exception {
David Pursehouseccaa85d2017-05-30 10:47:27 +090044 repo = new TestRepository<>(new InMemoryRepository(new DfsRepositoryDescription("test")));
Dave Borowitzcf38c032016-05-02 11:06:23 -040045 parser =
46 new RevisionParser(
47 repo.getRepository(),
48 new TestGitilesAccess(repo.getRepository()).forRequest(null),
49 new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
Dave Borowitz9de65952012-08-13 16:09:45 -070050 }
51
Dave Borowitzd40bdf12014-04-19 19:33:56 -070052 @Test
53 public void parseRef() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070054 RevCommit master = repo.branch("refs/heads/master").commit().create();
Dave Borowitzcf38c032016-05-02 11:06:23 -040055 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", master)));
Dave Borowitzfde41fd2015-09-16 15:14:38 -040056 assertThat(parser.parse("refs/heads/master"))
57 .isEqualTo(new Result(Revision.peeled("refs/heads/master", master)));
58 assertThat(parser.parse("refs//heads//master")).isNull();
59 assertThat(parser.parse("refs heads master")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -070060 }
61
Dave Borowitzd40bdf12014-04-19 19:33:56 -070062 @Test
63 public void parseRefParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070064 RevCommit root = repo.commit().create();
65 RevCommit parent1 = repo.commit().parent(root).create();
66 RevCommit parent2 = repo.commit().parent(root).create();
Dave Borowitzcf38c032016-05-02 11:06:23 -040067 RevCommit merge = repo.branch("master").commit().parent(parent1).parent(parent2).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040068 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", merge)));
69 assertThat(parser.parse("master^")).isEqualTo(new Result(Revision.peeled("master^", parent1)));
70 assertThat(parser.parse("master~1"))
71 .isEqualTo(new Result(Revision.peeled("master~1", parent1)));
72 assertThat(parser.parse("master^2"))
73 .isEqualTo(new Result(Revision.peeled("master^2", parent2)));
74 assertThat(parser.parse("master^3")).isNull();
75 assertThat(parser.parse("master~2")).isEqualTo(new Result(Revision.peeled("master~2", root)));
Dave Borowitz9de65952012-08-13 16:09:45 -070076 }
77
Dave Borowitzd40bdf12014-04-19 19:33:56 -070078 @Test
79 public void parseCommitShaVisibleFromHead() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070080 RevCommit parent = repo.commit().create();
81 RevCommit commit = repo.branch("master").commit().parent(parent).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040082 assertThat(parser.parse(commit.name()))
83 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
84 assertThat(parser.parse(parent.name()))
85 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -070086
87 String abbrev = commit.name().substring(0, 6);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040088 assertThat(parser.parse(abbrev)).isEqualTo(new Result(Revision.peeled(abbrev, commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -070089 }
90
Dave Borowitzd40bdf12014-04-19 19:33:56 -070091 @Test
92 public void parseCommitShaVisibleFromTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070093 RevCommit parent = repo.commit().create();
94 RevCommit commit = repo.commit().parent(parent).create();
95 repo.branch("master").commit().create();
96 repo.update("refs/tags/tag", repo.tag("tag", commit));
97
Dave Borowitzfde41fd2015-09-16 15:14:38 -040098 assertThat(parser.parse(commit.name()))
99 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
100 assertThat(parser.parse(parent.name()))
101 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700102 }
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
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400112 assertThat(parser.parse(commit.name()))
113 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
114 assertThat(parser.parse(parent.name()))
115 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700116 }
117
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700118 @Test
119 public void parseCommitShaVisibleFromChange() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700120 RevCommit parent = repo.commit().create();
121 RevCommit commit = repo.commit().parent(parent).create();
122 repo.branch("master").commit().create();
123 repo.update("refs/changes/01/0001", commit);
124
125 // Matches exactly.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400126 assertThat(parser.parse(commit.name()))
127 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700128 // refs/changes/* is excluded from ancestry search.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400129 assertThat(parser.parse(parent.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700130 }
131
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700132 @Test
133 public void parseNonVisibleCommitSha() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700134 RevCommit other = repo.commit().create();
Dave Borowitza12b1472012-11-12 14:46:28 -0800135 repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400136 assertThat(parser.parse(other.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700137
138 repo.branch("other").update(other);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400139 assertThat(parser.parse(other.name()))
140 .isEqualTo(new Result(Revision.peeled(other.name(), other)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700141 }
142
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700143 @Test
144 public void parseDiffRevisions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700145 RevCommit parent = repo.commit().create();
146 RevCommit commit = repo.branch("master").commit().parent(parent).create();
147 RevCommit other = repo.branch("other").commit().create();
148
Dave Borowitzcf38c032016-05-02 11:06:23 -0400149 assertThat(parser.parse("master^..master"))
150 .isEqualTo(
151 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
152 assertThat(parser.parse("master^..master/"))
153 .isEqualTo(
154 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), "/"));
155 assertThat(parser.parse("master^..master/path/to/a/file"))
156 .isEqualTo(
157 new Result(
158 Revision.peeled("master", commit),
159 Revision.peeled("master^", parent),
160 "/path/to/a/file"));
161 assertThat(parser.parse("master^..master/path/to/a/..file"))
162 .isEqualTo(
163 new Result(
164 Revision.peeled("master", commit),
165 Revision.peeled("master^", parent),
166 "/path/to/a/..file"));
167 assertThat(parser.parse("refs/heads/master^..refs/heads/master"))
168 .isEqualTo(
169 new Result(
170 Revision.peeled("refs/heads/master", commit),
171 Revision.peeled("refs/heads/master^", parent),
172 ""));
173 assertThat(parser.parse("master~1..master"))
174 .isEqualTo(
175 new Result(Revision.peeled("master", commit), Revision.peeled("master~1", parent), ""));
David Pursehouse2bf4a702018-08-09 22:33:50 +0100176 assertThat(parser.parse("master~2..master")).isNull();
Dave Borowitzcf38c032016-05-02 11:06:23 -0400177 assertThat(parser.parse("other..master"))
178 .isEqualTo(
179 new Result(Revision.peeled("master", commit), Revision.peeled("other", other), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700180 }
181
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700182 @Test
183 public void parseFirstParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700184 RevCommit parent = repo.commit().create();
185 RevCommit commit = repo.branch("master").commit().parent(parent).create();
186
Dave Borowitzcf38c032016-05-02 11:06:23 -0400187 assertThat(parser.parse("master^!"))
188 .isEqualTo(
189 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
190 assertThat(parser.parse("master^^!"))
191 .isEqualTo(new Result(Revision.peeled("master^", parent), Revision.NULL, ""));
192 assertThat(parser.parse(parent.name() + "^!"))
193 .isEqualTo(new Result(Revision.peeled(parent.name(), parent), Revision.NULL, ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700194
Dave Borowitza12b1472012-11-12 14:46:28 -0800195 repo.update("refs/tags/tag", repo.tag("tag", commit));
Dave Borowitzcf38c032016-05-02 11:06:23 -0400196 assertThat(parser.parse("tag^!"))
197 .isEqualTo(new Result(Revision.peeled("tag", commit), Revision.peeled("tag^", parent), ""));
198 assertThat(parser.parse("tag^^!"))
199 .isEqualTo(new Result(Revision.peeled("tag^", parent), Revision.NULL, ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700200 }
201
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700202 @Test
203 public void nonVisibleDiffShas() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700204 RevCommit other = repo.commit().create();
205 RevCommit master = repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400206 assertThat(parser.parse("other..master")).isNull();
207 assertThat(parser.parse("master..other")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700208
209 repo.branch("other").update(other);
Dave Borowitzcf38c032016-05-02 11:06:23 -0400210 assertThat(parser.parse("other..master"))
211 .isEqualTo(
212 new Result(Revision.peeled("master", master), Revision.peeled("other", other), ""));
213 assertThat(parser.parse("master..other"))
214 .isEqualTo(
215 new Result(Revision.peeled("other", other), Revision.peeled("master", master), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700216 }
217
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700218 @Test
219 public void parseTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700220 RevCommit master = repo.branch("master").commit().create();
221 RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
Dave Borowitzcf38c032016-05-02 11:06:23 -0400222 RevTag masterTagTag =
223 repo.update("refs/tags/master-tag-tag", repo.tag("master-tag-tag", master));
Dave Borowitz9de65952012-08-13 16:09:45 -0700224
Dave Borowitzcf38c032016-05-02 11:06:23 -0400225 assertThat(parser.parse("master-tag"))
226 .isEqualTo(new Result(new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)));
227 assertThat(parser.parse("master-tag-tag"))
228 .isEqualTo(
229 new Result(new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700230
231 RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
232 RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400233 assertThat(parser.parse("blob")).isEqualTo(new Result(Revision.peeled("blob", blob)));
234 assertThat(parser.parse("blob-tag"))
235 .isEqualTo(new Result(new Revision("blob-tag", blobTag, OBJ_TAG, blob, OBJ_BLOB)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700236 }
237
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700238 @Test
239 public void parseUnsupportedRevisionExpressions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700240 RevBlob blob = repo.blob("blob contents");
241 RevCommit master = repo.branch("master").commit().add("blob", blob).create();
242
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400243 assertThat(repo.getRepository().resolve("master^{}")).isEqualTo(master);
244 assertThat(parser.parse("master^{}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700245
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400246 assertThat(repo.getRepository().resolve("master^{commit}")).isEqualTo(master);
247 assertThat(parser.parse("master^{commit}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700248
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400249 assertThat(repo.getRepository().resolve("master:blob")).isEqualTo(blob);
250 assertThat(parser.parse("master:blob")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700251
Dave Borowitz63de61a2018-08-15 14:05:55 -0700252 // InMemoryRepository doesn't implement a reflog, so we can't test reflog entries.
253 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=537972
David Pursehouse0138abf2018-07-25 10:00:17 +0100254 // assertThat(repo.getRepository().resolve("master@{0}")).isEqualTo(null);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400255 assertThat(parser.parse("master@{0}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700256 }
Dave Borowitz48ca6702013-04-09 11:52:41 -0700257
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700258 @Test
Jonathan Nieder4a7dac02019-07-01 16:15:03 -0700259 public void parseEmailInRevision() throws Exception {
260 RevCommit c = repo.commit().create();
David Pursehouse12fda932019-07-10 10:11:21 +0900261 repo.update("refs/experimental/[email protected]/foo", c);
Jonathan Nieder4a7dac02019-07-01 16:15:03 -0700262 assertThat(parser.parse("refs/experimental/[email protected]/foo"))
263 .isEqualTo(new Result(Revision.peeled("refs/experimental/[email protected]/foo", c)));
264 }
265
266 @Test
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700267 public void parseMissingSha() throws Exception {
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400268 assertThat(parser.parse("deadbeef")).isNull();
269 assertThat(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).isNull();
Dave Borowitz48ca6702013-04-09 11:52:41 -0700270 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700271}