Sat, 24 Jun 2017 23:05:57 +0900 revset: add depth limit to descendants() (issue5374)
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:05:57 +0900] rev 33080
revset: add depth limit to descendants() (issue5374) This is naive implementation using two-pass scanning. Tracking descendants isn't an easy problem if both start and stop depths are specified. It's impractical to remember all possible depths of each node while scanning from roots to descendants because the number of depths explodes. Instead, we could cache (min, max) depths as a good approximation and track ancestors back when needed, but that's likely to have off-by-one bug. Since this implementation appears not significantly slower, and is quite straightforward, I think it's good enough for practical use cases. The time and space complexity is O(n) ish. revisions: 0) 1-pass scanning with (min, max)-depth cache (worst-case quadratic) 1) 2-pass scanning (this version) repository: mozilla-central # descendants(0) (for reference) *) 0.430353 # descendants(0, depth=1000) 0) 0.264889 1) 0.398289 # descendants(limit(tip:0, 1, offset=10000), depth=1000) 0) 0.025478 1) 0.029099 # descendants(0, depth=2000, startdepth=1000) 0) painfully slow (due to quadratic backtracking of ancestors) 1) 1.531138
Sat, 24 Jun 2017 23:35:03 +0900 dagop: make walk direction switchable so it can track descendants
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:35:03 +0900] rev 33079
dagop: make walk direction switchable so it can track descendants # ancestors(tip) using hg repo 2) 0.068527 3) 0.069097
Sat, 24 Jun 2017 23:30:51 +0900 dagop: factor out generator of ancestor nodes
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:30:51 +0900] rev 33078
dagop: factor out generator of ancestor nodes # ancestors(tip) using hg repo 1) 0.068976 2) 0.068527
Sat, 24 Jun 2017 23:22:45 +0900 dagop: factor out pfunc from revancestors() generator
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Jun 2017 23:22:45 +0900] rev 33077
dagop: factor out pfunc from revancestors() generator This generator will be reused for tracking descendants with depth limit. # ancestors(tip) using hg repo 0) 0.065868 1) 0.068976
Fri, 23 Jun 2017 21:15:10 +0900 dagop: use smartset.min() in revdescendants() generator
Yuya Nishihara <yuya@tcha.org> [Fri, 23 Jun 2017 21:15:10 +0900] rev 33076
dagop: use smartset.min() in revdescendants() generator All callers pass the result of revset.getset(), which should be a smartset.
Tue, 20 Jun 2017 22:26:52 +0900 dagop: change revdescendants() to include all root revisions
Yuya Nishihara <yuya@tcha.org> [Tue, 20 Jun 2017 22:26:52 +0900] rev 33075
dagop: change revdescendants() to include all root revisions Prepares for adding depth support. I want to process depth=0 in revdescendants() to make things simpler. only() also calls dagop.revdescendants(), but it filters out root revisions explicitly. So this should cause no problem. # descendants(0) using hg repo 0) 0.052380 1) 0.051226 # only(tip) using hg repo 0) 0.001433 1) 0.001425
Tue, 20 Jun 2017 22:11:23 +0900 test-revset: add a few more tests of descendants()
Yuya Nishihara <yuya@tcha.org> [Tue, 20 Jun 2017 22:11:23 +0900] rev 33074
test-revset: add a few more tests of descendants() I'll add depth support to descendants().
Sun, 18 Jun 2017 17:02:03 +0900 dagop: unnest inner generator of revdescendants()
Yuya Nishihara <yuya@tcha.org> [Sun, 18 Jun 2017 17:02:03 +0900] rev 33073
dagop: unnest inner generator of revdescendants() This just moves iterate() to module-level function.
Sun, 25 Jun 2017 00:14:48 +0900 smartset: fix default value of abstractsmartset.sort()
Yuya Nishihara <yuya@tcha.org> [Sun, 25 Jun 2017 00:14:48 +0900] rev 33072
smartset: fix default value of abstractsmartset.sort() It's unused, but it shouldn't lie.
Mon, 26 Jun 2017 03:47:11 +0900 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 26 Jun 2017 03:47:11 +0900] rev 33071
keyword: wrap functions only once at loading keyword extension Before this patch, some functions are wrapped in reposetup(), but this causes redundant nested wrapping, if two ore more repositories enable keyword extension (e.g. hgweb serves multiple repositories). Now, there is no need to define these wrapper functions in reposetup(), because previous patches made them not directly refer to kwtemplater instanciated in reposetup(). This patch factors these wrapper functions out from reposetup(), and uses them to wrap functions only at once at loading keyword extension.
(0) -30000 -10000 -3000 -1000 -300 -100 -10 +10 +100 +300 +1000 +3000 +10000 tip