author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
Fri, 24 Mar 2017 16:05:28 +0100 | |
changeset 2237 | 98e0369b548b |
parent 2236 | c0e2ba85e76a |
child 2238 | aac765e84de3 |
permissions | -rw-r--r-- |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
1 |
# Code dedicated to the computation and properties of "stable ranges" |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
2 |
# |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
3 |
# These stable ranges are use for obsolescence markers discovery |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
4 |
# |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
5 |
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
6 |
# |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
7 |
# This software may be used and distributed according to the terms of the |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
8 |
# GNU General Public License version 2 or any later version. |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
9 |
|
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
10 |
import collections |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
11 |
import heapq |
2130
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
12 |
import math |
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
13 |
import sqlite3 |
2130
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
14 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
15 |
from mercurial import ( |
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
16 |
commands, |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
17 |
cmdutil, |
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
18 |
error, |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
19 |
localrepo, |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
20 |
node as nodemod, |
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
21 |
scmutil, |
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
22 |
util, |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
23 |
) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
24 |
|
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
25 |
from mercurial.i18n import _ |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
26 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
27 |
from . import ( |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
28 |
exthelper, |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
29 |
) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
30 |
|
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
31 |
eh = exthelper.exthelper() |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
32 |
|
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
33 |
################################## |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
34 |
### Stable topological sorting ### |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
35 |
################################## |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
36 |
@eh.command( |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
37 |
'debugstablesort', |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
38 |
[ |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
39 |
('', 'rev', [], 'heads to start from'), |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
40 |
] + commands.formatteropts, |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
41 |
_('')) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
42 |
def debugstablesort(ui, repo, **opts): |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
43 |
"""display the ::REVS set topologically sorted in a stable way |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
44 |
""" |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
45 |
revs = scmutil.revrange(repo, opts['rev']) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
46 |
displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
47 |
for r in stablesort(repo, revs): |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
48 |
ctx = repo[r] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
49 |
displayer.show(ctx) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
50 |
displayer.flush(ctx) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
51 |
displayer.close() |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
52 |
|
2212
afb35ad42040
stablesort: allow a callback to be triggered on merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2211
diff
changeset
|
53 |
def stablesort(repo, revs, mergecallback=None): |
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
54 |
"""return '::revs' topologically sorted in "stable" order |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
55 |
|
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
56 |
This is a depth first traversal starting from 'nullrev', using node as a |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
57 |
tie breaker. |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
58 |
""" |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
59 |
# Various notes: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
60 |
# |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
61 |
# * Bitbucket is used dates as tie breaker, that might be a good idea. |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
62 |
# |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
63 |
# * It seemds we can traverse in the same order from (one) head to bottom, |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
64 |
# if we the following record data for each merge: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
65 |
# |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
66 |
# - highest (stablesort-wise) common ancestors, |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
67 |
# - order of parents (tablesort-wise) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
68 |
cl = repo.changelog |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
69 |
parents = cl.parentrevs |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
70 |
nullrev = nodemod.nullrev |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
71 |
n = cl.node |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
72 |
# step 1: We need a parents -> children mapping for 2 reasons. |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
73 |
# |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
74 |
# * we build the order from nullrev to tip |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
75 |
# |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
76 |
# * we need to detect branching |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
77 |
children = collections.defaultdict(list) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
78 |
for r in cl.ancestors(revs, inclusive=True): |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
79 |
p1, p2 = parents(r) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
80 |
children[p1].append(r) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
81 |
if p2 != nullrev: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
82 |
children[p2].append(r) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
83 |
# step two: walk back up |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
84 |
# * pick lowest node in case of branching |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
85 |
# * stack disregarded part of the branching |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
86 |
# * process merge when both parents are yielded |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
87 |
|
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
88 |
# track what changeset has been |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
89 |
seen = [0] * (max(revs) + 2) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
90 |
seen[-1] = True # nullrev is known |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
91 |
# starts from repository roots |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
92 |
# reuse the list form the mapping as we won't need it again anyway |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
93 |
stack = children[nullrev] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
94 |
if not stack: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
95 |
return [] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
96 |
if 1 < len(stack): |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
97 |
stack.sort(key=n, reverse=True) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
98 |
|
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
99 |
# list of rev, maybe we should yield, but since we built a children mapping we are 'O(N)' already |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
100 |
result = [] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
101 |
|
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
102 |
current = stack.pop() |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
103 |
while current is not None or stack: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
104 |
if current is None: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
105 |
# previous iteration reached a merge or an unready merge, |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
106 |
current = stack.pop() |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
107 |
if seen[current]: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
108 |
current = None |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
109 |
continue |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
110 |
p1, p2 = parents(current) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
111 |
if not (seen[p1] and seen[p2]): |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
112 |
# we can't iterate on this merge yet because other child is not |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
113 |
# yielded yet (and we are topo sorting) we can discard it for now |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
114 |
# because it will be reached from the other child. |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
115 |
current = None |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
116 |
continue |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
117 |
assert not seen[current] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
118 |
seen[current] = True |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
119 |
result.append(current) # could be yield, cf earlier comment |
2212
afb35ad42040
stablesort: allow a callback to be triggered on merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2211
diff
changeset
|
120 |
if mergecallback is not None and p2 != nullrev: |
afb35ad42040
stablesort: allow a callback to be triggered on merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2211
diff
changeset
|
121 |
mergecallback(result, current) |
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
122 |
cs = children[current] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
123 |
if not cs: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
124 |
current = None |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
125 |
elif 1 == len(cs): |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
126 |
current = cs[0] |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
127 |
else: |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
128 |
cs.sort(key=n, reverse=True) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
129 |
current = cs.pop() # proceed on smallest |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
130 |
stack.extend(cs) # stack the rest for later |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
131 |
assert len(result) == len(set(result)) |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
132 |
return result |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
133 |
|
2130
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
134 |
################################# |
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
135 |
### Stable Range computation ### |
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
136 |
################################# |
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
137 |
|
2198
ab392bd1c518
stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2197
diff
changeset
|
138 |
def _hlp2(i): |
ab392bd1c518
stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2197
diff
changeset
|
139 |
"""return highest power of two lower than 'i'""" |
ab392bd1c518
stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2197
diff
changeset
|
140 |
return 2 ** int(math.log(i - 1, 2)) |
ab392bd1c518
stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2197
diff
changeset
|
141 |
|
2137
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
142 |
def subrangesclosure(repo, heads): |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
143 |
"""set of all standard subrange under heads |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
144 |
|
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
145 |
This is intended for debug purposes. Range are returned from largest to |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
146 |
smallest in terms of number of revision it contains.""" |
2176
f5e1e43915a1
stablerange: use subranges from the main class in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2173
diff
changeset
|
147 |
subranges = repo.stablerange.subranges |
2196
2ecc88baabf9
stablerange: directly use tuple to refer to a stable range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2194
diff
changeset
|
148 |
toproceed = [(r, 0, ) for r in heads] |
2137
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
149 |
ranges = set(toproceed) |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
150 |
while toproceed: |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
151 |
entry = toproceed.pop() |
2176
f5e1e43915a1
stablerange: use subranges from the main class in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2173
diff
changeset
|
152 |
for r in subranges(repo, entry): |
2137
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
153 |
if r not in ranges: |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
154 |
ranges.add(r) |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
155 |
toproceed.append(r) |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
156 |
ranges = list(ranges) |
2142
7dc66a526b21
stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2141
diff
changeset
|
157 |
n = repo.changelog.node |
2167
d37f0423c072
stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2163
diff
changeset
|
158 |
rangelength = repo.stablerange.rangelength |
d37f0423c072
stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2163
diff
changeset
|
159 |
ranges.sort(key=lambda r: (-rangelength(repo, r), n(r[0]))) |
2137
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
160 |
return ranges |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
161 |
|
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
162 |
@eh.command( |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
163 |
'debugstablerange', |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
164 |
[ |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
165 |
('', 'rev', [], 'operate on (rev, 0) ranges for rev in REVS'), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
166 |
('', 'subranges', False, 'recursively display data for subranges too'), |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
167 |
('', 'verify', False, 'checks subranges content (EXPENSIVE)'), |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
168 |
], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
169 |
_('')) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
170 |
def debugstablerange(ui, repo, **opts): |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
171 |
"""display standard stable subrange for a set of ranges |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
172 |
|
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
173 |
Range as displayed as '<node>-<index> (<rev>, <depth>, <length>)', use |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
174 |
--verbose to get the extra details in (). |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
175 |
""" |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
176 |
short = nodemod.short |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
177 |
revs = scmutil.revrange(repo, opts['rev']) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
178 |
# prewarm depth cache |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
179 |
unfi = repo.unfiltered() |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
180 |
node = unfi.changelog.node |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
181 |
stablerange = unfi.stablerange |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
182 |
depth = stablerange.depthrev |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
183 |
length = stablerange.rangelength |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
184 |
subranges = stablerange.subranges |
2233
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
185 |
repo.stablerange.warmup(repo, max(revs)) |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
186 |
if opts['subranges']: |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
187 |
ranges = subrangesclosure(repo, revs) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
188 |
else: |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
189 |
ranges = [(r, 0) for r in revs] |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
190 |
if ui.verbose: |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
191 |
template = '%s-%d (%d, %d, %d)' |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
192 |
|
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
193 |
def _rangestring(repo, rangeid): |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
194 |
return template % ( |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
195 |
short(node(rangeid[0])), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
196 |
rangeid[1], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
197 |
rangeid[0], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
198 |
depth(unfi, rangeid[0]), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
199 |
length(unfi, rangeid) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
200 |
) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
201 |
else: |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
202 |
template = '%s-%d' |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
203 |
|
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
204 |
def _rangestring(repo, rangeid): |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
205 |
return template % ( |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
206 |
short(node(rangeid[0])), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
207 |
rangeid[1], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
208 |
) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
209 |
|
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
210 |
for r in ranges: |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
211 |
subs = subranges(unfi, r) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
212 |
subsstr = ', '.join(_rangestring(unfi, s) for s in subs) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
213 |
rstr = _rangestring(unfi, r) |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
214 |
if opts['verify']: |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
215 |
status = 'leaf' |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
216 |
if 1 < length(unfi, r): |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
217 |
status = 'complete' |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
218 |
revs = set(stablerange.revsfromrange(unfi, r)) |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
219 |
subrevs = set() |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
220 |
for s in subs: |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
221 |
subrevs.update(stablerange.revsfromrange(unfi, s)) |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
222 |
if revs != subrevs: |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
223 |
status = 'missing' |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
224 |
ui.status('%s [%s] - %s\n' % (rstr, status, subsstr)) |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
225 |
else: |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
226 |
ui.status('%s - %s\n' % (rstr, subsstr)) |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
227 |
|
2200
d5a216dce71c
stablerange: rename the class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2199
diff
changeset
|
228 |
class stablerange(object): |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
229 |
|
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
230 |
def __init__(self): |
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
231 |
# The point up to which we have data in cache |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
232 |
self._tiprev = None |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
233 |
self._tipnode = None |
2234
16a5a37ced62
stablerange: add some basic documentation about the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2233
diff
changeset
|
234 |
# cache the 'depth' of a changeset, the size of '::rev' |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
235 |
self._depthcache = {} |
2234
16a5a37ced62
stablerange: add some basic documentation about the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2233
diff
changeset
|
236 |
# cache the standard stable subranges or a range |
2127
e2770faac2df
stablerange: move the subrange cache into our new class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2126
diff
changeset
|
237 |
self._subrangescache = {} |
2184
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
238 |
# To slices merge, we need to walk their descendant in reverse stable |
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
239 |
# sort order. For now we perform a full stable sort their descendant |
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
240 |
# and then use the relevant top most part. This order is going to be |
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
241 |
# the same for all ranges headed at the same merge. So we cache these |
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
242 |
# value to reuse them accross the same invocation. |
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
243 |
self._stablesortcache = {} |
2213
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
244 |
# something useful to compute the above |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
245 |
# mergerev -> stablesort, length |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
246 |
self._stablesortprepared = {} |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
247 |
# caching parent call # as we do so many of them |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
248 |
self._parentscache = {} |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
249 |
# The first part of the stable sorted list of revision of a merge will |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
250 |
# shared with the one of others. This means we can reuse subranges |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
251 |
# computed from that point to compute some of the subranges from the |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
252 |
# merge. |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
253 |
self._inheritancecache = {} |
2184
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
254 |
|
2233
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
255 |
def warmup(self, repo, upto=None): |
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
256 |
"""warm the cache up""" |
2201
8d371329e8b9
stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2200
diff
changeset
|
257 |
repo = repo.unfiltered() |
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
258 |
cl = repo.changelog |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
259 |
# subrange should be warmed from head to range to be able to benefit |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
260 |
# from revsfromrange cache. otherwise each merge will trigger its own |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
261 |
# stablesort. |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
262 |
# |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
263 |
# we use the revnumber as an approximation for depth |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
264 |
ui = repo.ui |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
265 |
|
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
266 |
if upto is None: |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
267 |
upto = len(cl) - 1 |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
268 |
if self._tiprev is None: |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
269 |
revs = cl.revs(stop=upto) |
2233
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
270 |
nbrevs = upto + 1 |
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
271 |
else: |
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
272 |
assert cl.node(self._tiprev) == self._tipnode |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
273 |
if upto <= self._tiprev: |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
274 |
return |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
275 |
revs = cl.revs(start=self._tiprev + 1, stop=upto) |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
276 |
nbrevs = upto - self._tiprev |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
277 |
rangeheap = [] |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
278 |
for idx, r in enumerate(revs): |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
279 |
if not idx % 1000: |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
280 |
ui.progress(_("filling depth cache"), idx, total=nbrevs) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
281 |
# warm up depth |
2135
8f63f4b1c33e
stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2134
diff
changeset
|
282 |
self.depthrev(repo, r) |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
283 |
rangeheap.append((-r, (r, 0))) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
284 |
ui.progress(_("filling depth cache"), None, total=nbrevs) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
285 |
|
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
286 |
heappop = heapq.heappop |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
287 |
heappush = heapq.heappush |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
288 |
heapify = heapq.heapify |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
289 |
|
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
290 |
original = set(rangeheap) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
291 |
seen = 0 |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
292 |
heapify(rangeheap) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
293 |
while rangeheap: |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
294 |
value = heappop(rangeheap) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
295 |
if value in original: |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
296 |
if not seen % 1000: |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
297 |
ui.progress(_("filling stablerange cache"), seen, total=nbrevs) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
298 |
seen += 1 |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
299 |
original.remove(value) # might have been added from other source |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
300 |
__, rangeid = value |
2226
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
301 |
if self._getsub(rangeid) is None: |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
302 |
for sub in self.subranges(repo, rangeid): |
2226
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
303 |
if self._getsub(sub) is None: |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
304 |
heappush(rangeheap, (-sub[0], sub)) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
305 |
ui.progress(_("filling stablerange cache"), None, total=nbrevs) |
2135
8f63f4b1c33e
stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2134
diff
changeset
|
306 |
|
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
307 |
self._tiprev = upto |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
308 |
self._tipnode = cl.node(upto) |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
309 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
310 |
def depthrev(self, repo, rev): |
2126
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
311 |
repo = repo.unfiltered() |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
312 |
cl = repo.changelog |
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
313 |
depth = self._getdepth |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
314 |
nullrev = nodemod.nullrev |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
315 |
stack = [rev] |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
316 |
while stack: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
317 |
revdepth = None |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
318 |
current = stack[-1] |
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
319 |
revdepth = depth(current) |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
320 |
if revdepth is not None: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
321 |
stack.pop() |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
322 |
continue |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
323 |
p1, p2 = self._parents(current, cl.parentrevs) |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
324 |
if p1 == nullrev: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
325 |
# root case |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
326 |
revdepth = 1 |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
327 |
elif p2 == nullrev: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
328 |
# linear commit case |
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
329 |
parentdepth = depth(p1) |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
330 |
if parentdepth is None: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
331 |
stack.append(p1) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
332 |
else: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
333 |
revdepth = parentdepth + 1 |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
334 |
else: |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
335 |
# merge case |
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
336 |
revdepth = self._depthmerge(cl, current, p1, p2, stack) |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
337 |
if revdepth is not None: |
2225
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
338 |
self._setdepth(current, revdepth) |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
339 |
stack.pop() |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
340 |
# actual_depth = len(list(cl.ancestors([rev], inclusive=True))) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
341 |
# assert revdepth == actual_depth, (rev, revdepth, actual_depth) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
342 |
return revdepth |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
343 |
|
2182
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
344 |
def rangelength(self, repo, rangeid): |
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
345 |
headrev, index = rangeid[0], rangeid[1] |
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
346 |
return self.depthrev(repo, headrev) - index |
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
347 |
|
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
348 |
def subranges(self, repo, rangeid): |
2226
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
349 |
cached = self._getsub(rangeid) |
2182
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
350 |
if cached is not None: |
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
351 |
return cached |
2204
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
352 |
value = self._subranges(repo, rangeid) |
2227
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
353 |
self._setsub(rangeid, value) |
2182
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
354 |
return value |
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
355 |
|
2183
3c2992afee71
stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2182
diff
changeset
|
356 |
def revsfromrange(self, repo, rangeid): |
2210
37bd878d2e58
more explicite name in revsfromrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2209
diff
changeset
|
357 |
headrev, index = rangeid |
2211
ecb46c7ee281
minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2210
diff
changeset
|
358 |
rangelength = self.rangelength(repo, rangeid) |
2214
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
359 |
if rangelength == 1: |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
360 |
revs = [headrev] |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
361 |
else: |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
362 |
# get all revs under heads in stable order |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
363 |
# |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
364 |
# note: In the general case we can just walk down and then request |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
365 |
# data about the merge. But I'm not sure this function will be even |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
366 |
# call for the general case. |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
367 |
allrevs = self._stablesortcache.get(headrev) |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
368 |
if allrevs is None: |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
369 |
allrevs = self._getrevsfrommerge(repo, headrev) |
2186
57d58f27ffae
revsfromramge: hard code the single changeset range case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2185
diff
changeset
|
370 |
if allrevs is None: |
2214
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
371 |
allrevs = stablesort(repo, [headrev], |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
372 |
mergecallback=self._filestablesortcache) |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
373 |
self._stablesortcache[headrev] = allrevs |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
374 |
# takes from index |
14e876c5e1c3
stablerange: soon it will not provide any benefit and it gets in the way
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2213
diff
changeset
|
375 |
revs = allrevs[index:] |
2183
3c2992afee71
stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2182
diff
changeset
|
376 |
# sanity checks |
2211
ecb46c7ee281
minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2210
diff
changeset
|
377 |
assert len(revs) == rangelength |
2183
3c2992afee71
stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2182
diff
changeset
|
378 |
return revs |
3c2992afee71
stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2182
diff
changeset
|
379 |
|
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
380 |
def _parents(self, rev, func): |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
381 |
parents = self._parentscache.get(rev) |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
382 |
if parents is None: |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
383 |
parents = func(rev) |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
384 |
self._parentscache[rev] = parents |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
385 |
return parents |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
386 |
|
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
387 |
def _getdepth(self, rev): |
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
388 |
"""utility function used to access the depth cache |
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
389 |
|
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
390 |
This mostly exist to help the on disk persistence.""" |
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
391 |
return self._depthcache.get(rev) |
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
392 |
|
2225
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
393 |
def _setdepth(self, rev, value): |
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
394 |
"""utility function used to set the depth cache |
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
395 |
|
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
396 |
This mostly exist to help the on disk persistence.""" |
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
397 |
self._depthcache[rev] = value |
81f5ebd9e9d0
depth: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2224
diff
changeset
|
398 |
|
2226
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
399 |
def _getsub(self, rev): |
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
400 |
"""utility function used to access the subranges cache |
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
401 |
|
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
402 |
This mostly exist to help the on disk persistence""" |
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
403 |
return self._subrangescache.get(rev) |
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
404 |
|
2227
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
405 |
def _setsub(self, rev, value): |
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
406 |
"""utility function used to set the subranges cache |
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
407 |
|
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
408 |
This mostly exist to help the on disk persistence.""" |
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
409 |
self._subrangescache[rev] = value |
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
410 |
|
2213
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
411 |
def _filestablesortcache(self, sortedrevs, merge): |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
412 |
if merge not in self._stablesortprepared: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
413 |
self._stablesortprepared[merge] = (sortedrevs, len(sortedrevs)) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
414 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
415 |
def _getrevsfrommerge(self, repo, merge): |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
416 |
prepared = self._stablesortprepared.get(merge) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
417 |
if prepared is None: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
418 |
return None |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
419 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
420 |
mergedepth = self.depthrev(repo, merge) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
421 |
allrevs = prepared[0][:prepared[1]] |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
422 |
nbextrarevs = prepared[1] - mergedepth |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
423 |
if not nbextrarevs: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
424 |
return allrevs |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
425 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
426 |
anc = repo.changelog.ancestors([merge], inclusive=True) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
427 |
top = [] |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
428 |
counter = nbextrarevs |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
429 |
for rev in reversed(allrevs): |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
430 |
if rev in anc: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
431 |
top.append(rev) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
432 |
else: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
433 |
counter -= 1 |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
434 |
if counter <= 0: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
435 |
break |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
436 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
437 |
bottomidx = prepared[1] - (nbextrarevs + len(top)) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
438 |
revs = allrevs[:bottomidx] |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
439 |
revs.extend(reversed(top)) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
440 |
return revs |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
441 |
|
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
442 |
def _inheritancepoint(self, repo, merge): |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
443 |
"""Find the inheritance point of a Merge |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
444 |
|
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
445 |
The first part of the stable sorted list of revision of a merge will shared with |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
446 |
the one of others. This means we can reuse subranges computed from that point to |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
447 |
compute some of the subranges from the merge. |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
448 |
|
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
449 |
That point is latest point in the stable sorted list where the depth of the |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
450 |
revisions match its index (that means all revision earlier in the stable sorted |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
451 |
list are its ancestors, no dangling unrelated branches exists). |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
452 |
""" |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
453 |
value = self._inheritancecache.get(merge) |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
454 |
if value is None: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
455 |
revs = self.revsfromrange(repo, (merge, 0)) |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
456 |
i = reversed(revs) |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
457 |
i.next() # pop the merge |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
458 |
expected = len(revs) - 1 |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
459 |
# Since we do warmup properly, we can expect the cache to be hot |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
460 |
# for everythin under the merge we investigate |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
461 |
cache = self._depthcache |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
462 |
# note: we cannot do a binary search because element under the |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
463 |
# inherited point might have mismatching depth because of inner |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
464 |
# branching. |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
465 |
for rev in i: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
466 |
if cache[rev] == expected: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
467 |
break |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
468 |
expected -= 1 |
2221
f61d091d318e
stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2220
diff
changeset
|
469 |
value = (expected - 1, rev) |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
470 |
self._inheritancecache[merge] = value |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
471 |
return value |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
472 |
|
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
473 |
def _depthmerge(self, cl, rev, p1, p2, stack): |
2126
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
474 |
# sub method to simplify the main 'depthrev' one |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
475 |
revdepth = None |
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
476 |
depth = self._getdepth |
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
477 |
depth_p1 = depth(p1) |
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
478 |
depth_p2 = depth(p2) |
2126
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
479 |
missingparent = False |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
480 |
if depth_p1 is None: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
481 |
stack.append(p1) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
482 |
missingparent = True |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
483 |
if depth_p2 is None: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
484 |
stack.append(p2) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
485 |
missingparent = True |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
486 |
if missingparent: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
487 |
return None |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
488 |
# computin depth of a merge |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
489 |
# XXX the common ancestors heads could be cached |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
490 |
ancnodes = cl.commonancestorsheads(cl.node(p1), cl.node(p2)) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
491 |
ancrevs = [cl.rev(a) for a in ancnodes] |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
492 |
anyunkown = False |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
493 |
ancdepth = [] |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
494 |
for r in ancrevs: |
2224
49776d324d1a
depth: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2223
diff
changeset
|
495 |
d = depth(r) |
2126
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
496 |
if d is None: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
497 |
anyunkown = True |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
498 |
stack.append(r) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
499 |
ancdepth.append((r, d)) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
500 |
if anyunkown: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
501 |
return None |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
502 |
if not ancrevs: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
503 |
# unrelated branch, (no common root) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
504 |
revdepth = depth_p1 + depth_p2 + 1 |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
505 |
elif len(ancrevs) == 1: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
506 |
# one unique branch point: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
507 |
# we can compute depth without any walk |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
508 |
depth_anc = ancdepth[0][1] |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
509 |
revdepth = depth_p1 + (depth_p2 - depth_anc) + 1 |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
510 |
else: |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
511 |
# multiple ancestors, we pick one that is |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
512 |
# * the deepest (less changeset outside of it), |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
513 |
# * lowest revs because more chance to have descendant of other "above" |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
514 |
anc, revdepth = max(ancdepth, key=lambda x: (x[1], -x[0])) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
515 |
revdepth += len(cl.findmissingrevs(common=[anc], heads=[rev])) |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
516 |
return revdepth |
839e96521c5a
depth: extract code dedicated to depth of a merge in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2125
diff
changeset
|
517 |
|
2204
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
518 |
def _subranges(self, repo, rangeid): |
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
519 |
if self.rangelength(repo, rangeid) == 1: |
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
520 |
return [] |
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
521 |
slicepoint = self._slicepoint(repo, rangeid) |
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
522 |
|
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
523 |
# make sure we have cache for all relevant parent first to prevent |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
524 |
# recursion (python is bad with recursion |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
525 |
stack = [] |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
526 |
current = rangeid |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
527 |
while current is not None: |
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
528 |
current = self._cold_reusable(repo, current, slicepoint) |
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
529 |
if current is not None: |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
530 |
stack.append(current) |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
531 |
while stack: |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
532 |
# these call will directly compute the subranges |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
533 |
self.subranges(repo, stack.pop()) |
2204
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
534 |
return self._slicesrangeat(repo, rangeid, slicepoint) |
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
535 |
|
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
536 |
def _cold_reusable(self, repo, rangeid, slicepoint): |
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
537 |
"""return parent range that it would be useful to prepare to slice |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
538 |
rangeid at slicepoint |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
539 |
|
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
540 |
This function also have the important task to update the revscache of |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
541 |
the parent rev s if possible and needed""" |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
542 |
p1, p2 = self._parents(rangeid[0], repo.changelog.parentrevs) |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
543 |
if p2 == nodemod.nullrev: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
544 |
# regular changesets, we pick the parent |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
545 |
reusablerev = p1 |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
546 |
else: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
547 |
# merge, we try the inheritance point |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
548 |
# if it is too low, it will be ditched by the depth check anyway |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
549 |
index, reusablerev = self._inheritancepoint(repo, rangeid[0]) |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
550 |
|
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
551 |
# if we reached the slicepoint, no need to go further |
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
552 |
if self.depthrev(repo, reusablerev) <= slicepoint: |
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
553 |
return None |
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
554 |
|
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
555 |
reurange = (reusablerev, rangeid[1]) |
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
556 |
# if we have an entry for the current range, lets update the cache |
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
557 |
# if we already have subrange for this range, no need to prepare it. |
2226
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
558 |
if self._getsub(reurange) is not None: |
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
559 |
return None |
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
560 |
|
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
561 |
# look like we found a relevent parentrange with no cache yet |
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
562 |
return reurange |
2205
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
563 |
|
2132
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
564 |
def _slicepoint(self, repo, rangeid): |
2152
c00fb215cd80
stablerange: stop using '.head' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2151
diff
changeset
|
565 |
rangedepth = self.depthrev(repo, rangeid[0]) |
2132
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
566 |
step = _hlp2(rangedepth) |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
567 |
standard_start = 0 |
2160
66b774ed1335
stablerange: stop using '.index' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2159
diff
changeset
|
568 |
while standard_start < rangeid[1] and 0 < step: |
2132
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
569 |
if standard_start + step < rangedepth: |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
570 |
standard_start += step |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
571 |
step //= 2 |
2160
66b774ed1335
stablerange: stop using '.index' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2159
diff
changeset
|
572 |
if rangeid[1] == standard_start: |
2168
3012d4ddfb23
stablerange: use rangelength in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2167
diff
changeset
|
573 |
slicesize = _hlp2(self.rangelength(repo, rangeid)) |
2160
66b774ed1335
stablerange: stop using '.index' in '_slicepoint'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2159
diff
changeset
|
574 |
slicepoint = rangeid[1] + slicesize |
2132
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
575 |
else: |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
576 |
assert standard_start < rangedepth |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
577 |
slicepoint = standard_start |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
578 |
return slicepoint |
d77262807411
stablerange: move standard slice point definition in main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2131
diff
changeset
|
579 |
|
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
580 |
def _slicesrangeat(self, repo, rangeid, globalindex): |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
581 |
p1, p2 = self._parents(rangeid[0], repo.changelog.parentrevs) |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
582 |
if p2 == nodemod.nullrev: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
583 |
reuserev = p1 |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
584 |
else: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
585 |
index, reuserev = self._inheritancepoint(repo, rangeid[0]) |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
586 |
if index < globalindex: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
587 |
return self._slicesrangeatmerge(repo, rangeid, globalindex) |
2136
086a85c37e9e
stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2135
diff
changeset
|
588 |
|
2218
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
589 |
assert reuserev != nodemod.nullrev |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
590 |
|
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
591 |
reuserange = (reuserev, rangeid[1]) |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
592 |
top = (rangeid[0], globalindex) |
2187
c583efbaec78
revsfromrange: update cache for parentrange directly in the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2186
diff
changeset
|
593 |
|
2218
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
594 |
if rangeid[1] + self.rangelength(repo, reuserange) == globalindex: |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
595 |
return [reuserange, top] |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
596 |
# This will not initiate a recursion since we took appropriate |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
597 |
# precaution in the caller of this method to ensure it will be so. |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
598 |
# It the parent is a merge that will not be the case but computing |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
599 |
# subranges from a merge will not recurse. |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
600 |
reusesubranges = self.subranges(repo, reuserange) |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
601 |
slices = reusesubranges[:-1] # pop the top |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
602 |
slices.append(top) |
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
603 |
return slices |
2136
086a85c37e9e
stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2135
diff
changeset
|
604 |
|
2169
03baabcd1b9e
stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2168
diff
changeset
|
605 |
def _slicesrangeatmerge(self, repo, rangeid, globalindex): |
2161
0a06f5cbca4b
stablerange: stop using '.index' in '_slicesrangeat'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2160
diff
changeset
|
606 |
localindex = globalindex - rangeid[1] |
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
607 |
cl = repo.changelog |
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
608 |
|
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
609 |
result = [] |
2190
f4cc3cf27a3a
revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2189
diff
changeset
|
610 |
allrevs = self.revsfromrange(repo, rangeid) |
f4cc3cf27a3a
revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2189
diff
changeset
|
611 |
bottomrevs = allrevs[:localindex] |
2215
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
612 |
|
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
613 |
if globalindex == self.depthrev(repo, bottomrevs[-1]): |
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
614 |
# simple case, top revision in the bottom set contains exactly the |
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
615 |
# revision we needs |
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
616 |
result.append((bottomrevs[-1], rangeid[1])) |
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
617 |
else: |
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
618 |
parentrevs = cl.parentrevs |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
619 |
parents = self._parents |
2217
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
620 |
bheads = set(bottomrevs) |
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
621 |
du = bheads.difference_update |
2216
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
622 |
reachableroots = repo.changelog.reachableroots |
2222
6b19998242ed
stablerange: fix merge slicing when range has multiple roots
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2221
diff
changeset
|
623 |
minrev = min(bottomrevs) |
2190
f4cc3cf27a3a
revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2189
diff
changeset
|
624 |
for r in bottomrevs: |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
625 |
du(parents(r, parentrevs)) |
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
626 |
for h in bheads: |
2216
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
627 |
# reachable roots is fast because is C |
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
628 |
# |
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
629 |
# It is worth noting that will use this kind of filtering from |
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
630 |
# "h" multiple time in a warming run. So using "ancestors" and |
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
631 |
# caching that should be faster. But python code filtering on |
de76219b42b8
merge-slicing: use reachable roots to filter the various branches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2215
diff
changeset
|
632 |
# the ancestors end up being slower. |
2222
6b19998242ed
stablerange: fix merge slicing when range has multiple roots
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2221
diff
changeset
|
633 |
hrevs = reachableroots(minrev, [h], bottomrevs, True) |
2194
8e7b2918e1a3
stablerange: directly use 'self' when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2193
diff
changeset
|
634 |
start = self.depthrev(repo, h) - len(hrevs) |
2196
2ecc88baabf9
stablerange: directly use tuple to refer to a stable range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2194
diff
changeset
|
635 |
entry = (h, start) |
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
636 |
result.append(entry) |
2217
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
637 |
|
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
638 |
# Talking about python code being slow, the following code is an |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
639 |
# alternative implementation. |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
640 |
# |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
641 |
# It complexity is better since is does a single traversal on the |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
642 |
# bottomset. However since it is all python it end up being |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
643 |
# slower. |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
644 |
# I'm keeping it here as an inspiration for a future C version |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
645 |
# branches = [] |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
646 |
# for current in reversed(bottomrevs): |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
647 |
# ps = parents(current, parentrevs) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
648 |
# found = False |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
649 |
# for brevs, bexpect in branches: |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
650 |
# if current in bexpect: |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
651 |
# found = True |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
652 |
# brevs.append(current) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
653 |
# bexpect.discard(current) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
654 |
# bexpect.update(ps) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
655 |
# if not found: |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
656 |
# branches.append(([current], set(ps))) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
657 |
# for revs, __ in reversed(branches): |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
658 |
# head = revs[0] |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
659 |
# index = self.depthrev(repo, head) - len(revs) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
660 |
# result.append((head, index)) |
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
661 |
|
2215
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
662 |
# top part is trivial |
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
663 |
top = (rangeid[0], globalindex) |
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
664 |
result.append(top) |
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
665 |
return result |
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
666 |
|
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
667 |
############################# |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
668 |
### simple sqlite caching ### |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
669 |
############################# |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
670 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
671 |
_sqliteschema = [ |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
672 |
"""CREATE TABLE meta(schemaversion INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
673 |
tiprev INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
674 |
tipnode BLOB NOT NULL |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
675 |
);""", |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
676 |
"CREATE TABLE depth(rev INTEGER NOT NULL PRIMARY KEY, depth INTEGER NOT NULL);", |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
677 |
"""CREATE TABLE range(rev INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
678 |
idx INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
679 |
PRIMARY KEY(rev, idx));""", |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
680 |
"""CREATE TABLE subranges(listidx INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
681 |
suprev INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
682 |
supidx INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
683 |
subrev INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
684 |
subidx INTEGER NOT NULL, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
685 |
PRIMARY KEY(listidx, suprev, supidx), |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
686 |
FOREIGN KEY (suprev, supidx) REFERENCES range(rev, idx), |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
687 |
FOREIGN KEY (subrev, subidx) REFERENCES range(rev, idx) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
688 |
);""", |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
689 |
"CREATE INDEX subrange_index ON subranges (suprev, supidx);", |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
690 |
"CREATE INDEX depth_index ON depth (rev);" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
691 |
] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
692 |
_newmeta = "INSERT INTO meta (schemaversion, tiprev, tipnode) VALUES (?,?,?);" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
693 |
_updatemeta = "UPDATE meta SET tiprev = ?, tipnode = ?;" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
694 |
_updatedepth = "INSERT INTO depth(rev, depth) VALUES (?,?);" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
695 |
_updaterange = "INSERT INTO range(rev, idx) VALUES (?,?);" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
696 |
_updatesubranges = """INSERT |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
697 |
INTO subranges(listidx, suprev, supidx, subrev, subidx) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
698 |
VALUES (?,?,?,?,?);""" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
699 |
_queryexist = "SELECT name FROM sqlite_master WHERE type='table' AND name='meta';" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
700 |
_querymeta = "SELECT schemaversion, tiprev, tipnode FROM meta;" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
701 |
_querydepth = "SELECT depth FROM depth WHERE rev = ?;" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
702 |
_batchdepth = "SELECT rev, depth FROM depth;" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
703 |
_queryrange = "SELECT * FROM range WHERE (rev = ? AND idx = ?);" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
704 |
_querysubranges = """SELECT subrev, subidx |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
705 |
FROM subranges |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
706 |
WHERE (suprev = ? AND supidx = ?) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
707 |
ORDER BY listidx;""" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
708 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
709 |
class sqlstablerange(stablerange): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
710 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
711 |
_schemaversion = 0 |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
712 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
713 |
def __init__(self, repo): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
714 |
super(sqlstablerange, self).__init__() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
715 |
self._path = repo.vfs.join('cache/evoext_stablerange_v0.sqlite') |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
716 |
self._cl = repo.unfiltered().changelog # (okay to keep an old one) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
717 |
self._ondisktiprev = None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
718 |
self._ondisktipnode = None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
719 |
self._unsaveddepth = {} |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
720 |
self._unsavedsubranges = {} |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
721 |
self._fulldepth = False |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
722 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
723 |
def warmup(self, repo, upto=None): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
724 |
self._con # make sure the data base is loaded |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
725 |
try: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
726 |
# samelessly lock the repo to ensure nobody will update the repo |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
727 |
# concurently. This should not be too much of an issue if we warm |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
728 |
# at the end of the transaction. |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
729 |
# |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
730 |
# XXX However, we lock even if we are up to date so we should check |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
731 |
# before locking |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
732 |
with repo.lock(): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
733 |
super(sqlstablerange, self).warmup(repo, upto) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
734 |
self._save(repo) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
735 |
except error.LockError: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
736 |
# Exceptionnally we are noisy about it since performance impact is |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
737 |
# large We should address that before using this more widely. |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
738 |
repo.ui.warn('stable-range cache: unable to lock repo while warming\n') |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
739 |
repo.ui.warn('(cache will not be saved)\n') |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
740 |
super(sqlstablerange, self).warmup(repo, upto) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
741 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
742 |
def _getdepth(self, rev): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
743 |
cache = self._depthcache |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
744 |
if rev not in cache and rev <= self._ondisktiprev and self._con is not None: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
745 |
value = None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
746 |
result = self._con.execute(_querydepth, (rev,)).fetchone() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
747 |
if result is not None: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
748 |
value = result[0] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
749 |
# in memory caching of the value |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
750 |
cache[rev] = value |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
751 |
return cache.get(rev) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
752 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
753 |
def _setdepth(self, rev, depth): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
754 |
assert rev not in self._unsaveddepth |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
755 |
self._unsaveddepth[rev] = depth |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
756 |
super(sqlstablerange, self)._setdepth(rev, depth) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
757 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
758 |
def _getsub(self, rangeid): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
759 |
cache = self._subrangescache |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
760 |
if rangeid not in cache and rangeid[0] <= self._ondisktiprev and self._con is not None: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
761 |
value = None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
762 |
result = self._con.execute(_queryrange, rangeid).fetchone() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
763 |
if result is not None: # database know about this node (skip in the future?) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
764 |
value = self._con.execute(_querysubranges, rangeid).fetchall() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
765 |
# in memory caching of the value |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
766 |
cache[rangeid] = value |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
767 |
return cache.get(rangeid) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
768 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
769 |
def _setsub(self, rangeid, value): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
770 |
assert rangeid not in self._unsavedsubranges |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
771 |
self._unsavedsubranges[rangeid] = value |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
772 |
super(sqlstablerange, self)._setsub(rangeid, value) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
773 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
774 |
def _inheritancepoint(self, *args, **kwargs): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
775 |
self._loaddepth() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
776 |
return super(sqlstablerange, self)._inheritancepoint(*args, **kwargs) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
777 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
778 |
@util.propertycache |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
779 |
def _con(self): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
780 |
con = sqlite3.connect(self._path) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
781 |
con.text_factory = str |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
782 |
cur = con.execute(_queryexist) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
783 |
if cur.fetchone() is None: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
784 |
return None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
785 |
meta = con.execute(_querymeta).fetchone() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
786 |
if meta is None: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
787 |
return None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
788 |
if meta[0] != self._schemaversion: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
789 |
return None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
790 |
if len(self._cl) <= meta[1]: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
791 |
return None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
792 |
if self._cl.node(meta[1]) != meta[2]: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
793 |
return None |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
794 |
self._ondisktiprev = meta[1] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
795 |
self._ondisktipnode = meta[2] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
796 |
if self._tiprev < self._ondisktiprev: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
797 |
self._tiprev = self._ondisktiprev |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
798 |
self._tipnode = self._ondisktipnode |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
799 |
return con |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
800 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
801 |
def _save(self, repo): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
802 |
repo = repo.unfiltered() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
803 |
if not (self._unsavedsubranges or self._unsaveddepth): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
804 |
return # no new data |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
805 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
806 |
if self._con is None: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
807 |
util.unlinkpath(self._path, ignoremissing=True) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
808 |
if '_con' in vars(self): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
809 |
del self._con |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
810 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
811 |
con = sqlite3.connect(self._path) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
812 |
con.text_factory = str |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
813 |
with con: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
814 |
for req in _sqliteschema: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
815 |
con.execute(req) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
816 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
817 |
meta = [self._schemaversion, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
818 |
self._tiprev, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
819 |
self._tipnode, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
820 |
] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
821 |
con.execute(_newmeta, meta) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
822 |
else: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
823 |
con = self._con |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
824 |
meta = con.execute(_querymeta).fetchone() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
825 |
if meta[2] != self._ondisktipnode or meta[1] != self._ondisktiprev: |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
826 |
# drifting is currently an issue because this means another |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
827 |
# process might have already added the cache line we are about |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
828 |
# to add. This will confuse sqlite |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
829 |
msg = _('stable-range cache: skipping write, ' |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
830 |
'database drifted under my feet\n') |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
831 |
hint = _('(disk: %s-%s vs mem: %s%s)\n') |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
832 |
data = (meta[2], meta[1], self._ondisktiprev, self._ondisktipnode) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
833 |
repo.ui.warn(msg) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
834 |
repo.ui.warn(hint % data) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
835 |
return |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
836 |
meta = [self._tiprev, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
837 |
self._tipnode, |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
838 |
] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
839 |
con.execute(_updatemeta, meta) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
840 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
841 |
self._savedepth(con, repo) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
842 |
self._saverange(con, repo) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
843 |
con.commit() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
844 |
self._ondisktiprev = self._tiprev |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
845 |
self._ondisktipnode = self._tipnode |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
846 |
self._unsaveddepth.clear() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
847 |
self._unsavedsubranges.clear() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
848 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
849 |
def _savedepth(self, con, repo): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
850 |
repo = repo.unfiltered() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
851 |
data = self._unsaveddepth.items() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
852 |
con.executemany(_updatedepth, data) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
853 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
854 |
def _loaddepth(self): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
855 |
"""batch load all data about depth""" |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
856 |
if not (self._fulldepth or self._con is None): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
857 |
result = self._con.execute(_batchdepth) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
858 |
self._depthcache.update(result.fetchall()) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
859 |
self._fulldepth = True |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
860 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
861 |
def _saverange(self, con, repo): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
862 |
repo = repo.unfiltered() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
863 |
data = [] |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
864 |
allranges = set() |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
865 |
for key, value in self._unsavedsubranges.items(): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
866 |
allranges.add(key) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
867 |
for idx, sub in enumerate(value): |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
868 |
data.append((idx, key[0], key[1], sub[0], sub[1])) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
869 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
870 |
con.executemany(_updaterange, allranges) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
871 |
con.executemany(_updatesubranges, data) |
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
872 |
|
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
873 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
874 |
@eh.reposetup |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
875 |
def setupcache(ui, repo): |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
876 |
|
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
877 |
class stablerangerepo(repo.__class__): |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
878 |
|
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
879 |
@localrepo.unfilteredpropertycache |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
880 |
def stablerange(self): |
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
881 |
return sqlstablerange(repo) |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
882 |
|
2236
c0e2ba85e76a
stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2235
diff
changeset
|
883 |
@localrepo.unfilteredmethod |
c0e2ba85e76a
stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2235
diff
changeset
|
884 |
def destroyed(self): |
c0e2ba85e76a
stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2235
diff
changeset
|
885 |
if 'stablerange' in vars(self): |
c0e2ba85e76a
stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2235
diff
changeset
|
886 |
del self.stablerange |
c0e2ba85e76a
stablerange: drop the cache on 'destroyed'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2235
diff
changeset
|
887 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
888 |
repo.__class__ = stablerangerepo |