diff options
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java | 32 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java | 20 |
2 files changed, 44 insertions, 8 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java index d58e576984..bb33eefcee 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java @@ -298,6 +298,38 @@ public class UploadPackTest { } @Test + public void testFetchWithTreeZeroFilter() throws Exception { + InMemoryRepository server2 = newRepo("server2"); + try (TestRepository<InMemoryRepository> remote2 = new TestRepository<>( + server2)) { + RevBlob blob1 = remote2.blob("foobar"); + RevBlob blob2 = remote2.blob("fooba"); + RevTree tree = remote2.tree(remote2.file("1", blob1), + remote2.file("2", blob2)); + RevCommit commit = remote2.commit(tree); + remote2.update("master", commit); + + server2.getConfig().setBoolean("uploadpack", null, "allowfilter", + true); + + testProtocol = new TestProtocol<>((Object req, Repository db) -> { + UploadPack up = new UploadPack(db); + return up; + }, null); + uri = testProtocol.register(ctx, server2); + + try (Transport tn = testProtocol.open(uri, client, "server2")) { + tn.setFilterSpec(FilterSpec.withTreeDepthLimit(0)); + tn.fetch(NullProgressMonitor.INSTANCE, + Collections.singletonList(new RefSpec(commit.name()))); + assertFalse(client.getObjectDatabase().has(tree.toObjectId())); + assertFalse(client.getObjectDatabase().has(blob1.toObjectId())); + assertFalse(client.getObjectDatabase().has(blob2.toObjectId())); + } + } + } + + @Test public void testFetchWithNonSupportingServer() throws Exception { InMemoryRepository server2 = newRepo("server2"); try (TestRepository<InMemoryRepository> remote2 = new TestRepository<>( diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java index d09b5579fa..51e5a8f20c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FilterSpec.java @@ -10,6 +10,8 @@ package org.eclipse.jgit.transport; +import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_FILTER; + import java.text.MessageFormat; import org.eclipse.jgit.annotations.Nullable; @@ -146,14 +148,16 @@ public final class FilterSpec { */ @Nullable public String filterLine() { - if (blobLimit == 0) { - return GitProtocolConstants.OPTION_FILTER + " blob:none"; //$NON-NLS-1$ - } - - if (blobLimit > 0) { - return GitProtocolConstants.OPTION_FILTER + " blob:limit=" + blobLimit; //$NON-NLS-1$ + if (isNoOp()) { + return null; + } else if (blobLimit == 0 && treeDepthLimit == -1) { + return OPTION_FILTER + " blob:none"; //$NON-NLS-1$ + } else if (blobLimit > 0 && treeDepthLimit == -1) { + return OPTION_FILTER + " blob:limit=" + blobLimit; //$NON-NLS-1$ + } else if (blobLimit == -1 && treeDepthLimit >= 0) { + return OPTION_FILTER + " tree:" + treeDepthLimit; //$NON-NLS-1$ + } else { + throw new IllegalStateException(); } - - return null; } } |