|
|
|
@ -85,6 +85,7 @@ import org.eclipse.jgit.errors.RemoteRepositoryException;
|
|
|
|
|
import org.eclipse.jgit.errors.TransportException; |
|
|
|
|
import org.eclipse.jgit.errors.UnsupportedCredentialItem; |
|
|
|
|
import org.eclipse.jgit.http.server.GitServlet; |
|
|
|
|
import org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory; |
|
|
|
|
import org.eclipse.jgit.internal.JGitText; |
|
|
|
|
import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; |
|
|
|
|
import org.eclipse.jgit.junit.TestRepository; |
|
|
|
@ -105,24 +106,35 @@ import org.eclipse.jgit.lib.Repository;
|
|
|
|
|
import org.eclipse.jgit.lib.StoredConfig; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevBlob; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevCommit; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevWalk; |
|
|
|
|
import org.eclipse.jgit.storage.file.FileBasedConfig; |
|
|
|
|
import org.eclipse.jgit.transport.AbstractAdvertiseRefsHook; |
|
|
|
|
import org.eclipse.jgit.transport.AdvertiseRefsHook; |
|
|
|
|
import org.eclipse.jgit.transport.CredentialItem; |
|
|
|
|
import org.eclipse.jgit.transport.CredentialsProvider; |
|
|
|
|
import org.eclipse.jgit.transport.FetchConnection; |
|
|
|
|
import org.eclipse.jgit.transport.HttpTransport; |
|
|
|
|
import org.eclipse.jgit.transport.RefSpec; |
|
|
|
|
import org.eclipse.jgit.transport.RemoteRefUpdate; |
|
|
|
|
import org.eclipse.jgit.transport.Transport; |
|
|
|
|
import org.eclipse.jgit.transport.TransportHttp; |
|
|
|
|
import org.eclipse.jgit.transport.URIish; |
|
|
|
|
import org.eclipse.jgit.transport.UploadPack; |
|
|
|
|
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; |
|
|
|
|
import org.eclipse.jgit.transport.http.HttpConnectionFactory; |
|
|
|
|
import org.eclipse.jgit.transport.http.JDKHttpConnectionFactory; |
|
|
|
|
import org.eclipse.jgit.transport.http.apache.HttpClientConnectionFactory; |
|
|
|
|
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; |
|
|
|
|
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; |
|
|
|
|
import org.eclipse.jgit.transport.resolver.UploadPackFactory; |
|
|
|
|
import org.eclipse.jgit.util.FS; |
|
|
|
|
import org.eclipse.jgit.util.HttpSupport; |
|
|
|
|
import org.eclipse.jgit.util.SystemReader; |
|
|
|
|
import org.hamcrest.Matchers; |
|
|
|
|
import org.junit.Before; |
|
|
|
|
import org.junit.Rule; |
|
|
|
|
import org.junit.Test; |
|
|
|
|
import org.junit.rules.ExpectedException; |
|
|
|
|
import org.junit.runner.RunWith; |
|
|
|
|
import org.junit.runners.Parameterized; |
|
|
|
|
import org.junit.runners.Parameterized.Parameters; |
|
|
|
@ -131,6 +143,11 @@ import org.junit.runners.Parameterized.Parameters;
|
|
|
|
|
public class SmartClientSmartServerTest extends HttpTestCase { |
|
|
|
|
private static final String HDR_TRANSFER_ENCODING = "Transfer-Encoding"; |
|
|
|
|
|
|
|
|
|
@Rule |
|
|
|
|
public ExpectedException thrown = ExpectedException.none(); |
|
|
|
|
|
|
|
|
|
private AdvertiseRefsHook advertiseRefsHook; |
|
|
|
|
|
|
|
|
|
private Repository remoteRepository; |
|
|
|
|
|
|
|
|
|
private CredentialsProvider testCredentials = new UsernamePasswordCredentialsProvider( |
|
|
|
@ -148,7 +165,7 @@ public class SmartClientSmartServerTest extends HttpTestCase {
|
|
|
|
|
|
|
|
|
|
private RevBlob A_txt; |
|
|
|
|
|
|
|
|
|
private RevCommit A, B; |
|
|
|
|
private RevCommit A, B, unreachableCommit; |
|
|
|
|
|
|
|
|
|
@Parameters |
|
|
|
|
public static Collection<Object[]> data() { |
|
|
|
@ -175,6 +192,19 @@ public class SmartClientSmartServerTest extends HttpTestCase {
|
|
|
|
|
ConfigConstants.CONFIG_KEY_LOGALLREFUPDATES, true); |
|
|
|
|
|
|
|
|
|
GitServlet gs = new GitServlet(); |
|
|
|
|
gs.setUploadPackFactory(new UploadPackFactory<HttpServletRequest>() { |
|
|
|
|
@Override |
|
|
|
|
public UploadPack create(HttpServletRequest req, Repository db) |
|
|
|
|
throws ServiceNotEnabledException, |
|
|
|
|
ServiceNotAuthorizedException { |
|
|
|
|
DefaultUploadPackFactory f = new DefaultUploadPackFactory(); |
|
|
|
|
UploadPack up = f.create(req, db); |
|
|
|
|
if (advertiseRefsHook != null) { |
|
|
|
|
up.setAdvertiseRefsHook(advertiseRefsHook); |
|
|
|
|
} |
|
|
|
|
return up; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
ServletContextHandler app = addNormalContext(gs, src, srcName); |
|
|
|
|
|
|
|
|
@ -200,6 +230,8 @@ public class SmartClientSmartServerTest extends HttpTestCase {
|
|
|
|
|
B = src.commit().parent(A).add("A_txt", "C").add("B", "B").create(); |
|
|
|
|
src.update(master, B); |
|
|
|
|
|
|
|
|
|
unreachableCommit = src.commit().add("A_txt", A_txt).create(); |
|
|
|
|
|
|
|
|
|
src.update("refs/garbage/a/very/long/ref/name/to/compress", B); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -452,6 +484,56 @@ public class SmartClientSmartServerTest extends HttpTestCase {
|
|
|
|
|
info.getResponseHeader(HDR_CONTENT_TYPE)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testFetchBySHA1() throws Exception { |
|
|
|
|
Repository dst = createBareRepository(); |
|
|
|
|
assertFalse(dst.hasObject(A_txt)); |
|
|
|
|
|
|
|
|
|
try (Transport t = Transport.open(dst, remoteURI)) { |
|
|
|
|
t.fetch(NullProgressMonitor.INSTANCE, |
|
|
|
|
Collections.singletonList(new RefSpec(B.name()))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assertTrue(dst.hasObject(A_txt)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testFetchBySHA1Unreachable() throws Exception { |
|
|
|
|
Repository dst = createBareRepository(); |
|
|
|
|
assertFalse(dst.hasObject(A_txt)); |
|
|
|
|
|
|
|
|
|
try (Transport t = Transport.open(dst, remoteURI)) { |
|
|
|
|
thrown.expect(TransportException.class); |
|
|
|
|
thrown.expectMessage(Matchers.containsString( |
|
|
|
|
"want " + unreachableCommit.name() + " not valid")); |
|
|
|
|
t.fetch(NullProgressMonitor.INSTANCE, Collections |
|
|
|
|
.singletonList(new RefSpec(unreachableCommit.name()))); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testFetchBySHA1UnreachableByAdvertiseRefsHook() |
|
|
|
|
throws Exception { |
|
|
|
|
Repository dst = createBareRepository(); |
|
|
|
|
assertFalse(dst.hasObject(A_txt)); |
|
|
|
|
|
|
|
|
|
advertiseRefsHook = new AbstractAdvertiseRefsHook() { |
|
|
|
|
@Override |
|
|
|
|
protected Map<String, Ref> getAdvertisedRefs(Repository repository, |
|
|
|
|
RevWalk revWalk) { |
|
|
|
|
return Collections.emptyMap(); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
try (Transport t = Transport.open(dst, remoteURI)) { |
|
|
|
|
thrown.expect(TransportException.class); |
|
|
|
|
thrown.expectMessage(Matchers.containsString( |
|
|
|
|
"want " + A.name() + " not valid")); |
|
|
|
|
t.fetch(NullProgressMonitor.INSTANCE, Collections |
|
|
|
|
.singletonList(new RefSpec(A.name()))); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testInitialClone_Small() throws Exception { |
|
|
|
|
Repository dst = createBareRepository(); |
|
|
|
|