aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2022-06-26 15:36:03 -0400
committerGerrit Code Review @ Eclipse.org <gerrit@eclipse.org>2022-06-26 15:36:03 -0400
commitca6b518432b979e96312ccec99cc232c78225976 (patch)
treefc851613c7024605c10f76c2c20ad98482003f96
parent66ace4b9af137466a4dd6187a11e473351c306a8 (diff)
parent4bb46936332e9d66569810f0a77bb08bb46fc950 (diff)
downloadjgit-ca6b518432b979e96312ccec99cc232c78225976.tar.gz
jgit-ca6b518432b979e96312ccec99cc232c78225976.zip
Merge "Do not create reflog for remote tracking branches during clone" into stable-5.13
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java44
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java20
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java9
3 files changed, 71 insertions, 2 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
index de25870bd0..c928d2ad22 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
@@ -22,6 +22,7 @@ import java.net.URISyntaxException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.stream.Stream;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.GitAPIException;
@@ -115,6 +116,49 @@ public class CloneCommandTest extends RepositoryTestCase {
}
@Test
+ public void testCloneRepository_refLogForLocalRefs()
+ throws IOException, JGitInternalException, GitAPIException {
+ File directory = createTempDirectory("testCloneRepository");
+ CloneCommand command = Git.cloneRepository();
+ command.setDirectory(directory);
+ command.setURI(fileUri());
+ Git git2 = command.call();
+ Repository clonedRepo = git2.getRepository();
+ addRepoToClose(clonedRepo);
+
+ List<Ref> clonedRefs = clonedRepo.getRefDatabase().getRefs();
+ Stream<Ref> remoteRefs = clonedRefs.stream()
+ .filter(CloneCommandTest::isRemote);
+ Stream<Ref> localHeadsRefs = clonedRefs.stream()
+ .filter(CloneCommandTest::isLocalHead);
+
+ remoteRefs.forEach(ref -> assertFalse(
+ "Ref " + ref.getName()
+ + " is remote and should not have a reflog",
+ hasRefLog(clonedRepo, ref)));
+ localHeadsRefs.forEach(ref -> assertTrue(
+ "Ref " + ref.getName()
+ + " is local head and should have a reflog",
+ hasRefLog(clonedRepo, ref)));
+ }
+
+ private static boolean isRemote(Ref ref) {
+ return ref.getName().startsWith(Constants.R_REMOTES);
+ }
+
+ private static boolean isLocalHead(Ref ref) {
+ return !isRemote(ref) && ref.getName().startsWith(Constants.R_HEADS);
+ }
+
+ private static boolean hasRefLog(Repository repo, Ref ref) {
+ try {
+ return repo.getReflogReader(ref.getName()).getLastEntry() != null;
+ } catch (IOException ioe) {
+ throw new IllegalStateException(ioe);
+ }
+ }
+
+ @Test
public void testCloneRepositoryExplicitGitDir() throws IOException,
JGitInternalException, GitAPIException {
File directory = createTempDirectory("testCloneRepository");
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
index 6479d157eb..b608afa5c7 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/FetchCommandTest.java
@@ -77,6 +77,26 @@ public class FetchCommandTest extends RepositoryTestCase {
}
@Test
+ public void testFetchHasRefLogForRemoteRef() throws Exception {
+ // create an initial commit SHA1 for the default branch
+ ObjectId defaultBranchSha1 = remoteGit.commit()
+ .setMessage("initial commit").call().getId();
+
+ git.fetch().setRemote("test")
+ .setRefSpecs("refs/heads/*:refs/remotes/origin/*").call();
+
+ List<Ref> allFetchedRefs = git.getRepository().getRefDatabase()
+ .getRefs();
+ assertEquals(allFetchedRefs.size(), 1);
+ Ref remoteRef = allFetchedRefs.get(0);
+
+ assertTrue(remoteRef.getName().startsWith(Constants.R_REMOTES));
+ assertEquals(defaultBranchSha1, remoteRef.getObjectId());
+ assertNotNull(git.getRepository().getReflogReader(remoteRef.getName())
+ .getLastEntry());
+ }
+
+ @Test
public void testForcedFetch() throws Exception {
remoteGit.commit().setMessage("commit").call();
remoteGit.commit().setMessage("commit2").call();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java
index 34bad6e029..2cedd4b07e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java
@@ -205,8 +205,13 @@ class FetchProcess {
BatchRefUpdate batch = transport.local.getRefDatabase()
.newBatchUpdate()
- .setAllowNonFastForwards(true)
- .setRefLogMessage("fetch", true); //$NON-NLS-1$
+ .setAllowNonFastForwards(true);
+
+ // Generate reflog only when fetching updates and not at the first clone
+ if (initialBranch == null) {
+ batch.setRefLogMessage("fetch", true); //$NON-NLS-1$
+ }
+
try (RevWalk walk = new RevWalk(transport.local)) {
walk.setRetainBody(false);
if (monitor instanceof BatchingProgressMonitor) {