blob: ed3ed9b978ec172dc6a6f24b3a676cf711b81f51 [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 {
Dave Borowitzcf38c032016-05-02 11:06:23 -040044 repo =
David Pursehouse0cf7f382016-10-04 14:29:16 +090045 new TestRepository<>(
Dave Borowitzcf38c032016-05-02 11:06:23 -040046 new InMemoryRepository(new DfsRepositoryDescription("test")));
47 parser =
48 new RevisionParser(
49 repo.getRepository(),
50 new TestGitilesAccess(repo.getRepository()).forRequest(null),
51 new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
Dave Borowitz9de65952012-08-13 16:09:45 -070052 }
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();
Dave Borowitzcf38c032016-05-02 11:06:23 -040057 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", master)));
Dave Borowitzfde41fd2015-09-16 15:14:38 -040058 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();
Dave Borowitzcf38c032016-05-02 11:06:23 -040069 RevCommit merge = repo.branch("master").commit().parent(parent1).parent(parent2).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040070 assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", merge)));
71 assertThat(parser.parse("master^")).isEqualTo(new Result(Revision.peeled("master^", parent1)));
72 assertThat(parser.parse("master~1"))
73 .isEqualTo(new Result(Revision.peeled("master~1", parent1)));
74 assertThat(parser.parse("master^2"))
75 .isEqualTo(new Result(Revision.peeled("master^2", parent2)));
76 assertThat(parser.parse("master^3")).isNull();
77 assertThat(parser.parse("master~2")).isEqualTo(new Result(Revision.peeled("master~2", root)));
Dave Borowitz9de65952012-08-13 16:09:45 -070078 }
79
Dave Borowitzd40bdf12014-04-19 19:33:56 -070080 @Test
81 public void parseCommitShaVisibleFromHead() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -070082 RevCommit parent = repo.commit().create();
83 RevCommit commit = repo.branch("master").commit().parent(parent).create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -040084 assertThat(parser.parse(commit.name()))
85 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
86 assertThat(parser.parse(parent.name()))
87 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -070088
89 String abbrev = commit.name().substring(0, 6);
Dave Borowitzfde41fd2015-09-16 15:14:38 -040090 assertThat(parser.parse(abbrev)).isEqualTo(new Result(Revision.peeled(abbrev, commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -070091 }
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
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400100 assertThat(parser.parse(commit.name()))
101 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
102 assertThat(parser.parse(parent.name()))
103 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700104 }
105
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700106 @Test
107 public void parseCommitShaVisibleFromOther() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700108 RevCommit parent = repo.commit().create();
109 RevCommit commit = repo.commit().parent(parent).create();
110 repo.branch("master").commit().create();
111 repo.update("refs/tags/tag", repo.tag("tag", repo.commit().create()));
112 repo.update("refs/meta/config", commit);
113
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400114 assertThat(parser.parse(commit.name()))
115 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
116 assertThat(parser.parse(parent.name()))
117 .isEqualTo(new Result(Revision.peeled(parent.name(), parent)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700118 }
119
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700120 @Test
121 public void parseCommitShaVisibleFromChange() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700122 RevCommit parent = repo.commit().create();
123 RevCommit commit = repo.commit().parent(parent).create();
124 repo.branch("master").commit().create();
125 repo.update("refs/changes/01/0001", commit);
126
127 // Matches exactly.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400128 assertThat(parser.parse(commit.name()))
129 .isEqualTo(new Result(Revision.peeled(commit.name(), commit)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700130 // refs/changes/* is excluded from ancestry search.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400131 assertThat(parser.parse(parent.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700132 }
133
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700134 @Test
135 public void parseNonVisibleCommitSha() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700136 RevCommit other = repo.commit().create();
Dave Borowitza12b1472012-11-12 14:46:28 -0800137 repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400138 assertThat(parser.parse(other.name())).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700139
140 repo.branch("other").update(other);
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400141 assertThat(parser.parse(other.name()))
142 .isEqualTo(new Result(Revision.peeled(other.name(), other)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700143 }
144
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700145 @Test
146 public void parseDiffRevisions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700147 RevCommit parent = repo.commit().create();
148 RevCommit commit = repo.branch("master").commit().parent(parent).create();
149 RevCommit other = repo.branch("other").commit().create();
150
Dave Borowitzcf38c032016-05-02 11:06:23 -0400151 assertThat(parser.parse("master^..master"))
152 .isEqualTo(
153 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
154 assertThat(parser.parse("master^..master/"))
155 .isEqualTo(
156 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), "/"));
157 assertThat(parser.parse("master^..master/path/to/a/file"))
158 .isEqualTo(
159 new Result(
160 Revision.peeled("master", commit),
161 Revision.peeled("master^", parent),
162 "/path/to/a/file"));
163 assertThat(parser.parse("master^..master/path/to/a/..file"))
164 .isEqualTo(
165 new Result(
166 Revision.peeled("master", commit),
167 Revision.peeled("master^", parent),
168 "/path/to/a/..file"));
169 assertThat(parser.parse("refs/heads/master^..refs/heads/master"))
170 .isEqualTo(
171 new Result(
172 Revision.peeled("refs/heads/master", commit),
173 Revision.peeled("refs/heads/master^", parent),
174 ""));
175 assertThat(parser.parse("master~1..master"))
176 .isEqualTo(
177 new Result(Revision.peeled("master", commit), Revision.peeled("master~1", parent), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700178 // TODO(dborowitz): 2a2362fbb in JGit causes master~2 to resolve to master
179 // rather than null. Uncomment when upstream regression is fixed.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400180 //assertThat(parser.parse("master~2..master")).isNull();
Dave Borowitzcf38c032016-05-02 11:06:23 -0400181 assertThat(parser.parse("other..master"))
182 .isEqualTo(
183 new Result(Revision.peeled("master", commit), Revision.peeled("other", other), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700184 }
185
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700186 @Test
187 public void parseFirstParentExpression() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700188 RevCommit parent = repo.commit().create();
189 RevCommit commit = repo.branch("master").commit().parent(parent).create();
190
Dave Borowitzcf38c032016-05-02 11:06:23 -0400191 assertThat(parser.parse("master^!"))
192 .isEqualTo(
193 new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
194 assertThat(parser.parse("master^^!"))
195 .isEqualTo(new Result(Revision.peeled("master^", parent), Revision.NULL, ""));
196 assertThat(parser.parse(parent.name() + "^!"))
197 .isEqualTo(new Result(Revision.peeled(parent.name(), parent), Revision.NULL, ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700198
Dave Borowitza12b1472012-11-12 14:46:28 -0800199 repo.update("refs/tags/tag", repo.tag("tag", commit));
Dave Borowitzcf38c032016-05-02 11:06:23 -0400200 assertThat(parser.parse("tag^!"))
201 .isEqualTo(new Result(Revision.peeled("tag", commit), Revision.peeled("tag^", parent), ""));
202 assertThat(parser.parse("tag^^!"))
203 .isEqualTo(new Result(Revision.peeled("tag^", parent), Revision.NULL, ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700204 }
205
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700206 @Test
207 public void nonVisibleDiffShas() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700208 RevCommit other = repo.commit().create();
209 RevCommit master = repo.branch("master").commit().create();
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400210 assertThat(parser.parse("other..master")).isNull();
211 assertThat(parser.parse("master..other")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700212
213 repo.branch("other").update(other);
Dave Borowitzcf38c032016-05-02 11:06:23 -0400214 assertThat(parser.parse("other..master"))
215 .isEqualTo(
216 new Result(Revision.peeled("master", master), Revision.peeled("other", other), ""));
217 assertThat(parser.parse("master..other"))
218 .isEqualTo(
219 new Result(Revision.peeled("other", other), Revision.peeled("master", master), ""));
Dave Borowitz9de65952012-08-13 16:09:45 -0700220 }
221
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700222 @Test
223 public void parseTag() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700224 RevCommit master = repo.branch("master").commit().create();
225 RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
Dave Borowitzcf38c032016-05-02 11:06:23 -0400226 RevTag masterTagTag =
227 repo.update("refs/tags/master-tag-tag", repo.tag("master-tag-tag", master));
Dave Borowitz9de65952012-08-13 16:09:45 -0700228
Dave Borowitzcf38c032016-05-02 11:06:23 -0400229 assertThat(parser.parse("master-tag"))
230 .isEqualTo(new Result(new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)));
231 assertThat(parser.parse("master-tag-tag"))
232 .isEqualTo(
233 new Result(new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700234
235 RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
236 RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400237 assertThat(parser.parse("blob")).isEqualTo(new Result(Revision.peeled("blob", blob)));
238 assertThat(parser.parse("blob-tag"))
239 .isEqualTo(new Result(new Revision("blob-tag", blobTag, OBJ_TAG, blob, OBJ_BLOB)));
Dave Borowitz9de65952012-08-13 16:09:45 -0700240 }
241
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700242 @Test
243 public void parseUnsupportedRevisionExpressions() throws Exception {
Dave Borowitz9de65952012-08-13 16:09:45 -0700244 RevBlob blob = repo.blob("blob contents");
245 RevCommit master = repo.branch("master").commit().add("blob", blob).create();
246
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400247 assertThat(repo.getRepository().resolve("master^{}")).isEqualTo(master);
248 assertThat(parser.parse("master^{}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700249
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400250 assertThat(repo.getRepository().resolve("master^{commit}")).isEqualTo(master);
251 assertThat(parser.parse("master^{commit}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700252
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400253 assertThat(repo.getRepository().resolve("master:blob")).isEqualTo(blob);
254 assertThat(parser.parse("master:blob")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700255
256 // TestRepository has no simple way of setting the reflog.
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400257 //assertThat(repo.getRepository().resolve("master@{0}")).isEqualTo(null);
258 assertThat(parser.parse("master@{0}")).isNull();
Dave Borowitz9de65952012-08-13 16:09:45 -0700259 }
Dave Borowitz48ca6702013-04-09 11:52:41 -0700260
Dave Borowitzd40bdf12014-04-19 19:33:56 -0700261 @Test
262 public void parseMissingSha() throws Exception {
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400263 assertThat(parser.parse("deadbeef")).isNull();
264 assertThat(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).isNull();
Dave Borowitz48ca6702013-04-09 11:52:41 -0700265 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700266}