summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorMatthew DeVore <matvore@gmail.com>2019-03-27 14:35:51 -0700
committerMatthew DeVore <matvore@gmail.com>2019-04-16 10:36:59 -0700
commit0a15cb3a2bc14feec11baa1977567179ce3094bc (patch)
tree22d098af157f4e21ef273e0f30be4d7e2001ed74 /org.eclipse.jgit.test
parent175e66548b78e6d22ad27d62eeb06a77ee4d139d (diff)
downloadjgit-0a15cb3a2bc14feec11baa1977567179ce3094bc.tar.gz
jgit-0a15cb3a2bc14feec11baa1977567179ce3094bc.zip
tree:<depth>: do not revisit tree during packing
If a tree is visited during pack and filtered out with tree:<depth>, we may need to include it if it is visited again at a lower depth. Until now we revisit it no matter what the depth is. Now, avoid visiting it if it has been visited at a lower or equal depth. Change-Id: I68cc1d08f1999a8336684a05fe16e7ae51898866 Signed-off-by: Matthew DeVore <matvore@gmail.com>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java122
1 files changed, 122 insertions, 0 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 f5470729db..9fd7483787 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
@@ -1731,6 +1731,128 @@ public class UploadPackTest {
.has(preparator.foo.toObjectId()));
}
+ /**
+ * Creates a commit with the following files:
+ * <pre>
+ * a/x/b/foo
+ * b/u/c/baz
+ * y/x/b/foo
+ * z/v/c/baz
+ * </pre>
+ * which has two pairs of identical trees:
+ * <ul>
+ * <li>one at /a and /y
+ * <li>one at /b/u and /z/v
+ * </ul>
+ * Note that this class defines unique 8 trees (rootTree and subtree1-7)
+ * which means PackStatistics should report having visited 8 trees.
+ */
+ class RepeatedSubtreeAtSameLevelPreparator {
+ RevBlob foo = remote.blob("foo");
+
+ /** foo */
+ RevTree subtree1 = remote.tree(remote.file("foo", foo));
+
+ /** b/foo */
+ RevTree subtree2 = (new TreeBuilder() {
+ @Override
+ void addElements(DirCacheBuilder dcBuilder) throws Exception {
+ dcBuilder.addTree(new byte[] {'b'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree1);
+ }
+ }).build();
+
+ /** x/b/foo */
+ RevTree subtree3 = (new TreeBuilder() {
+ @Override
+ void addElements(DirCacheBuilder dcBuilder) throws Exception {
+ dcBuilder.addTree(new byte[] {'x'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree2);
+ }
+ }).build();
+
+ RevBlob baz = remote.blob("baz");
+
+ /** baz */
+ RevTree subtree4 = remote.tree(remote.file("baz", baz));
+
+ /** c/baz */
+ RevTree subtree5 = (new TreeBuilder() {
+ @Override
+ void addElements(DirCacheBuilder dcBuilder) throws Exception {
+ dcBuilder.addTree(new byte[] {'c'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree4);
+ }
+ }).build();
+
+ /** u/c/baz */
+ RevTree subtree6 = (new TreeBuilder() {
+ @Override
+ void addElements(DirCacheBuilder dcBuilder) throws Exception {
+ dcBuilder.addTree(new byte[] {'u'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree5);
+ }
+ }).build();
+
+ /** v/c/baz */
+ RevTree subtree7 = (new TreeBuilder() {
+ @Override
+ void addElements(DirCacheBuilder dcBuilder) throws Exception {
+ dcBuilder.addTree(new byte[] {'v'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree5);
+ }
+ }).build();
+
+ RevTree rootTree = (new TreeBuilder() {
+ @Override
+ void addElements(DirCacheBuilder dcBuilder) throws Exception {
+ dcBuilder.addTree(new byte[] {'a'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree3);
+ dcBuilder.addTree(new byte[] {'b'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree6);
+ dcBuilder.addTree(new byte[] {'y'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree3);
+ dcBuilder.addTree(new byte[] {'z'}, DirCacheEntry.STAGE_0,
+ remote.getRevWalk().getObjectReader(), subtree7);
+ }
+ }).build();
+ RevCommit commit = remote.commit(rootTree);
+
+ RepeatedSubtreeAtSameLevelPreparator() throws Exception {}
+ }
+
+ @Test
+ public void testV2FetchFilterTreeDepth_repeatTreeAtSameLevelIncludeFile()
+ throws Exception {
+ RepeatedSubtreeAtSameLevelPreparator preparator =
+ new RepeatedSubtreeAtSameLevelPreparator();
+ remote.update("master", preparator.commit);
+
+ uploadV2WithTreeDepthFilter(5, preparator.commit.toObjectId());
+
+ assertTrue(client.getObjectDatabase()
+ .has(preparator.foo.toObjectId()));
+ assertTrue(client.getObjectDatabase()
+ .has(preparator.baz.toObjectId()));
+ assertEquals(8, stats.getTreesTraversed());
+ }
+
+ @Test
+ public void testV2FetchFilterTreeDepth_repeatTreeAtSameLevelExcludeFile()
+ throws Exception {
+ RepeatedSubtreeAtSameLevelPreparator preparator =
+ new RepeatedSubtreeAtSameLevelPreparator();
+ remote.update("master", preparator.commit);
+
+ uploadV2WithTreeDepthFilter(4, preparator.commit.toObjectId());
+
+ assertFalse(client.getObjectDatabase()
+ .has(preparator.foo.toObjectId()));
+ assertFalse(client.getObjectDatabase()
+ .has(preparator.baz.toObjectId()));
+ assertEquals(8, stats.getTreesTraversed());
+ }
+
@Test
public void testWantFilteredObject() throws Exception {
RepeatedSubtreePreparator preparator = new RepeatedSubtreePreparator();