Merge branch 'stable-3.5'
* stable-3.5:
Don't attempt to cache refs containing '[:|@]' in resolve call
Change-Id: Ia6128b70c22eef310f870427fc12f6fde5d129b1
diff --git a/src/main/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepository.java b/src/main/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepository.java
index dada373..6710188 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepository.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepository.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.cachedrefdb;
+import com.google.common.base.CharMatcher;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.server.git.DelegateRepository;
import com.google.inject.Inject;
@@ -58,6 +59,8 @@
private final RefUpdateWithCacheUpdate.Factory updateFactory;
private final RefRenameWithCacheUpdate.Factory renameFactory;
+ private static final CharMatcher REVISION_CHARS = CharMatcher.anyOf("^~:@");
+
@Inject
CachedRefRepository(
CachedRefDatabase.Factory refDbFactory,
@@ -365,6 +368,6 @@
}
private boolean isCacheableReference(String ref) {
- return ref.startsWith(RefNames.REFS) && !(ref.contains("^") || ref.contains("~"));
+ return ref.startsWith(RefNames.REFS) && REVISION_CHARS.matchesNoneOf(ref);
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepositoryIT.java b/src/test/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepositoryIT.java
index 5f2c2e4..b04cac0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepositoryIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/cachedrefdb/CachedRefRepositoryIT.java
@@ -21,10 +21,12 @@
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.registration.DynamicItem;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Optional;
import java.util.concurrent.Callable;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
@@ -33,16 +35,28 @@
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
public class CachedRefRepositoryIT {
- TestRepository<Repository> tr;
- CachedRefRepository objectUnderTest;
- TestRefByNameCacheImpl cache;
+ @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ private TestRepository<Repository> tr;
+ private CachedRefRepository objectUnderTest;
+ private TestRefByNameCacheImpl cache;
@Before
public void setUp() throws IOException {
- Repository repo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
+ Path repoPath = temporaryFolder.newFolder().toPath();
+ Repository repo = new FileRepository(repoPath.toFile());
+ repo.create(true);
+
+ // enable reflog for a repository so that references to it could be resolved
+ Files.write(
+ repoPath.resolve("config"),
+ "[core]\n logAllRefUpdates = true\n".getBytes(StandardCharsets.UTF_8));
+
objectUnderTest = createCachedRepository(repo);
tr = new TestRepository<>(repo);
}
@@ -72,7 +86,8 @@
@Test
public void shouldNotResolveRefsFromCache() throws Exception {
String master = RefNames.fullName("master");
- RevCommit first = tr.update(master, tr.commit().add("first", "foo").create());
+ String filename = "first";
+ RevCommit first = tr.update(master, tr.commit().add(filename, "foo").create());
String tag = "test_tag";
String fullTag = RefNames.REFS_TAGS + tag;
tr.update(fullTag, tr.tag(tag, first));
@@ -92,6 +107,14 @@
assertThat(resolvedByTilde).isEqualTo(first);
assertThat(resolvedByTilde).isEqualTo(repo().resolve(mastersParent));
+ String mastersFilename = master + ":" + filename;
+ ObjectId resolvedByFilename = objectUnderTest.resolve(mastersFilename);
+ assertThat(resolvedByFilename).isEqualTo(repo().resolve(mastersFilename));
+
+ String mastersPreviousRevision = master + "@{1}";
+ ObjectId resolvedByPreviousRevision = objectUnderTest.resolve(mastersPreviousRevision);
+ assertThat(resolvedByPreviousRevision).isEqualTo(repo().resolve(mastersPreviousRevision));
+
assertThat(cache.cacheCalled).isEqualTo(0);
}