summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorkylezhao <kylezhao@tencent.com>2021-08-31 19:36:44 +0800
committerMatthias Sohn <matthias.sohn@sap.com>2021-10-08 12:05:47 +0200
commitc5b30547355327c1536593cc7c4213d4949f5024 (patch)
treef80fbcac394ccce2d084afa5e175df5b7b3cb408 /org.eclipse.jgit.test
parentc0380e9cddb26bb9b983305ec0a8051664782ae8 (diff)
downloadjgit-c5b30547355327c1536593cc7c4213d4949f5024.tar.gz
jgit-c5b30547355327c1536593cc7c4213d4949f5024.zip
Optimize RevWalk.getMergedInto()
Transitive Relation Definition: On the DAG of commit history, if A can reach B, C can reach A, then C can reach B. Example: As is shown in the graph below: 1 - 2 - 3 - 4 (side) \ 5 - 6^ (master) - 7 (topic) Find out which branches is 2 merged into: After we calculated that master contains 2, we can mark 6 as TEMP_MARK to avoid unwanted walks. When we want to figure out if 2 is merge into the topic, the traversal path would be [7, 6] instead of [7, 6, 5, 3, 2]. Test: This change can significantly improve performance for tags. On a copy of the Linux repository, the command 'git tag --contains <commit>' had the following performance improvement: commit | Before | After | Rel % 47a44d27ca | 29251ms | 6687ms | -77% 90327e7dff | 21388ms | 6256ms | -70% f85fac0efa | 11150ms | 7338ms | -34% The current version ignores tags, even though the tag is a type of the ref. Follow-up commits I'll fix it. Change-Id: Ie6295ca4d16070499912af462239e679a97cce47 Signed-off-by: kylezhao <kylezhao@tencent.com> Reviewed-by: Christian Halstrick <christian.halstrick@sap.com> Reviewed-by: Martin Fick <mfick@codeaurora.org>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java17
1 files changed, 15 insertions, 2 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java
index 200cb6a4fe..0a045c917b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java
@@ -82,20 +82,33 @@ public class RevWalkUtilsReachableTest extends RevWalkTestCase {
* a b
* | |
* c d
+ * | \
+ * f e
+ * | /
+ * g
*/
RevCommit a = commit();
RevCommit b = commit();
RevCommit c = commit(a);
RevCommit d = commit(b);
+ RevCommit f = commit(d);
+ RevCommit e = commit(d);
+ RevCommit g = commit(f, e);
Ref branchA = branch("a", a);
Ref branchB = branch("b", b);
Ref branchC = branch("c", c);
Ref branchD = branch("d", d);
+ Ref branchE = branch("e", e);
+ Ref branchF = branch("f", f);
+ Ref branchG = branch("g", g);
assertContains(a, asList(branchA, branchC));
- assertContains(b, asList(branchB, branchD));
+ assertContains(b, asList(branchB, branchD, branchE, branchF, branchG));
assertContains(c, asList(branchC));
- assertContains(d, asList(branchD));
+ assertContains(d, asList(branchD, branchE, branchF, branchG));
+ assertContains(e, asList(branchE, branchG));
+ assertContains(f, asList(branchF, branchG));
+ assertContains(g, asList(branchG));
}
private Ref branch(String name, RevCommit dst) throws Exception {