author | Pierre-Yves David <pierre-yves.david@octobus.net> |
Sun, 08 Sep 2019 21:24:45 +0200 | |
changeset 4838 | bc0ea7666d4d |
parent 4836 | e2465969958e |
child 4854 | 79c9bc7663c2 |
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. |
4836
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
9 |
"""stable range |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
10 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
11 |
General Goals and Properties |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
12 |
--------------------------- |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
13 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
14 |
Stable-ranges get useful when some logic needs a recursive way to slice the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
15 |
history of a repository in smaller and smaller group of revisions. Here is |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
16 |
example of such use cases: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
17 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
18 |
* **bundle caching:** |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
19 |
With an easy way to slice any subsets of history into stable-ranges, we |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
20 |
can cache a small number of bundles covering these ranges and reuse them for |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
21 |
other pull operations. Even if the pull operation have different boudaries. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
22 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
23 |
* **metadata discovery:** |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
24 |
With a simple way to recursively look at smaller and smaller ranges, an |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
25 |
algorithm can do fine-grained discovery of area of history where some mutable |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
26 |
metadata differ from one repository to another. Such meta data can be |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
27 |
obsolescence markers, CI status, lightweight stag, etc... |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
28 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
29 |
To fix these use cases best, stable-ranges need some important properties: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
30 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
31 |
* the total number of ranges needed to cover a full repository is well bounded. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
32 |
* the minimal number of ranges to cover an arbitrary subset of the history is well bounded |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
33 |
* for the same section of history, the range will be the same on any |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
34 |
repositories, |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
35 |
* the ranges are cheap to compute iteratively, each new revisions re-uses the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
36 |
ranges previous revisions uses. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
37 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
38 |
Simple introduction to the Concepts |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
39 |
----------------------------------- |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
40 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
41 |
To keep things simple, let us look at the issue on a linear history:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
42 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
43 |
A -> B -> C -> D -> E -> F -> G -> H |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
44 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
45 |
To make sure we have range that cover each part of the history with a good |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
46 |
granularity we use some binary recursion. The standard stable range will be: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
47 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
48 |
[A -> B -> C -> D -> E -> F -> G -> H] size 8 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
49 |
[A -> B -> C -> D] [E -> F -> G -> H] size 4 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
50 |
[A -> B] [C -> D] [E -> F] [G -> H] size 2 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
51 |
[A] [B] [C] [D] [E] [F] [G] [H] size 1 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
52 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
53 |
Well bounded total number of ranges: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
54 |
```````````````````````````````````` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
55 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
56 |
This binary slicing make sure we keep the total number of stable ranges under control. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
57 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
58 |
As you can see, we have N size 1 ranges. They are trivial and we don't care |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
59 |
about them. Then we have: N/2 size 2 ranges + N/4 size 4 ranges + N/8 size 8 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
60 |
ranges, etc... So a total of about "length(repo)" standard ranges. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
61 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
62 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
63 |
Well bounded number of range to cover a subset: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
64 |
``````````````````````````````````````````````` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
65 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
66 |
Any subset of the history can be expressed with this standard ranges. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
67 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
68 |
For example, [A, F] subset, can be covered with 2 ranges:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
69 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
70 |
[A ->[B -> C -> D] [E -> F] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
71 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
72 |
A less strivial example [B, F], still requires a small number of ranges (3):: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
73 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
74 |
[B] [C -> D] [E -> F] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
75 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
76 |
In practice, any subset can be expressed in at most "2 x log2(length(subset))" |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
77 |
stable range, well bounded value. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
78 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
79 |
Cheap incremental updates |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
80 |
````````````````````````` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
81 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
82 |
The scheme describe above result in 2N subranges for a repository is size N. We |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
83 |
do not want to have to recompute these 2N stable-ranges whenever a new revision |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
84 |
is added to the repository. To achieve these, the stable-ranges are defined by |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
85 |
**fixed boundaries** that are independant from the total size of the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
86 |
repository. Here is how it looks like in our example. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
87 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
88 |
We start with a repository having only [A, F]. Notice how we still creates |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
89 |
power of two sized stable range:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
90 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
91 |
[A -> B -> C -> D] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
92 |
[A -> B] [C -> D] [E -> F] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
93 |
[A] [B] [C] [D] [E] [F] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
94 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
95 |
This we simply adds a new revision G, we reuse more the range we already have:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
96 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
97 |
[A -> B -> C -> D] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
98 |
[A -> B] [C -> D] [E -> F] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
99 |
[A] [B] [C] [D] [E] [F] [G] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
100 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
101 |
Adding H is a bigger even as we read a new boundary. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
102 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
103 |
[A -> B -> C -> D -> E -> F -> G -> H] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
104 |
[A -> B -> C -> D] [E -> F -> G -> H] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
105 |
[A -> B] [C -> D] [E -> F] [G -> H] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
106 |
[A] [B] [C] [D] [E] [F] [G] [H] |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
107 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
108 |
At most, adding a new revision `R` will introduces `log2(length(::R))` new |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
109 |
stable ranges. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
110 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
111 |
More advanced elements |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
112 |
---------------------- |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
113 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
114 |
Of course, the history of repository is not as simple as our linear example. So |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
115 |
how do we deal with the branching and merging? To do so, we leverage the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
116 |
"stable sort" algorithm defined in the `stablesort.py` module. To define the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
117 |
stable range that compose a set of revison `::R`, we linearize the space by |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
118 |
sorting it. The stable sort algorithm has two important property: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
119 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
120 |
First, it give the same result on different repository. So we can use it to |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
121 |
algorithm involving multiple peers. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
122 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
123 |
Second, in case of merge, it reuse the same order as the parents as much as possible. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
124 |
This is important to keep reusing existing stable range as the repository grow. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
125 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
126 |
How are ranges defined? |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
127 |
``````````````````````` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
128 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
129 |
To keep things small, and simple, a stable range always contains the final part |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
130 |
of a `stablesort(::R)` set of revision. It is defined by two items: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
131 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
132 |
* its head revision, the R in `stablesort(::R)` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
133 |
* the size of that range... well almost, for implementation reason, it uses the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
134 |
index of the first included item. Or in other word, the number of excluded |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
135 |
initial item in `stablesort(::R)`. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
136 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
137 |
Lets look at a practical case. In our initial example, `[A, B, C, D, E, F, G, |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
138 |
H]` is H-0; `[E, F, G, H]` is H-4; `[G, H]` is H-6 and `[H]` is H-7. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
139 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
140 |
Let us look at a non linar graph:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
141 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
142 |
A - B - C - E |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
143 |
| / |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
144 |
-D |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
145 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
146 |
and assume that `stablesort(::E) = [A, B, C, D, E]`. Then `[A, B, C]` is C-0, |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
147 |
`[A, B, D]` is D-0; `[D, E]` is E-3, `[E]` is E-4, etc... |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
148 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
149 |
Slicing in a non linear context |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
150 |
``````````````````````````````` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
151 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
152 |
Branching can also affect the way we slice things. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
153 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
154 |
The small example above offers a simple example. For a size 5 (starting at the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
155 |
root), standard slicing will want a size 4 part and size 1 part. So, in a |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
156 |
simple linear space `[A, B, C, D, E]` would be sliced as `[A, B, C, D] + [E]`. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
157 |
However, in our non-linear case, `[A, B, C, D]` has two heads (C and D) and |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
158 |
cannot be expressed with a single range. As a result the range will be sliced |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
159 |
into more sub ranges:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
160 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
161 |
stdslice(A-0) = [A, B, C] + [D] + [E] = C-0 + D-2 + A-4 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
162 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
163 |
Yet, this does not mean ranges containing a merge will always result in slicing |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
164 |
with many revision. the sub ranges might also silently contains them. Let us |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
165 |
look at an exemple:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
166 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
167 |
A - B - C - D - E --- G - H |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
168 |
| / |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
169 |
---------- F |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
170 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
171 |
with:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
172 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
173 |
`stablesort(::H) == [A, B, C, D, E, F, G, H]` |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
174 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
175 |
then:: |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
176 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
177 |
stdslice(H-0) = [A, B, C, D] + [E, F, G, H] = D-0 + H-4 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
178 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
179 |
As a result the non linearity will increase the number of subranges involved, |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
180 |
but in practice the impact stay limited. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
181 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
182 |
The total number of standard subranges stay under control with about |
4838
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
183 |
`O(log2(N))` new stable range introduced for each new revision. In practice the |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
184 |
total number of stableranges we have is about `O(length(repo))` |
4836
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
185 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
186 |
In addition, it is worth nothing that the head of the extra ranges we have to |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
187 |
use will match the destination of the "jump" cached by the stablesort |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
188 |
algorithm. So, all this slicing can usually be done without iterating over the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
189 |
stable sorted revision. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
190 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
191 |
Caching Strategy |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
192 |
---------------- |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
193 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
194 |
The current caching strategy use a very space inefficient sqlite database. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
195 |
testing show it often take 100x more space than what basic binary storage would |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
196 |
take. The sqlite storage was very useful at the proof of concept stage. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
197 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
198 |
Since all new stable-ranges introduced by a revision R will be "R headed". So we |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
199 |
could easily store their standard subranges alongside the revision information |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
200 |
to reuse the existing revision index. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
201 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
202 |
Subrange informatin can be efficiently stored, a naive approach storing all |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
203 |
stable ranges and their subranges would requires just 2 integer per range + 2 |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
204 |
integer for any extra sub-ranges other than the first and last ones. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
205 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
206 |
We can probably push efficiency further by taking advantage of the large |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
207 |
overlap in subranges for one non-merge revision to the next. This is probably a |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
208 |
premature optimisation until we start getting actual result for a naive binary |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
209 |
storage. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
210 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
211 |
To use this at a large scale, it would be important to compute these data at |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
212 |
commit time and to exchange them alongside the revision over the network. This |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
213 |
is similar to what we do for other cached data. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
214 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
215 |
Performance |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
216 |
----------- |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
217 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
218 |
The current implementation has not been especially optimized for performance. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
219 |
The goal was mostly to get the order of magnitude of the algorithm complexity. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
220 |
The result are convincing: medium repository get a full cache warming in a |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
221 |
couple of seconds and even very large and branchy repository get a fully warmed |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
222 |
in the order of tens of minutes. We do not observes a complexity explosion |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
223 |
making the algorithm unusable of large repositories. |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
224 |
|
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
225 |
A better cache implementation combined with an optimized version of the |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
226 |
algorithm should give much faster performance. Combined with commit-time |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
227 |
computation and exchange over the network, the overall impact of this should be |
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
228 |
invisible to the user. |
4838
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
229 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
230 |
The stable range is currently successfully used in production for 2 use cases: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
231 |
* obsolescence markers discovery, |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
232 |
* caching precomputed bundle while serving pulls |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
233 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
234 |
practical data |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
235 |
-------------- |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
236 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
237 |
The evolve repository: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
238 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
239 |
number of revisions: 4833 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
240 |
number of heads: 15 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
241 |
number of merge: 612 ( 12%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
242 |
number of range: 4826 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
243 |
with 2 subranges: 4551 ( 94%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
244 |
with 3 subranges: 255 ( 5%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
245 |
with 4 subranges: 12 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
246 |
with 5 subranges: 7 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
247 |
with 8 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
248 |
average range/revs: 0.99 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
249 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
250 |
Estimated approximative size of a naive compact storage: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
251 |
41 056 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
252 |
Current size of the sqlite cache (for comparison): |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
253 |
5 312 512 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
254 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
255 |
The mercurial repository: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
256 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
257 |
number of revisions: 42849 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
258 |
number of heads: 2 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
259 |
number of merge: 2647 ( 6%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
260 |
number of range: 41279 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
261 |
with 2 subranges: 39740 ( 96%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
262 |
with 3 subranges: 1494 ( 3%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
263 |
with 4 subranges: 39 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
264 |
with 5 subranges: 5 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
265 |
with 7 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
266 |
average range/revs: 0.96 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
267 |
Estimated approximative size of a naive compact storage: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
268 |
342 968 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
269 |
Current size of the sqlite cache (for comparison): |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
270 |
62 803 968 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
271 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
272 |
The pypy repository (very brancy history): |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
273 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
274 |
number of revisions: 97409 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
275 |
number of heads: 183 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
276 |
number of merge: 8371 ( 8%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
277 |
number of range: 107025 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
278 |
with 2 subranges: 100166 ( 93%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
279 |
with 3 subranges: 5839 ( 5%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
280 |
with 4 subranges: 605 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
281 |
with 5 subranges: 189 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
282 |
with 6 subranges: 90 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
283 |
with 7 subranges: 38 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
284 |
with 8 subranges: 18 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
285 |
with 9 subranges: 9 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
286 |
with 10 subranges: 15 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
287 |
with 11 subranges: 4 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
288 |
with 12 subranges: 6 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
289 |
with 13 subranges: 7 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
290 |
with 14 subranges: 6 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
291 |
with 15 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
292 |
with 16 subranges: 2 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
293 |
with 17 subranges: 2 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
294 |
with 18 subranges: 3 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
295 |
with 19 subranges: 2 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
296 |
with 20 subranges: 3 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
297 |
with 25 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
298 |
with 27 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
299 |
with 31 subranges: 3 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
300 |
with 32 subranges: 2 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
301 |
with 33 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
302 |
with 35 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
303 |
with 43 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
304 |
with 44 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
305 |
with 45 subranges: 2 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
306 |
with 47 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
307 |
with 51 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
308 |
with 52 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
309 |
with 57 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
310 |
with 65 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
311 |
with 73 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
312 |
with 79 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
313 |
average range/revs: 1.10 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
314 |
Estimated approximative size of a naive compact storage: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
315 |
934 176 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
316 |
Current size of the sqlite cache (for comparison): |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
317 |
201 236 480 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
318 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
319 |
A private and branchy repository: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
320 |
|
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
321 |
number of revisions: 605011 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
322 |
number of heads: 14061 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
323 |
number of merge: 118109 ( 19%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
324 |
number of range: 747625 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
325 |
with 2 subranges: 595985 ( 79%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
326 |
with 3 subranges: 130196 ( 17%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
327 |
with 4 subranges: 14093 ( 1%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
328 |
with 5 subranges: 4090 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
329 |
with 6 subranges: 741 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
330 |
with 7 subranges: 826 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
331 |
with 8 subranges: 1313 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
332 |
with 9 subranges: 83 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
333 |
with 10 subranges: 22 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
334 |
with 11 subranges: 9 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
335 |
with 12 subranges: 26 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
336 |
with 13 subranges: 5 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
337 |
with 14 subranges: 9 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
338 |
with 15 subranges: 3 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
339 |
with 16 subranges: 212 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
340 |
with 18 subranges: 6 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
341 |
with 19 subranges: 3 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
342 |
with 24 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
343 |
with 27 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
344 |
with 32 subranges: 1 ( 0%) |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
345 |
average range/revs: 1.23 |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
346 |
Estimated approximative size of a naive compact storage: |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
347 |
7 501 928 bytes |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
348 |
Current size of the sqlite cache (for comparison): |
bc0ea7666d4d
stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4836
diff
changeset
|
349 |
1 950 310 400 bytes |
4836
e2465969958e
stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
350 |
""" |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
351 |
|
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
352 |
import abc |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
353 |
import functools |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
354 |
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
|
355 |
import math |
2424
4afbcdcfa9b2
compat: handle lack of 'util.timer' for pre 4.2 version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2400
diff
changeset
|
356 |
import time |
2130
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
357 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
358 |
from mercurial import ( |
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
359 |
error, |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
360 |
node as nodemod, |
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
361 |
scmutil, |
2237
98e0369b548b
stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2236
diff
changeset
|
362 |
util, |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
363 |
) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
364 |
|
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
365 |
from mercurial.i18n import _ |
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
366 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
367 |
from . import ( |
4341
d1aab9d82f5b
evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents:
4146
diff
changeset
|
368 |
compat, |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3331
diff
changeset
|
369 |
exthelper, |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3331
diff
changeset
|
370 |
firstmergecache, |
3243
556316fe4b4f
stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
371 |
stablesort, |
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
372 |
utility, |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
373 |
) |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
374 |
|
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
375 |
filterparents = utility.filterparents |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
376 |
|
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
377 |
eh = exthelper.exthelper() |
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
378 |
|
2129
d07bb7cbae2f
stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2128
diff
changeset
|
379 |
|
2130
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
380 |
################################# |
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
381 |
### 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
|
382 |
################################# |
d784622dd5dc
stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2129
diff
changeset
|
383 |
|
2198
ab392bd1c518
stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2197
diff
changeset
|
384 |
def _hlp2(i): |
ab392bd1c518
stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2197
diff
changeset
|
385 |
"""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
|
386 |
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
|
387 |
|
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
388 |
def subrangesclosure(repo, stablerange, heads): |
2137
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
389 |
"""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
|
390 |
|
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
391 |
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
|
392 |
smallest in terms of number of revision it contains.""" |
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
393 |
subranges = 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
|
394 |
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
|
395 |
ranges = set(toproceed) |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
396 |
while toproceed: |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
397 |
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
|
398 |
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
|
399 |
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
|
400 |
ranges.add(r) |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
401 |
toproceed.append(r) |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
402 |
ranges = list(ranges) |
2142
7dc66a526b21
stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2141
diff
changeset
|
403 |
n = repo.changelog.node |
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
404 |
rangelength = stablerange.rangelength |
2167
d37f0423c072
stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2163
diff
changeset
|
405 |
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
|
406 |
return ranges |
dd8ed58bf79c
stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2136
diff
changeset
|
407 |
|
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
408 |
_stablerangemethodmap = { |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
409 |
b'branchpoint': lambda repo: stablerange(), |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
410 |
b'default': lambda repo: repo.stablerange, |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
411 |
b'basic-branchpoint': lambda repo: stablerangebasic(), |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
412 |
b'basic-mergepoint': lambda repo: stablerangedummy_mergepoint(), |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
413 |
b'mergepoint': lambda repo: stablerange_mergepoint(), |
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
414 |
} |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
415 |
|
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
416 |
@eh.command( |
4715
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
417 |
b'debugstablerange', |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
418 |
[ |
4715
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
419 |
(b'r', b'rev', [], b'operate on (rev, 0) ranges for rev in REVS'), |
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
420 |
(b'', b'subranges', False, b'recursively display data for subranges too'), |
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
421 |
(b'', b'verify', False, b'checks subranges content (EXPENSIVE)'), |
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
422 |
(b'', b'method', b'branchpoint', |
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
423 |
b'method to use, one of "branchpoint", "mergepoint"') |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
424 |
], |
4715
12c8b24757f4
py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4341
diff
changeset
|
425 |
_(b'')) |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
426 |
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
|
427 |
"""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
|
428 |
|
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
429 |
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
|
430 |
--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
|
431 |
""" |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
432 |
short = nodemod.short |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
433 |
revs = scmutil.revrange(repo, opts['rev']) |
2505
7fd55c5efffb
debugstablerange: cleanly "Abort" when no revision are specified
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2504
diff
changeset
|
434 |
if not revs: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
435 |
raise error.Abort(b'no revisions specified') |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
436 |
if ui.verbose: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
437 |
template = b'%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
|
438 |
|
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
439 |
def _rangestring(repo, rangeid): |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
440 |
return template % ( |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
441 |
short(node(rangeid[0])), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
442 |
rangeid[1], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
443 |
rangeid[0], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
444 |
depth(unfi, rangeid[0]), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
445 |
length(unfi, rangeid) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
446 |
) |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
447 |
else: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
448 |
template = b'%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
|
449 |
|
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
450 |
def _rangestring(repo, rangeid): |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
451 |
return template % ( |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
452 |
short(node(rangeid[0])), |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
453 |
rangeid[1], |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
454 |
) |
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
455 |
# prewarm depth cache |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
456 |
unfi = repo.unfiltered() |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
457 |
node = unfi.changelog.node |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
458 |
|
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
459 |
method = opts['method'] |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
460 |
getstablerange = _stablerangemethodmap.get(method) |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
461 |
if getstablerange is None: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
462 |
raise error.Abort(b'unknown stable sort method: "%s"' % method) |
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
463 |
|
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
464 |
stablerange = getstablerange(unfi) |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
465 |
depth = stablerange.depthrev |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
466 |
length = stablerange.rangelength |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
467 |
subranges = stablerange.subranges |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
468 |
stablerange.warmup(repo, max(revs)) |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
469 |
|
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
470 |
if opts['subranges']: |
3268
10badf5951e5
stablerange: compute the subrange closure on an unfiltered repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3264
diff
changeset
|
471 |
ranges = subrangesclosure(unfi, stablerange, revs) |
3248
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
472 |
else: |
07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3245
diff
changeset
|
473 |
ranges = [(r, 0) for r in revs] |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
474 |
|
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
475 |
for r in ranges: |
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
476 |
subs = subranges(unfi, r) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
477 |
subsstr = b', '.join(_rangestring(unfi, s) for s in subs) |
2231
f872738bb5b3
stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2227
diff
changeset
|
478 |
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
|
479 |
if opts['verify']: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
480 |
status = b'leaf' |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
481 |
if 1 < length(unfi, r): |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
482 |
status = b'complete' |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
483 |
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
|
484 |
subrevs = set() |
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
485 |
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
|
486 |
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
|
487 |
if revs != subrevs: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
488 |
status = b'missing' |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
489 |
ui.status(b'%s [%s] - %s\n' % (rstr, status, subsstr)) |
2232
6b95bcc402fe
debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2231
diff
changeset
|
490 |
else: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
491 |
ui.status(b'%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
|
492 |
|
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
493 |
class abstractstablerange(object): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
494 |
"""The official API for a stablerange""" |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
495 |
|
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
496 |
__metaclass__ = abc.ABCMeta |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
497 |
|
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
498 |
@abc.abstractmethod |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
499 |
def subranges(self, repo, rangeid): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
500 |
"""return the stable sub-ranges of a rangeid""" |
3916
b103685a082b
cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3685
diff
changeset
|
501 |
raise NotImplementedError() |
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
502 |
|
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
503 |
@abc.abstractmethod |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
504 |
def revsfromrange(self, repo, rangeid): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
505 |
"""return revision contained in a range""" |
3916
b103685a082b
cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3685
diff
changeset
|
506 |
raise NotImplementedError() |
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
507 |
|
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
508 |
@abc.abstractmethod |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
509 |
def depthrev(self, repo, rev): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
510 |
"""depth a revision""" |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
511 |
# Exist to allow basic implementation to ignore the depthcache |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
512 |
# Could be demoted to _depthrev. |
3916
b103685a082b
cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3685
diff
changeset
|
513 |
raise NotImplementedError() |
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
514 |
|
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
515 |
@abc.abstractmethod |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
516 |
def warmup(self, repo, upto=None): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
517 |
"""warmup the stable range cache""" |
3916
b103685a082b
cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3685
diff
changeset
|
518 |
raise NotImplementedError() |
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
519 |
|
3259
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
520 |
@abc.abstractmethod |
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
521 |
def rangelength(self, repo, rangeid): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
522 |
"""number of revision in <range>""" |
3916
b103685a082b
cleanup: use NotImplementedError instead of NotImplemented
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3685
diff
changeset
|
523 |
raise NotImplementedError() |
3250
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
524 |
|
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
525 |
def _slicepoint(self, repo, rangeid): |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
526 |
"""find the standard slicing point for a range""" |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
527 |
rangedepth = self.depthrev(repo, rangeid[0]) |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
528 |
step = _hlp2(rangedepth) |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
529 |
standard_start = 0 |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
530 |
while standard_start < rangeid[1] and 0 < step: |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
531 |
if standard_start + step < rangedepth: |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
532 |
standard_start += step |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
533 |
step //= 2 |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
534 |
if rangeid[1] == standard_start: |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
535 |
slicesize = _hlp2(self.rangelength(repo, rangeid)) |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
536 |
slicepoint = rangeid[1] + slicesize |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
537 |
else: |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
538 |
assert standard_start < rangedepth |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
539 |
slicepoint = standard_start |
8eaf30e1019f
stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3248
diff
changeset
|
540 |
return slicepoint |
3251
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
541 |
class stablerangebasic(abstractstablerange): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
542 |
"""a very dummy implementation of stablerange |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
543 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
544 |
the implementation is here to lay down the basic algorithm in the stable |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
545 |
range in a inefficient but easy to read manners. It should be used by test |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
546 |
to validate output.""" |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
547 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
548 |
__metaclass__ = abc.ABCMeta |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
549 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
550 |
def _sortfunction(self, repo, headrev): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
551 |
return stablesort.stablesort_branchpoint(repo, [headrev]) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
552 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
553 |
def warmup(self, repo, upto=None): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
554 |
# no cache to warm for basic implementation |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
555 |
pass |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
556 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
557 |
def depthrev(self, repo, rev): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
558 |
"""depth a revision""" |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
559 |
return len(repo.revs(b'::%d', rev)) |
3251
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
560 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
561 |
def revsfromrange(self, repo, rangeid): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
562 |
"""return revision contained in a range |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
563 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
564 |
The range `(<head>, <skip>)` contains all revisions stable-sorted from |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
565 |
<head>, skipping the <index>th lower revisions. |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
566 |
""" |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
567 |
headrev, index = rangeid[0], rangeid[1] |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
568 |
revs = self._sortfunction(repo, headrev) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
569 |
return revs[index:] |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
570 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
571 |
def rangelength(self, repo, rangeid): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
572 |
"""number of revision in <range>""" |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
573 |
return len(self.revsfromrange(repo, rangeid)) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
574 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
575 |
def subranges(self, repo, rangeid): |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
576 |
"""return the stable sub-ranges of a rangeid""" |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
577 |
headrev, index = rangeid[0], rangeid[1] |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
578 |
if self.rangelength(repo, rangeid) == 1: |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
579 |
return [] |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
580 |
slicepoint = self._slicepoint(repo, rangeid) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
581 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
582 |
# search for range defining the lower set of revision |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
583 |
# |
3252
d57400a0f4c3
stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3251
diff
changeset
|
584 |
# we walk the lower set from the top following the stable order of the |
d57400a0f4c3
stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3251
diff
changeset
|
585 |
# current "head" of the lower range. |
d57400a0f4c3
stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3251
diff
changeset
|
586 |
# |
d57400a0f4c3
stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3251
diff
changeset
|
587 |
# As soon as the revision in the lowerset diverges from the one in the |
d57400a0f4c3
stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3251
diff
changeset
|
588 |
# range being generated, we emit the range and start a new one. |
3251
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
589 |
result = [] |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
590 |
lowerrevs = self.revsfromrange(repo, rangeid)[:(slicepoint - index)] |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
591 |
head = None |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
592 |
headrange = None |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
593 |
skip = None |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
594 |
for rev in lowerrevs[::-1]: |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
595 |
if head is None: |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
596 |
head = rev |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
597 |
headrange = self.revsfromrange(repo, (head, 0)) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
598 |
skip = self.depthrev(repo, rev) - 1 |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
599 |
elif rev != headrange[skip - 1]: |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
600 |
result.append((head, skip)) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
601 |
head = rev |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
602 |
headrange = self.revsfromrange(repo, (head, 0)) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
603 |
skip = self.depthrev(repo, rev) - 1 |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
604 |
else: |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
605 |
skip -= 1 |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
606 |
result.append((head, skip)) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
607 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
608 |
result.reverse() |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
609 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
610 |
# top part is trivial |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
611 |
top = (headrev, slicepoint) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
612 |
result.append(top) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
613 |
|
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
614 |
# double check the result |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
615 |
initialrevs = self.revsfromrange(repo, rangeid) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
616 |
subrangerevs = sum((self.revsfromrange(repo, sub) for sub in result), |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
617 |
[]) |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
618 |
assert initialrevs == subrangerevs |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
619 |
return result |
0e4a05907c5e
stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3250
diff
changeset
|
620 |
|
3258
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
621 |
class stablerangedummy_mergepoint(stablerangebasic): |
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
622 |
"""a very dummy implementation of stablerange use 'mergepoint' sorting |
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
623 |
""" |
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
624 |
|
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
625 |
def _sortfunction(self, repo, headrev): |
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
626 |
return stablesort.stablesort_mergepoint_head_basic(repo, [headrev]) |
af1f8f0687e1
stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3253
diff
changeset
|
627 |
|
3259
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
628 |
class stablerangecached(abstractstablerange): |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
629 |
"""an implementation of stablerange using caching""" |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
630 |
|
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
631 |
__metaclass__ = abc.ABCMeta |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
632 |
|
3302
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
633 |
def __init__(self): |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
634 |
# cache the standard stable subranges or a range |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
635 |
self._subrangescache = {} |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
636 |
super(stablerangecached, self).__init__() |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
637 |
|
3259
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
638 |
def depthrev(self, repo, rev): |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
639 |
return repo.depthcache.get(rev) |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
640 |
|
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
641 |
def rangelength(self, repo, rangeid): |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
642 |
"""number of revision in <range>""" |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
643 |
headrev, index = rangeid[0], rangeid[1] |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
644 |
return self.depthrev(repo, headrev) - index |
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
645 |
|
3302
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
646 |
def subranges(self, repo, rangeid): |
3306
b67e0f676a28
stablerange: add an assert to detect buggy range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3305
diff
changeset
|
647 |
assert 0 <= rangeid[1] <= rangeid[0], rangeid |
3302
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
648 |
cached = self._getsub(rangeid) |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
649 |
if cached is not None: |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
650 |
return cached |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
651 |
value = self._subranges(repo, rangeid) |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
652 |
self._setsub(rangeid, value) |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
653 |
return value |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
654 |
|
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
655 |
def _getsub(self, rev): |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
656 |
"""utility function used to access the subranges cache |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
657 |
|
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
658 |
This mostly exist to help the on disk persistence""" |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
659 |
return self._subrangescache.get(rev) |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
660 |
|
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
661 |
def _setsub(self, rev, value): |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
662 |
"""utility function used to set the subranges cache |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
663 |
|
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
664 |
This mostly exist to help the on disk persistence.""" |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
665 |
self._subrangescache[rev] = value |
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
666 |
|
3303
318c938be80d
stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3302
diff
changeset
|
667 |
class stablerange_mergepoint(stablerangecached): |
3260
2f0c113b35f8
stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3259
diff
changeset
|
668 |
"""Stablerange implementation using 'mergepoint' based sorting |
2f0c113b35f8
stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3259
diff
changeset
|
669 |
""" |
3261
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
670 |
|
3264
383ec26247b3
stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3262
diff
changeset
|
671 |
def __init__(self): |
383ec26247b3
stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3262
diff
changeset
|
672 |
super(stablerange_mergepoint, self).__init__() |
383ec26247b3
stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3262
diff
changeset
|
673 |
|
3303
318c938be80d
stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3302
diff
changeset
|
674 |
def warmup(self, repo, upto=None): |
318c938be80d
stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3302
diff
changeset
|
675 |
# no cache to warm for basic implementation |
318c938be80d
stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3302
diff
changeset
|
676 |
pass |
3264
383ec26247b3
stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3262
diff
changeset
|
677 |
|
3261
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
678 |
def revsfromrange(self, repo, rangeid): |
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
679 |
"""return revision contained in a range |
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
680 |
|
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
681 |
The range `(<head>, <skip>)` contains all revisions stable-sorted from |
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
682 |
<head>, skipping the <index>th lower revisions. |
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
683 |
""" |
85160bd3f641
stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3260
diff
changeset
|
684 |
limit = self.rangelength(repo, rangeid) |
3339
f0933cdf614d
stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3333
diff
changeset
|
685 |
return repo.stablesort.get(repo, rangeid[0], limit=limit) |
3260
2f0c113b35f8
stablerange: introduce a smarte version of stablerange for 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3259
diff
changeset
|
686 |
|
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
687 |
def _stableparent(self, repo, headrev): |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
688 |
"""The parent of the changeset with reusable subrange |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
689 |
|
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
690 |
For non-merge it is simple, there is a single parent. For Mercurial we |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
691 |
have to find the right one. Since the stable sort use merge-point, we |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
692 |
know that one of REV parents stable sort is a subset of REV stable |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
693 |
sort. In other word: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
694 |
|
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
695 |
sort(::REV) = sort(::min(parents(REV)) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
696 |
+ sort(only(max(parents(REV)), min(parents(REV))) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
697 |
+ [REV] |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
698 |
|
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
699 |
We are looking for that `min(parents(REV))`. Since the subrange are |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
700 |
based on the sort, we can reuse its subrange as well. |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
701 |
""" |
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
702 |
ps = filterparents(repo.changelog.parentrevs(headrev)) |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
703 |
if not ps: |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
704 |
return nodemod.nullrev |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
705 |
elif len(ps) == 1: |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
706 |
return ps[0] |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
707 |
else: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
708 |
tiebreaker = stablesort._mergepoint_tie_breaker(repo) |
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
709 |
return min(ps, key=tiebreaker) |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
710 |
|
3304
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
711 |
def _parentrange(self, repo, rangeid): |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
712 |
stable_parent = self._stableparent(repo, rangeid[0]) |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
713 |
stable_parent_depth = self.depthrev(repo, stable_parent) |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
714 |
stable_parent_range = (stable_parent, rangeid[1]) |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
715 |
return stable_parent_depth, stable_parent_range |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
716 |
|
3305
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
717 |
def _warmcachefor(self, repo, rangeid, slicepoint): |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
718 |
"""warm cache with all the element necessary""" |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
719 |
stack = [] |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
720 |
depth, current = self._parentrange(repo, rangeid) |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
721 |
while current not in self._subrangescache and slicepoint < depth: |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
722 |
stack.append(current) |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
723 |
depth, current = self._parentrange(repo, current) |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
724 |
while stack: |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
725 |
current = stack.pop() |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
726 |
self.subranges(repo, current) |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
727 |
|
3302
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
728 |
def _subranges(self, repo, rangeid): |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
729 |
headrev, initial_index = rangeid |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
730 |
# size 1 range can't be sliced |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
731 |
if self.rangelength(repo, rangeid) == 1: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
732 |
return [] |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
733 |
# find were we need to slice |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
734 |
slicepoint = self._slicepoint(repo, rangeid) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
735 |
|
4137
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
736 |
ret = self._slicesrangeat(repo, rangeid, slicepoint) |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
737 |
|
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
738 |
return ret |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
739 |
|
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
740 |
def _slicesrangeat(self, repo, rangeid, slicepoint): |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
741 |
headrev, initial_index = rangeid |
3305
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
742 |
self._warmcachefor(repo, rangeid, slicepoint) |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
743 |
|
3304
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
744 |
stable_parent_data = self._parentrange(repo, rangeid) |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
745 |
stable_parent_depth, stable_parent_range = stable_parent_data |
d942fc5847f9
stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3303
diff
changeset
|
746 |
|
3305
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
747 |
# top range is always the same, so we can build it early for all |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
748 |
top_range = (headrev, slicepoint) |
a878d9406841
stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3304
diff
changeset
|
749 |
|
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
750 |
# now find out about the lower range, if we are lucky there is only |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
751 |
# one, otherwise we need to issue multiple one to cover every revision |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
752 |
# on the lower set. (and cover them only once). |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
753 |
if slicepoint == stable_parent_depth: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
754 |
# luckly shot, the parent is actually the head of the lower range |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
755 |
subranges = [ |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
756 |
stable_parent_range, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
757 |
top_range, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
758 |
] |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
759 |
elif slicepoint < stable_parent_depth: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
760 |
# The parent is above the slice point, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
761 |
# it's lower subrange will be the same so we just get them, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
762 |
# (and the top range is always the same) |
4137
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
763 |
subranges = self.subranges(repo, stable_parent_range)[:] |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
764 |
parenttop = subranges.pop() |
4146
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
765 |
lenparenttop = self.rangelength(repo, parenttop) |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
766 |
skimfromparent = stable_parent_depth - slicepoint |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
767 |
if lenparenttop < skimfromparent: |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
768 |
# dropping the first subrange of the stable parent range is not |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
769 |
# enough to skip what we need to skip, change in approach is needed |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
770 |
subranges = self._slicesrangeat(repo, stable_parent_range, slicepoint) |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
771 |
subranges.pop() |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
772 |
elif lenparenttop > skimfromparent: |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
773 |
# The first subrange of the parent is longer that what we want |
f7aa0ecae3a4
pullbundle: deal with another special case introduced by arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4137
diff
changeset
|
774 |
# to drop, we need to keep some of it. |
4137
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
775 |
midranges = self._slicesrangeat(repo, parenttop, slicepoint) |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
776 |
subranges.extend(midranges[:-1]) |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
777 |
subranges.append(top_range) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
778 |
elif initial_index < stable_parent_depth < slicepoint: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
779 |
# the parent is below the range we are considering, we need to |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
780 |
# compute these uniques subranges |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
781 |
subranges = [stable_parent_range] |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
782 |
subranges.extend(self._unique_subranges(repo, headrev, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
783 |
stable_parent_depth, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
784 |
slicepoint)) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
785 |
subranges.append(top_range) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
786 |
else: |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
787 |
# we cannot reuse the parent range at all |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
788 |
subranges = list(self._unique_subranges(repo, headrev, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
789 |
initial_index, |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
790 |
slicepoint)) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
791 |
subranges.append(top_range) |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
792 |
|
4137
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
793 |
### slow code block to validated the slicing works as expected |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
794 |
# toprevs = self.revsfromrange(repo, rangeid) |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
795 |
# subrevs = [] |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
796 |
# for s in subranges: |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
797 |
# subrevs.extend(self.revsfromrange(repo, s)) |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
798 |
# assert toprevs == subrevs, (rangeid, slicepoint, stable_parent_range, stable_parent_depth, toprevs, subrevs) |
21a3c051ca6c
stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4130
diff
changeset
|
799 |
|
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
800 |
return subranges |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
801 |
|
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
802 |
def _unique_subranges(self, repo, headrev, initial_index, slicepoint): |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
803 |
"""Compute subrange unique to the exclusive part of merge""" |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
804 |
result = [] |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
805 |
depth = repo.depthcache.get |
3333
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
806 |
nextmerge = repo.firstmergecache.get |
3339
f0933cdf614d
stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3333
diff
changeset
|
807 |
walkfrom = functools.partial(repo.stablesort.walkfrom, repo) |
f0933cdf614d
stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3333
diff
changeset
|
808 |
getjumps = functools.partial(repo.stablesort.getjumps, repo) |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
809 |
skips = depth(headrev) - slicepoint |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
810 |
tomap = slicepoint - initial_index |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
811 |
|
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
812 |
jumps = getjumps(headrev) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
813 |
# this function is only caled if headrev is a merge |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
814 |
# and initial_index is above its lower parents |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
815 |
assert jumps is not None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
816 |
jumps = iter(jumps) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
817 |
assert 0 < skips, skips |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
818 |
assert 0 < tomap, (tomap, (headrev, initial_index), slicepoint) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
819 |
|
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
820 |
# utility function to find the next changeset with jump information |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
821 |
# (and the distance to it) |
3333
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
822 |
def nextmergedata(startrev): |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
823 |
merge = nextmerge(startrev) |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
824 |
depthrev = depth(startrev) |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
825 |
if merge == startrev: |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
826 |
return 0, startrev |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
827 |
elif merge == nodemod.nullrev: |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
828 |
return depthrev, None |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
829 |
depthmerge = depth(merge) |
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
830 |
return depthrev - depthmerge, merge |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
831 |
|
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
832 |
# skip over all necesary data |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
833 |
mainjump = None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
834 |
jumpdest = headrev |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
835 |
while 0 < skips: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
836 |
jumphead = jumpdest |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
837 |
currentjump = next(jumps) |
3330
a67a586792dc
stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3329
diff
changeset
|
838 |
skipped = size = currentjump[2] |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
839 |
jumpdest = currentjump[1] |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
840 |
if size == skips: |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
841 |
jumphead = jumpdest |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
842 |
mainjump = next(jumps) |
3330
a67a586792dc
stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3329
diff
changeset
|
843 |
mainsize = mainjump[2] |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
844 |
elif skips < size: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
845 |
revs = walkfrom(jumphead) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
846 |
next(revs) |
4737
46c990705a96
py3: replace xrange() by range()
Martin von Zweigbergk <martinvonz@google.com>
parents:
4715
diff
changeset
|
847 |
for i in range(skips): |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
848 |
jumphead = next(revs) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
849 |
assert jumphead is not None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
850 |
skipped = skips |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
851 |
size -= skips |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
852 |
mainjump = currentjump |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
853 |
mainsize = size |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
854 |
skips -= skipped |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
855 |
assert skips == 0, skips |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
856 |
|
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
857 |
# exiting from the previous block we should have: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
858 |
# jumphead: first non-skipped revision (head of the high subrange) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
859 |
# mainjump: next jump coming jump on main iteration |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
860 |
# mainsize: len(mainjump[0]::jumphead) |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
861 |
|
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
862 |
# Now we need to compare walk on the main iteration with walk from the |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
863 |
# current subrange head. Instead of doing a full walk, we just skim |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
864 |
# over the jumps for each iteration. |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
865 |
rangehead = jumphead |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
866 |
refjumps = None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
867 |
size = 0 |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
868 |
while size < tomap: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
869 |
assert mainjump is not None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
870 |
if refjumps is None: |
3333
96d1cf475c19
stablerange: use first merge cache to skip over linear section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3332
diff
changeset
|
871 |
dist2merge, merge = nextmergedata(jumphead) |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
872 |
if (mainsize <= dist2merge) or merge is None: |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
873 |
refjumps = iter(()) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
874 |
ref = None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
875 |
else: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
876 |
# advance counters |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
877 |
size += dist2merge |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
878 |
mainsize -= dist2merge |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
879 |
jumphead = merge |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
880 |
refjumps = iter(getjumps(merge)) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
881 |
ref = next(refjumps, None) |
3329
c056f125e17d
stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3327
diff
changeset
|
882 |
elif ref is not None and mainjump[0:2] == ref[0:2]: |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
883 |
# both follow the same path |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
884 |
size += mainsize |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
885 |
jumphead = mainjump[1] |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
886 |
mainjump = next(jumps, None) |
3330
a67a586792dc
stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3329
diff
changeset
|
887 |
mainsize = mainjump[2] |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
888 |
ref = next(refjumps, None) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
889 |
if ref is None: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
890 |
# we are doing with section specific to the last merge |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
891 |
# reset `refjumps` to trigger the logic that search for the |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
892 |
# next merge |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
893 |
refjumps = None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
894 |
else: |
3327
0abc8fb7f49f
stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3324
diff
changeset
|
895 |
size += mainsize |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
896 |
if size < tomap: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
897 |
subrange = (rangehead, depth(rangehead) - size) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
898 |
assert subrange[1] < depth(subrange[0]) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
899 |
result.append(subrange) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
900 |
tomap -= size |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
901 |
size = 0 |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
902 |
jumphead = rangehead = mainjump[1] |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
903 |
mainjump = next(jumps, None) |
3330
a67a586792dc
stablerange: use cached size data instead of walking the graph
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3329
diff
changeset
|
904 |
mainsize = mainjump[2] |
3324
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
905 |
refjumps = None |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
906 |
|
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
907 |
if tomap: |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
908 |
subrange = (rangehead, depth(rangehead) - tomap) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
909 |
assert subrange[1] < depth(subrange[0]), (rangehead, depth(rangehead), tomap) |
6ba8eaffe8f6
stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3312
diff
changeset
|
910 |
result.append(subrange) |
3301
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
911 |
result.reverse() |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
912 |
return result |
5c45df0c8e36
stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3268
diff
changeset
|
913 |
|
3259
b63d03db0ab9
stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3258
diff
changeset
|
914 |
class stablerange(stablerangecached): |
2125
e0a25339ff17
stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
915 |
|
2504
d95006fe4dd0
stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2503
diff
changeset
|
916 |
def __init__(self, lrusize=2000): |
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
917 |
# 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
|
918 |
self._tiprev = None |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
919 |
self._tipnode = None |
2184
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
920 |
# 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
|
921 |
# 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
|
922 |
# 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
|
923 |
# 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
|
924 |
# value to reuse them accross the same invocation. |
2504
d95006fe4dd0
stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2503
diff
changeset
|
925 |
self._stablesortcache = util.lrucachedict(lrusize) |
2213
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
926 |
# 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
|
927 |
# mergerev -> stablesort, length |
2504
d95006fe4dd0
stablerange: use last recently used caching for revisions associated to ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2503
diff
changeset
|
928 |
self._stablesortprepared = util.lrucachedict(lrusize) |
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
929 |
# 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
|
930 |
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
|
931 |
# 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
|
932 |
# 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
|
933 |
# 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
|
934 |
# merge. |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
935 |
self._inheritancecache = {} |
3302
f890d27df766
stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3301
diff
changeset
|
936 |
super(stablerange, self).__init__() |
2184
3ec0be20e365
stablerange: add a cache for stablesort ordering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2183
diff
changeset
|
937 |
|
2233
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
938 |
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
|
939 |
"""warm the cache up""" |
2201
8d371329e8b9
stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2200
diff
changeset
|
940 |
repo = repo.unfiltered() |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
941 |
repo.depthcache.update(repo) |
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
942 |
cl = repo.changelog |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
943 |
# 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
|
944 |
# 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
|
945 |
# stablesort. |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
946 |
# |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
947 |
# 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
|
948 |
ui = repo.ui |
3685
bf000d1a525f
timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3658
diff
changeset
|
949 |
starttime = util.timer() |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
950 |
|
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
951 |
if upto is None: |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
952 |
upto = len(cl) - 1 |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
953 |
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
|
954 |
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
|
955 |
nbrevs = upto + 1 |
e922cd76804a
stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2232
diff
changeset
|
956 |
else: |
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
957 |
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
|
958 |
if upto <= self._tiprev: |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
959 |
return |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
960 |
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
|
961 |
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
|
962 |
rangeheap = [] |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
963 |
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
|
964 |
if not idx % 1000: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
965 |
compat.progress(ui, _(b"filling depth cache"), idx, total=nbrevs, |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
966 |
unit=_(b"changesets")) |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
967 |
# warm up depth |
2135
8f63f4b1c33e
stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2134
diff
changeset
|
968 |
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
|
969 |
rangeheap.append((-r, (r, 0))) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
970 |
compat.progress(ui, _(b"filling depth cache"), None, total=nbrevs) |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
971 |
|
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
972 |
heappop = heapq.heappop |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
973 |
heappush = heapq.heappush |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
974 |
heapify = heapq.heapify |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
975 |
|
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
976 |
original = set(rangeheap) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
977 |
seen = 0 |
2503
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
978 |
# progress report is showing up in the profile for small and fast |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
979 |
# repository so we build that complicated work around. |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
980 |
progress_each = 100 |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
981 |
progress_last = time.time() |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
982 |
heapify(rangeheap) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
983 |
while rangeheap: |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
984 |
value = heappop(rangeheap) |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
985 |
if value in original: |
2503
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
986 |
if not seen % progress_each: |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
987 |
# if a lot of time passed, report more often |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
988 |
progress_new = time.time() |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
989 |
if (1 < progress_each) and (0.1 < progress_new - progress_last): |
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
990 |
progress_each /= 10 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
991 |
compat.progress(ui, _(b"filling stablerange cache"), seen, |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
992 |
total=nbrevs, unit=_(b"changesets")) |
2503
cdf6a0e028c0
stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2424
diff
changeset
|
993 |
progress_last = progress_new |
2223
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
994 |
seen += 1 |
2ba541e1ea01
stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2222
diff
changeset
|
995 |
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
|
996 |
__, 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
|
997 |
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
|
998 |
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
|
999 |
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
|
1000 |
heappush(rangeheap, (-sub[0], sub)) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
1001 |
compat.progress(ui, _(b"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
|
1002 |
|
2235
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
1003 |
self._tiprev = upto |
eadb1c69e350
stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2234
diff
changeset
|
1004 |
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
|
1005 |
|
3685
bf000d1a525f
timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3658
diff
changeset
|
1006 |
duration = util.timer() - starttime |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4738
diff
changeset
|
1007 |
repo.ui.log(b'evoext-cache', b'updated stablerange cache in %.4f seconds\n', |
2381
07725f25296b
stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2368
diff
changeset
|
1008 |
duration) |
07725f25296b
stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2368
diff
changeset
|
1009 |
|
2182
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
1010 |
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
|
1011 |
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
|
1012 |
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
|
1013 |
return cached |
2204
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
1014 |
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
|
1015 |
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
|
1016 |
return value |
884f6309eae7
stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2181
diff
changeset
|
1017 |
|
2183
3c2992afee71
stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2182
diff
changeset
|
1018 |
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
|
1019 |
headrev, index = rangeid |
2211
ecb46c7ee281
minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2210
diff
changeset
|
1020 |
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
|
1021 |
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
|
1022 |
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
|
1023 |
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
|
1024 |
# 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
|
1025 |
# |
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
|
1026 |
# 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
|
1027 |
# 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
|
1028 |
# call for the general case. |
2529
537058b433ef
compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents:
2506
diff
changeset
|
1029 |
|
3145
ca6650879726
compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2551
diff
changeset
|
1030 |
allrevs = self._stablesortcache.get(headrev) |
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
|
1031 |
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
|
1032 |
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
|
1033 |
if allrevs is None: |
3243
556316fe4b4f
stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
1034 |
mc = self._filestablesortcache |
3245
63d58f7db120
stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3244
diff
changeset
|
1035 |
sorting = stablesort.stablesort_branchpoint |
63d58f7db120
stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3244
diff
changeset
|
1036 |
allrevs = sorting(repo, [headrev], mergecallback=mc) |
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
|
1037 |
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
|
1038 |
# 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
|
1039 |
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
|
1040 |
# sanity checks |
2211
ecb46c7ee281
minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2210
diff
changeset
|
1041 |
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
|
1042 |
return revs |
3c2992afee71
stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2182
diff
changeset
|
1043 |
|
2209
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1044 |
def _parents(self, rev, func): |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1045 |
parents = self._parentscache.get(rev) |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1046 |
if parents is None: |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1047 |
parents = func(rev) |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1048 |
self._parentscache[rev] = parents |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1049 |
return parents |
d25d39b88c7f
stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2208
diff
changeset
|
1050 |
|
2226
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
1051 |
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
|
1052 |
"""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
|
1053 |
|
83e6933ae00e
subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2225
diff
changeset
|
1054 |
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
|
1055 |
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
|
1056 |
|
2227
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
1057 |
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
|
1058 |
"""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
|
1059 |
|
4b621b56e3a1
subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2226
diff
changeset
|
1060 |
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
|
1061 |
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
|
1062 |
|
2213
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1063 |
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
|
1064 |
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
|
1065 |
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
|
1066 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1067 |
def _getrevsfrommerge(self, repo, merge): |
3145
ca6650879726
compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2551
diff
changeset
|
1068 |
prepared = self._stablesortprepared.get(merge) |
ca6650879726
compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2551
diff
changeset
|
1069 |
if prepared is None: |
2213
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1070 |
return None |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1071 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1072 |
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
|
1073 |
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
|
1074 |
nbextrarevs = prepared[1] - mergedepth |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1075 |
if not nbextrarevs: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1076 |
return allrevs |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1077 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1078 |
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
|
1079 |
top = [] |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1080 |
counter = nbextrarevs |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1081 |
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
|
1082 |
if rev in anc: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1083 |
top.append(rev) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1084 |
else: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1085 |
counter -= 1 |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1086 |
if counter <= 0: |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1087 |
break |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1088 |
|
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1089 |
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
|
1090 |
revs = allrevs[:bottomidx] |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1091 |
revs.extend(reversed(top)) |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1092 |
return revs |
fb2937b0dd49
revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2212
diff
changeset
|
1093 |
|
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1094 |
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
|
1095 |
"""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
|
1096 |
|
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1097 |
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
|
1098 |
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
|
1099 |
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
|
1100 |
|
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1101 |
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
|
1102 |
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
|
1103 |
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
|
1104 |
""" |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1105 |
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
|
1106 |
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
|
1107 |
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
|
1108 |
i = reversed(revs) |
4738
45508676ed00
py3: replace iter.next() by next(iter)
Martin von Zweigbergk <martinvonz@google.com>
parents:
4737
diff
changeset
|
1109 |
next(i) # pop the merge |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1110 |
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
|
1111 |
# 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
|
1112 |
# for everythin under the merge we investigate |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
1113 |
cache = repo.depthcache |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1114 |
# 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
|
1115 |
# 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
|
1116 |
# branching. |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1117 |
for rev in i: |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
1118 |
if cache.get(rev) == expected: |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1119 |
break |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1120 |
expected -= 1 |
2221
f61d091d318e
stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2220
diff
changeset
|
1121 |
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
|
1122 |
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
|
1123 |
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
|
1124 |
|
2204
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
1125 |
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
|
1126 |
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
|
1127 |
return [] |
61a8b51348a1
subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2201
diff
changeset
|
1128 |
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
|
1129 |
|
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
1130 |
# 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
|
1131 |
# 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
|
1132 |
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
|
1133 |
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
|
1134 |
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
|
1135 |
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
|
1136 |
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
|
1137 |
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
|
1138 |
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
|
1139 |
# 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
|
1140 |
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
|
1141 |
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
|
1142 |
|
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
1143 |
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
|
1144 |
"""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
|
1145 |
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
|
1146 |
|
bd5e2496e5cd
subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2204
diff
changeset
|
1147 |
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
|
1148 |
the parent rev s if possible and needed""" |
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1149 |
ps = filterparents(self._parents(rangeid[0], repo.changelog.parentrevs)) |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1150 |
if not ps: |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1151 |
return None |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1152 |
elif len(ps) == 1: |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1153 |
# regular changesets, we pick the parent |
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1154 |
reusablerev = ps[0] |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1155 |
else: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1156 |
# 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
|
1157 |
# 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
|
1158 |
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
|
1159 |
|
2219
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
1160 |
# 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
|
1161 |
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
|
1162 |
return None |
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
1163 |
|
d83bf4773433
stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2218
diff
changeset
|
1164 |
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
|
1165 |
# 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
|
1166 |
# 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
|
1167 |
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
|
1168 |
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
|
1169 |
|
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
|
1170 |
# 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
|
1171 |
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
|
1172 |
|
2131
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
1173 |
def _slicesrangeat(self, repo, rangeid, globalindex): |
3312
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1174 |
ps = self._parents(rangeid[0], repo.changelog.parentrevs) |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1175 |
if len(ps) == 1: |
8e9ea8307cdd
stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3307
diff
changeset
|
1176 |
reuserev = ps[0] |
2220
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1177 |
else: |
0b6745b91d6d
merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2219
diff
changeset
|
1178 |
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
|
1179 |
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
|
1180 |
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
|
1181 |
|
2218
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
1182 |
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
|
1183 |
|
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
1184 |
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
|
1185 |
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
|
1186 |
|
2218
9e30934d4487
stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2217
diff
changeset
|
1187 |
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
|
1188 |
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
|
1189 |
# 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
|
1190 |
# 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
|
1191 |
# 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
|
1192 |
# 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
|
1193 |
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
|
1194 |
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
|
1195 |
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
|
1196 |
return slices |
2136
086a85c37e9e
stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2135
diff
changeset
|
1197 |
|
2169
03baabcd1b9e
stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2168
diff
changeset
|
1198 |
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
|
1199 |
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
|
1200 |
|
86dd39478638
stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2130
diff
changeset
|
1201 |
result = [] |
2190
f4cc3cf27a3a
revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2189
diff
changeset
|
1202 |
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
|
1203 |
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
|
1204 |
|
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
1205 |
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
|
1206 |
# 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
|
1207 |
# 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
|
1208 |
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
|
1209 |
else: |
3253
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1210 |
head = None |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1211 |
headrange = None |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1212 |
skip = None |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1213 |
for rev in bottomrevs[::-1]: |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1214 |
if head is None: |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1215 |
head = rev |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1216 |
headrange = self.revsfromrange(repo, (head, 0)) |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1217 |
skip = self.depthrev(repo, rev) - 1 |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1218 |
elif rev != headrange[skip - 1]: |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1219 |
result.append((head, skip)) |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1220 |
head = rev |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1221 |
headrange = self.revsfromrange(repo, (head, 0)) |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1222 |
skip = self.depthrev(repo, rev) - 1 |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1223 |
else: |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1224 |
skip -= 1 |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1225 |
result.append((head, skip)) |
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1226 |
|
8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3252
diff
changeset
|
1227 |
result.reverse() |
2217
37fa3d83f294
merge-slicing: explain an alternative implementation in a comments
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2216
diff
changeset
|
1228 |
|
2215
6d9cadc635d5
merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2214
diff
changeset
|
1229 |
# 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
|
1230 |
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
|
1231 |
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
|
1232 |
return result |
3952
a7794f5abacd
discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3916
diff
changeset
|
1233 |
|
a7794f5abacd
discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3916
diff
changeset
|
1234 |
# merge later for outer layer wrapping |
a7794f5abacd
discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3916
diff
changeset
|
1235 |
eh.merge(stablesort.eh) |
a7794f5abacd
discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3916
diff
changeset
|
1236 |
eh.merge(firstmergecache.eh) |