Browse Source
Shadow commits in the RevWalk in the UploadPack object may cause the UNINTERESTING flag not being carried over to their parents commits since they were marked NO_PARENTS during the assumeShallow or initializeShallowCommits call. A new RevWalk needs to be created for this reason, but instead of creating a new RevWalk from Repository, we can reuse the ObjectReader in the RevWalk of UploadPack to load objects. Change-Id: Ic3fee0512d35b4f555c60e696a880f8b192e4439 Signed-off-by: Zhen Chen <czhen@google.com>stable-4.9
Zhen Chen
7 years ago
2 changed files with 117 additions and 26 deletions
@ -0,0 +1,90 @@ |
|||||||
|
package org.eclipse.jgit.transport; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse; |
||||||
|
import static org.junit.Assert.assertTrue; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; |
||||||
|
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; |
||||||
|
import org.eclipse.jgit.junit.TestRepository; |
||||||
|
import org.eclipse.jgit.lib.NullProgressMonitor; |
||||||
|
import org.eclipse.jgit.lib.Repository; |
||||||
|
import org.eclipse.jgit.revwalk.RevCommit; |
||||||
|
import org.eclipse.jgit.transport.UploadPack.RequestPolicy; |
||||||
|
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; |
||||||
|
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; |
||||||
|
import org.eclipse.jgit.transport.resolver.UploadPackFactory; |
||||||
|
import org.junit.After; |
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for server upload-pack utilities. |
||||||
|
*/ |
||||||
|
public class UploadPackTest { |
||||||
|
private URIish uri; |
||||||
|
|
||||||
|
private TestProtocol<Object> testProtocol; |
||||||
|
|
||||||
|
private Object ctx = new Object(); |
||||||
|
|
||||||
|
private InMemoryRepository server; |
||||||
|
|
||||||
|
private InMemoryRepository client; |
||||||
|
|
||||||
|
private RevCommit commit0; |
||||||
|
|
||||||
|
private RevCommit commit1; |
||||||
|
|
||||||
|
private RevCommit tip; |
||||||
|
|
||||||
|
@Before |
||||||
|
public void setUp() throws Exception { |
||||||
|
server = newRepo("server"); |
||||||
|
client = newRepo("client"); |
||||||
|
|
||||||
|
TestRepository<InMemoryRepository> remote = |
||||||
|
new TestRepository<>(server); |
||||||
|
commit0 = remote.commit().message("0").create(); |
||||||
|
commit1 = remote.commit().message("1").parent(commit0).create(); |
||||||
|
tip = remote.commit().message("2").parent(commit1).create(); |
||||||
|
remote.update("master", tip); |
||||||
|
} |
||||||
|
|
||||||
|
@After |
||||||
|
public void tearDown() { |
||||||
|
Transport.unregister(testProtocol); |
||||||
|
} |
||||||
|
|
||||||
|
private static InMemoryRepository newRepo(String name) { |
||||||
|
return new InMemoryRepository(new DfsRepositoryDescription(name)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testFetchParentOfShallowCommit() throws Exception { |
||||||
|
testProtocol = new TestProtocol<>( |
||||||
|
new UploadPackFactory<Object>() { |
||||||
|
@Override |
||||||
|
public UploadPack create(Object req, Repository db) |
||||||
|
throws ServiceNotEnabledException, |
||||||
|
ServiceNotAuthorizedException { |
||||||
|
UploadPack up = new UploadPack(db); |
||||||
|
up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT); |
||||||
|
// assume client has a shallow commit
|
||||||
|
up.getRevWalk().assumeShallow( |
||||||
|
Collections.singleton(commit1.getId())); |
||||||
|
return up; |
||||||
|
} |
||||||
|
}, null); |
||||||
|
uri = testProtocol.register(ctx, server); |
||||||
|
|
||||||
|
assertFalse(client.hasObject(commit0.toObjectId())); |
||||||
|
|
||||||
|
// Fetch of the parent of the shallow commit
|
||||||
|
try (Transport tn = testProtocol.open(uri, client, "server")) { |
||||||
|
tn.fetch(NullProgressMonitor.INSTANCE, |
||||||
|
Collections.singletonList(new RefSpec(commit0.name()))); |
||||||
|
assertTrue(client.hasObject(commit0.toObjectId())); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue