blob: b8ed94db1f2b09a53cd50ce473556a05b6f72fbc [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),
Ronald Bhuleskar999a71d2021-11-19 15:24:51 -080049 new VisibilityCache(CacheBuilder.newBuilder().maximumSize(0)),
50 new BranchRedirect());
Dave Borowitz9de65952012-08-13 16:09:45 -070051 }
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 Borowitzcf38c032016-05-02 11:06:23 -040056 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", master)));
Dave Borowitzfde41fd2015-09-16 15:14:38 -040057 assertThat(parser.parse("refs/heads/master"))
58 .isEqualTo(new Result(Revision.peeled("refs/heads/master", master)));
59 assertThat(parser.parse("refs//heads//master")).isNull();
60 assertThat(parser.parse("refs heads master")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -070061 }
62
Dave Borowitzd40bdf12014-04-19 19:33:56 -070063 @Test
64 public void parseRefParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070065 RevCommit root = repo.commit().create();
66 RevCommit parent1 = repo.commit().parent(root).create();
67 RevCommit parent2 = repo.commit().parent(root).create();
Dave Borowitzcf38c032016-05-02 11:06:23 -040068 RevCommit merge = repo.branch("master").commit().parent(parent1).parent(parent2).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040069 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", merge)));
70 assertThat(parser.parse("master^")).isEqualTo(new Result(Revision.peeled("master^", parent1)));
71 assertThat(parser.parse("master~1"))
72 .isEqualTo(new Result(Revision.peeled("master~1", parent1)));
73 assertThat(parser.parse("master^2"))
74 .isEqualTo(new Result(Revision.peeled("master^2", parent2)));
75 assertThat(parser.parse("master^3")).isNull();
76 assertThat(parser.parse("master~2")).isEqualTo(new Result(Revision.peeled("master~2", root)));
Dave Borowitz9de65952012-08-13 16:09:45 -070077 }
78
Dave Borowitzd40bdf12014-04-19 19:33:56 -070079 @Test
80 public void parseCommitShaVisibleFromHead() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070081 RevCommit parent = repo.commit().create();
82 RevCommit commit = repo.branch("master").commit().parent(parent).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040083 assertThat(parser.parse(commit.name()))
84 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
85 assertThat(parser.parse(parent.name()))
86 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -070087
88 String abbrev = commit.name().substring(0, 6);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040089 assertThat(parser.parse(abbrev)).isEqualTo(new Result(Revision.peeled(abbrev, commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -070090 }
91
Dave Borowitzd40bdf12014-04-19 19:33:56 -070092 @Test
93 public void parseCommitShaVisibleFromTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070094 RevCommit parent = repo.commit().create();
95 RevCommit commit = repo.commit().parent(parent).create();
96 repo.branch("master").commit().create();
97 repo.update("refs/tags/tag", repo.tag("tag", commit));
98
Dave Borowitzfde41fd2015-09-16 15:14:38 -040099 assertThat(parser.parse(commit.name()))
100 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
101 assertThat(parser.parse(parent.name()))
102 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700103 }
104
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700105 @Test
106 public void parseCommitShaVisibleFromOther() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700107 RevCommit parent = repo.commit().create();
108 RevCommit commit = repo.commit().parent(parent).create();
109 repo.branch("master").commit().create();
110 repo.update("refs/tags/tag", repo.tag("tag", repo.commit().create()));
111 repo.update("refs/meta/config", commit);
112
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400113 assertThat(parser.parse(commit.name()))
114 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
115 assertThat(parser.parse(parent.name()))
116 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700117 }
118
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700119 @Test
120 public void parseCommitShaVisibleFromChange() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700121 RevCommit parent = repo.commit().create();
122 RevCommit commit = repo.commit().parent(parent).create();
123 repo.branch("master").commit().create();
124 repo.update("refs/changes/01/0001", commit);
125
126 // Matches exactly.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400127 assertThat(parser.parse(commit.name()))
128 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700129 // refs/changes/* is excluded from ancestry search.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400130 assertThat(parser.parse(parent.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700131 }
132
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700133 @Test
134 public void parseNonVisibleCommitSha() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700135 RevCommit other = repo.commit().create();
Dave Borowitza12b1472012-11-12 14:46:28 -0800136 repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400137 assertThat(parser.parse(other.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700138
139 repo.branch("other").update(other);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400140 assertThat(parser.parse(other.name()))
141 .isEqualTo(new Result(Revision.peeled(other.name(), other)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700142 }
143
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700144 @Test
145 public void parseDiffRevisions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700146 RevCommit parent = repo.commit().create();
147 RevCommit commit = repo.branch("master").commit().parent(parent).create();
148 RevCommit other = repo.branch("other").commit().create();
149
Dave Borowitzcf38c032016-05-02 11:06:23 -0400150 assertThat(parser.parse("master^..master"))
151 .isEqualTo(
152 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
153 assertThat(parser.parse("master^..master/"))
154 .isEqualTo(
155 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), "/"));
156 assertThat(parser.parse("master^..master/path/to/a/file"))
157 .isEqualTo(
158 new Result(
159 Revision.peeled("master", commit),
160 Revision.peeled("master^", parent),
161 "/path/to/a/file"));
162 assertThat(parser.parse("master^..master/path/to/a/..file"))
163 .isEqualTo(
164 new Result(
165 Revision.peeled("master", commit),
166 Revision.peeled("master^", parent),
167 "/path/to/a/..file"));
168 assertThat(parser.parse("refs/heads/master^..refs/heads/master"))
169 .isEqualTo(
170 new Result(
171 Revision.peeled("refs/heads/master", commit),
172 Revision.peeled("refs/heads/master^", parent),
173 ""));
174 assertThat(parser.parse("master~1..master"))
175 .isEqualTo(
176 new Result(Revision.peeled("master", commit), Revision.peeled("master~1", parent), ""));
David Pursehouse2bf4a702018-08-09 22:33:50 +0100177 assertThat(parser.parse("master~2..master")).isNull();
Dave Borowitzcf38c032016-05-02 11:06:23 -0400178 assertThat(parser.parse("other..master"))
179 .isEqualTo(
180 new Result(Revision.peeled("master", commit), Revision.peeled("other", other), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700181 }
182
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700183 @Test
184 public void parseFirstParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700185 RevCommit parent = repo.commit().create();
186 RevCommit commit = repo.branch("master").commit().parent(parent).create();
187
Dave Borowitzcf38c032016-05-02 11:06:23 -0400188 assertThat(parser.parse("master^!"))
189 .isEqualTo(
190 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
191 assertThat(parser.parse("master^^!"))
192 .isEqualTo(new Result(Revision.peeled("master^", parent), Revision.NULL, ""));
193 assertThat(parser.parse(parent.name() + "^!"))
194 .isEqualTo(new Result(Revision.peeled(parent.name(), parent), Revision.NULL, ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700195
Dave Borowitza12b1472012-11-12 14:46:28 -0800196 repo.update("refs/tags/tag", repo.tag("tag", commit));
Dave Borowitzcf38c032016-05-02 11:06:23 -0400197 assertThat(parser.parse("tag^!"))
198 .isEqualTo(new Result(Revision.peeled("tag", commit), Revision.peeled("tag^", parent), ""));
199 assertThat(parser.parse("tag^^!"))
200 .isEqualTo(new Result(Revision.peeled("tag^", parent), Revision.NULL, ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700201 }
202
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700203 @Test
204 public void nonVisibleDiffShas() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700205 RevCommit other = repo.commit().create();
206 RevCommit master = repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400207 assertThat(parser.parse("other..master")).isNull();
208 assertThat(parser.parse("master..other")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700209
210 repo.branch("other").update(other);
Dave Borowitzcf38c032016-05-02 11:06:23 -0400211 assertThat(parser.parse("other..master"))
212 .isEqualTo(
213 new Result(Revision.peeled("master", master), Revision.peeled("other", other), ""));
214 assertThat(parser.parse("master..other"))
215 .isEqualTo(
216 new Result(Revision.peeled("other", other), Revision.peeled("master", master), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700217 }
218
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700219 @Test
220 public void parseTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700221 RevCommit master = repo.branch("master").commit().create();
222 RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
Dave Borowitzcf38c032016-05-02 11:06:23 -0400223 RevTag masterTagTag =
224 repo.update("refs/tags/master-tag-tag", repo.tag("master-tag-tag", master));
Dave Borowitz9de65952012-08-13 16:09:45 -0700225
Dave Borowitzcf38c032016-05-02 11:06:23 -0400226 assertThat(parser.parse("master-tag"))
227 .isEqualTo(new Result(new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)));
228 assertThat(parser.parse("master-tag-tag"))
229 .isEqualTo(
230 new Result(new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700231
232 RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
233 RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400234 assertThat(parser.parse("blob")).isEqualTo(new Result(Revision.peeled("blob", blob)));
235 assertThat(parser.parse("blob-tag"))
236 .isEqualTo(new Result(new Revision("blob-tag", blobTag, OBJ_TAG, blob, OBJ_BLOB)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700237 }
238
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700239 @Test
240 public void parseUnsupportedRevisionExpressions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700241 RevBlob blob = repo.blob("blob contents");
242 RevCommit master = repo.branch("master").commit().add("blob", blob).create();
243
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400244 assertThat(repo.getRepository().resolve("master^{}")).isEqualTo(master);
245 assertThat(parser.parse("master^{}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700246
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400247 assertThat(repo.getRepository().resolve("master^{commit}")).isEqualTo(master);
248 assertThat(parser.parse("master^{commit}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700249
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400250 assertThat(repo.getRepository().resolve("master:blob")).isEqualTo(blob);
251 assertThat(parser.parse("master:blob")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700252
Dave Borowitz63de61a2018-08-15 14:05:55 -0700253 // InMemoryRepository doesn't implement a reflog, so we can't test reflog entries.
254 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=537972
David Pursehouse0138abf2018-07-25 10:00:17 +0100255 // assertThat(repo.getRepository().resolve("master@{0}")).isEqualTo(null);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400256 assertThat(parser.parse("master@{0}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700257 }
Dave Borowitz48ca6702013-04-09 11:52:41 -0700258
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700259 @Test
Jonathan Nieder4a7dac02019-07-01 16:15:03 -0700260 public void parseEmailInRevision() throws Exception {
261 RevCommit c = repo.commit().create();
David Pursehouse12fda932019-07-10 10:11:21 +0900262 repo.update("refs/experimental/[email protected]/foo", c);
Jonathan Nieder4a7dac02019-07-01 16:15:03 -0700263 assertThat(parser.parse("refs/experimental/[email protected]/foo"))
264 .isEqualTo(new Result(Revision.peeled("refs/experimental/[email protected]/foo", c)));
265 }
266
267 @Test
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700268 public void parseMissingSha() throws Exception {
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400269 assertThat(parser.parse("deadbeef")).isNull();
270 assertThat(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).isNull();
Dave Borowitz48ca6702013-04-09 11:52:41 -0700271 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700272}