hgext3rd/evolve/stablerange.py
author Anton Shestakov <av6@dwimlabs.net>
Fri, 08 May 2020 22:50:09 +0800
branchmercurial-4.6
changeset 5368 844b1ad5b34b
parent 4856 894f58f5b59b
permissions -rw-r--r--
test-compat: merge mercurial-4.7 into mercurial-4.6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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.
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4838
diff changeset
     9
r"""stable range
4836
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
4855
7188ed142481 stable-doc: small typo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4854
diff changeset
   202
Subrange information can be efficiently stored, a naive approach storing all
4836
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
4856
894f58f5b59b stable-doc: note about not storing smaller range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4855
diff changeset
   215
It is also important to note that the smaller ranges can probably be computed
894f58f5b59b stable-doc: note about not storing smaller range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4855
diff changeset
   216
on the fly instead of being cached. The exact tradeoff would requires some
894f58f5b59b stable-doc: note about not storing smaller range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4855
diff changeset
   217
field testing.
894f58f5b59b stable-doc: note about not storing smaller range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4855
diff changeset
   218
4836
e2465969958e stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   219
Performance
e2465969958e stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   220
-----------
e2465969958e stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   221
e2465969958e stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   222
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
   223
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
   224
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
   225
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
   226
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
   227
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
   228
e2465969958e stablerange: add some documentation about the general concept
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   229
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
   230
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
   231
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
   232
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
   233
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   234
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
   235
* obsolescence markers discovery,
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   236
* 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
   237
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   238
practical data
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   239
--------------
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   240
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   241
The evolve repository:
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   242
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   243
    number of revisions:          4833
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   244
    number of heads:                15
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   245
    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
   246
    number of range:              4826
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   247
      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
   248
      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
   249
      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
   250
      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
   251
      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
   252
    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
   253
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   254
    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
   255
           41 056 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   256
    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
   257
        5 312 512 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   258
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   259
The mercurial repository:
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   260
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   261
    number of revisions:         42849
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   262
    number of heads:                 2
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   263
    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
   264
    number of range:             41279
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   265
      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
   266
      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
   267
      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
   268
      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
   269
      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
   270
    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
   271
    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
   272
           342 968 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   273
    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
   274
        62 803 968 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   275
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   276
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
   277
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   278
    number of revisions:         97409
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   279
    number of heads:               183
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   280
    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
   281
    number of range:            107025
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   282
      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
   283
      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
   284
      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
   285
      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
   286
      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
   287
      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
   288
      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
   289
      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
   290
      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
   291
      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
   292
      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
   293
      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
   294
      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
   295
      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
   296
      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
   297
      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
   298
      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
   299
      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
   300
      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
   301
      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
   302
      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
   303
      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
   304
      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
   305
      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
   306
      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
   307
      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
   308
      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
   309
      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
   310
      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
   311
      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
   312
      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
   313
      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
   314
      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
   315
      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
   316
      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
   317
    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
   318
    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
   319
          934 176 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   320
    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
   321
      201 236 480 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   322
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   323
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
   324
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   325
    number of revisions:        605011
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   326
    number of heads:             14061
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   327
    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
   328
    number of range:            747625
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   329
      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
   330
      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
   331
      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
   332
      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
   333
      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
   334
      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
   335
      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
   336
      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
   337
      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
   338
      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
   339
      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
   340
      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
   341
      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
   342
      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
   343
      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
   344
      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
   345
      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
   346
      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
   347
      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
   348
      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
   349
    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
   350
    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
   351
        7 501 928 bytes
bc0ea7666d4d stablerange: add some data from field testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4836
diff changeset
   352
    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
   353
    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
   354
"""
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   355
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   356
import abc
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   357
import functools
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   358
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
   359
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
   360
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
   361
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   362
from mercurial import (
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   363
    error,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   364
    node as nodemod,
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   365
    scmutil,
2237
98e0369b548b stablerange: introduce ondisk caching through sqlite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2236
diff changeset
   366
    util,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   367
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   368
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   369
from mercurial.i18n import _
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   370
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   371
from . import (
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4146
diff changeset
   372
    compat,
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3331
diff changeset
   373
    exthelper,
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3331
diff changeset
   374
    firstmergecache,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
   375
    stablesort,
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   376
    utility,
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   377
)
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   378
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   379
filterparents = utility.filterparents
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   380
2125
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   381
eh = exthelper.exthelper()
e0a25339ff17 stablerange: move 'depth' inside a new 'stablerange' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   382
2129
d07bb7cbae2f stablesort: move into the stablerange module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2128
diff changeset
   383
2130
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   384
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   385
### 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
   386
#################################
d784622dd5dc stablerange: move the range class in the new module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2129
diff changeset
   387
2198
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
   388
def _hlp2(i):
ab392bd1c518 stablerange: move a utility function around
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2197
diff changeset
   389
    """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
   390
    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
   391
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   392
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
   393
    """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
   394
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
   395
    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
   396
    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
   397
    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
   398
    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
   399
    ranges = set(toproceed)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
   400
    while toproceed:
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
   401
        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
   402
        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
   403
            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
   404
                ranges.add(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
   405
                toproceed.append(r)
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
   406
    ranges = list(ranges)
2142
7dc66a526b21 stablerange: stop using '.node' in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2141
diff changeset
   407
    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
   408
    rangelength = stablerange.rangelength
2167
d37f0423c072 stablerange: use rangelength in subrangesclosure
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2163
diff changeset
   409
    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
   410
    return ranges
dd8ed58bf79c stablerange: move the subrangesclosure inside the module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2136
diff changeset
   411
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   412
_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
   413
    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
   414
    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
   415
    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
   416
    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
   417
    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
   418
}
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   419
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   420
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4341
diff changeset
   421
    b'debugstablerange',
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   422
    [
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4341
diff changeset
   423
        (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
   424
        (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
   425
        (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
   426
        (b'', b'method', b'branchpoint',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4341
diff changeset
   427
         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
   428
    ],
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4341
diff changeset
   429
    _(b''))
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   430
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
   431
    """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
   432
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   433
    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
   434
    --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
   435
    """
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   436
    short = nodemod.short
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   437
    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
   438
    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
   439
        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
   440
    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
   441
        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
   442
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   443
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   444
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   445
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   446
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   447
                rangeid[0],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   448
                depth(unfi, rangeid[0]),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   449
                length(unfi, rangeid)
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   450
            )
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   451
    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
   452
        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
   453
2231
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   454
        def _rangestring(repo, rangeid):
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   455
            return template % (
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   456
                short(node(rangeid[0])),
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   457
                rangeid[1],
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   458
            )
3248
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   459
    # 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
   460
    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
   461
    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
   462
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   463
    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
   464
    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
   465
    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
   466
        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
   467
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 = 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
   469
    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
   470
    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
   471
    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
   472
    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
   473
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   474
    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
   475
        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
   476
    else:
07c9b6f445bf stablerange: rework the debug command to allow for multiple method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   477
        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
   478
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   479
    for r in ranges:
f872738bb5b3 stablerange: add a proper debugstablerange commands
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2227
diff changeset
   480
        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
   481
        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
   482
        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
   483
        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
   484
            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
   485
            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
   486
                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
   487
                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
   488
                subrevs = set()
6b95bcc402fe debugstablerange: add a --verify flag to the command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2231
diff changeset
   489
                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
   490
                    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
   491
                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
   492
                    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
   493
            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
   494
        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
   495
            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
   496
3250
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   497
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
   498
    """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
   499
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   500
    __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
   501
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   502
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   503
    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
   504
        """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
   505
        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
   506
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   507
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   508
    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
   509
        """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
   510
        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
   511
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   512
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   513
    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
   514
        """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
   515
        # 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
   516
        # 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
   517
        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
   518
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   519
    @abc.abstractmethod
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   520
    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
   521
        """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
   522
        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
   523
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   524
    @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
   525
    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
   526
        """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
   527
        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
   528
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   529
    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
   530
        """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
   531
        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
   532
        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
   533
        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
   534
        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
   535
            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
   536
                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
   537
            step //= 2
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   538
        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
   539
            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
   540
            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
   541
        else:
8eaf30e1019f stablerange: extract the core API into a 'stablerangecore' class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3248
diff changeset
   542
            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
   543
            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
   544
        return slicepoint
3251
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   545
class stablerangebasic(abstractstablerange):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   546
    """a very dummy implementation of stablerange
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
    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
   549
    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
   550
    to validate output."""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   551
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   552
    __metaclass__ = abc.ABCMeta
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   553
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   554
    def _sortfunction(self, repo, headrev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   555
        return stablesort.stablesort_branchpoint(repo, [headrev])
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 warmup(self, repo, upto=None):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   558
        # no cache to warm for basic implementation
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   559
        pass
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 depthrev(self, repo, rev):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   562
        """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
   563
        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
   564
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   565
    def revsfromrange(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   566
        """return revision contained in a range
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   567
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   568
        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
   569
        <head>, skipping the <index>th lower revisions.
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
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   572
        revs = self._sortfunction(repo, headrev)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   573
        return revs[index:]
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 rangelength(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   576
        """number of revision in <range>"""
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   577
        return len(self.revsfromrange(repo, rangeid))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   578
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   579
    def subranges(self, repo, rangeid):
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   580
        """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
   581
        headrev, index = rangeid[0], rangeid[1]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   582
        if self.rangelength(repo, rangeid) == 1:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   583
            return []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   584
        slicepoint = self._slicepoint(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   585
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   586
        # 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
   587
        #
3252
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   588
        # 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
   589
        # current "head" of the lower range.
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   590
        #
d57400a0f4c3 stablebranch: avoid overlap between subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3251
diff changeset
   591
        # 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
   592
        # 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
   593
        result = []
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   594
        lowerrevs = self.revsfromrange(repo, rangeid)[:(slicepoint - index)]
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   595
        head = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   596
        headrange = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   597
        skip = None
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   598
        for rev in lowerrevs[::-1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   599
            if head is None:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   600
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   601
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   602
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   603
            elif rev != headrange[skip - 1]:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   604
                result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   605
                head = rev
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   606
                headrange = self.revsfromrange(repo, (head, 0))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   607
                skip = self.depthrev(repo, rev) - 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   608
            else:
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   609
                skip -= 1
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   610
        result.append((head, skip))
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   611
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   612
        result.reverse()
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
        # top part is trivial
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   615
        top = (headrev, slicepoint)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   616
        result.append(top)
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
        # double check the result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   619
        initialrevs = self.revsfromrange(repo, rangeid)
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   620
        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
   621
                           [])
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   622
        assert initialrevs == subrangerevs
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   623
        return result
0e4a05907c5e stablerange: introduce an 'basicstablerange'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3250
diff changeset
   624
3258
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   625
class stablerangedummy_mergepoint(stablerangebasic):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   626
    """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
   627
    """
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   628
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   629
    def _sortfunction(self, repo, headrev):
af1f8f0687e1 stablerange: introduce a basic-mergepoint method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3253
diff changeset
   630
        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
   631
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   632
class stablerangecached(abstractstablerange):
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   633
    """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
   634
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   635
    __metaclass__ = abc.ABCMeta
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   636
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   637
    def __init__(self):
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   638
        # 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
   639
        self._subrangescache = {}
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   640
        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
   641
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   642
    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
   643
        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
   644
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   645
    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
   646
        """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
   647
        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
   648
        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
   649
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   650
    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
   651
        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
   652
        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
   653
        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
   654
            return cached
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   655
        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
   656
        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
   657
        return value
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   658
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   659
    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
   660
        """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
   661
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   662
        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
   663
        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
   664
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   665
    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
   666
        """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
   667
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   668
        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
   669
        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
   670
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   671
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
   672
    """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
   673
    """
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   674
3264
383ec26247b3 stablerange: use the new cache object in the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   675
    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
   676
        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
   677
3303
318c938be80d stablerange: drop the basic inheritance from the 'mergepoint' version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3302
diff changeset
   678
    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
   679
        # 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
   680
        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
   681
3261
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   682
    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
   683
        """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
   684
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   685
        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
   686
        <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
   687
        """
85160bd3f641 stablerange: make use of the limit argument in 'mergepoint'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3260
diff changeset
   688
        limit = self.rangelength(repo, rangeid)
3339
f0933cdf614d stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3333
diff changeset
   689
        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
   690
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   691
    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
   692
        """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
   693
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   694
        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
   695
        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
   696
        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
   697
        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
   698
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   699
            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
   700
                          + 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
   701
                          + [REV]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   702
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   703
        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
   704
        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
   705
        """
3312
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   706
        ps = filterparents(repo.changelog.parentrevs(headrev))
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   707
        if not ps:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   708
            return nodemod.nullrev
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   709
        elif len(ps) == 1:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
   710
            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
   711
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   712
            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
   713
            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
   714
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   715
    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
   716
        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
   717
        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
   718
        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
   719
        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
   720
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   721
    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
   722
        """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
   723
        stack = []
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   724
        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
   725
        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
   726
            stack.append(current)
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   727
            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
   728
        while stack:
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   729
            current = stack.pop()
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   730
            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
   731
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   732
    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
   733
        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
   734
        # 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
   735
        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
   736
            return []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   737
        # 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
   738
        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
   739
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   740
        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
   741
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   742
        return ret
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   743
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   744
    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
   745
        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
   746
        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
   747
3304
d942fc5847f9 stablesort: move parent range computation into its own method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3303
diff changeset
   748
        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
   749
        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
   750
3305
a878d9406841 stablerange: warn cache for all relevant ancestors range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3304
diff changeset
   751
        # 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
   752
        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
   753
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   754
        # 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
   755
        # 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
   756
        # 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
   757
        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
   758
            # 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
   759
            subranges = [
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   760
                stable_parent_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   761
                top_range,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   762
            ]
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   763
        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
   764
            # 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
   765
            # 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
   766
            # (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
   767
            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
   768
            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
   769
            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
   770
            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
   771
            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
   772
                # 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
   773
                # 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
   774
                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
   775
                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
   776
            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
   777
                # 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
   778
                # 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
   779
                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
   780
                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
   781
            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
   782
        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
   783
            # 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
   784
            # 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
   785
            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
   786
            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
   787
                                                    stable_parent_depth,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   788
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   789
            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
   790
        else:
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   791
            # 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
   792
            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
   793
                                                    initial_index,
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   794
                                                    slicepoint))
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   795
            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
   796
4137
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   797
        ### 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
   798
        # toprevs = self.revsfromrange(repo, rangeid)
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   799
        # subrevs = []
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   800
        # for s in subranges:
21a3c051ca6c stablerange: fix slicing of arbitrary ranges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4130
diff changeset
   801
        #     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
   802
        # 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
   803
3301
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   804
        return subranges
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   805
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   806
    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
   807
        """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
   808
        result = []
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   809
        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
   810
        nextmerge = repo.firstmergecache.get
3339
f0933cdf614d stablerange: use repo-carried stablesortcache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3333
diff changeset
   811
        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
   812
        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
   813
        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
   814
        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
   815
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   816
        jumps = getjumps(headrev)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   817
        # 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
   818
        # 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
   819
        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
   820
        jumps = iter(jumps)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   821
        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
   822
        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
   823
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   824
        # 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
   825
        # (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
   826
        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
   827
            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
   828
            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
   829
            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
   830
                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
   831
            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
   832
                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
   833
            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
   834
            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
   835
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   836
        # 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
   837
        mainjump = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   838
        jumpdest = headrev
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   839
        while 0 < skips:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   840
            jumphead = jumpdest
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   841
            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
   842
            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
   843
            jumpdest = currentjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   844
            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
   845
                jumphead = jumpdest
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   846
                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
   847
                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
   848
            elif skips < size:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   849
                revs = walkfrom(jumphead)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   850
                next(revs)
4737
46c990705a96 py3: replace xrange() by range()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   851
                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
   852
                    jumphead = next(revs)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   853
                    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
   854
                skipped = skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   855
                size -= skips
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   856
                mainjump = currentjump
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   857
                mainsize = size
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   858
            skips -= skipped
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   859
        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
   860
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   861
        # 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
   862
        # 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
   863
        # 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
   864
        # 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
   865
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   866
        # 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
   867
        # 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
   868
        # 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
   869
        rangehead = jumphead
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   870
        refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   871
        size = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   872
        while size < tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   873
            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
   874
            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
   875
                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
   876
                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
   877
                    refjumps = iter(())
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   878
                    ref = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   879
                else:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   880
                    # advance counters
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   881
                    size += dist2merge
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   882
                    mainsize -= dist2merge
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   883
                    jumphead = merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   884
                    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
   885
                    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
   886
            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
   887
                # 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
   888
                size += mainsize
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   889
                jumphead = mainjump[1]
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   890
                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
   891
                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
   892
                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
   893
                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
   894
                    # 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
   895
                    # 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
   896
                    # next merge
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   897
                    refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   898
            else:
3327
0abc8fb7f49f stablerange: compute jump size after jump retrieval only
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3324
diff changeset
   899
                size += mainsize
3324
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   900
                if size < tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   901
                    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
   902
                    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
   903
                    result.append(subrange)
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   904
                    tomap -= size
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   905
                    size = 0
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   906
                    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
   907
                    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
   908
                    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
   909
                    refjumps = None
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   910
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   911
        if tomap:
6ba8eaffe8f6 stablerange: use the jump information for faster iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3312
diff changeset
   912
            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
   913
            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
   914
            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
   915
        result.reverse()
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   916
        return result
5c45df0c8e36 stablerange: use sort cache to build 'mergepoint' information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3268
diff changeset
   917
3259
b63d03db0ab9 stablerange: introduce an intermediary abstract class for caching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3258
diff changeset
   918
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
   919
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
   920
    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
   921
        # 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
   922
        self._tiprev = None
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   923
        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
   924
        # 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
   925
        # 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
   926
        # 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
   927
        # 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
   928
        # 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
   929
        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
   930
        # 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
   931
        # 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
   932
        self._stablesortprepared = util.lrucachedict(lrusize)
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
   933
        # 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
   934
        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
   935
        # 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
   936
        # 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
   937
        # 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
   938
        # merge.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
   939
        self._inheritancecache = {}
3302
f890d27df766 stablerange: cache known subrange at the stablerangecached level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3301
diff changeset
   940
        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
   941
2233
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   942
    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
   943
        """warm the cache up"""
2201
8d371329e8b9 stablecache: warmup on unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2200
diff changeset
   944
        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
   945
        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
   946
        cl = repo.changelog
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   947
        # 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
   948
        # 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
   949
        # stablesort.
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   950
        #
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   951
        # 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
   952
        ui = repo.ui
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3658
diff changeset
   953
        starttime = util.timer()
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   954
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   955
        if upto is None:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   956
            upto = len(cl) - 1
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   957
        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
   958
            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
   959
            nbrevs = upto + 1
e922cd76804a stablerange: warmup all upto a revision
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2232
diff changeset
   960
        else:
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   961
            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
   962
            if upto <= self._tiprev:
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   963
                return
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
   964
            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
   965
            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
   966
        rangeheap = []
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   967
        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
   968
            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
   969
                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
   970
                                unit=_(b"changesets"))
2223
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   971
            # warm up depth
2135
8f63f4b1c33e stablerange: add an official warmup function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2134
diff changeset
   972
            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
   973
            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
   974
        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
   975
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   976
        heappop = heapq.heappop
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   977
        heappush = heapq.heappush
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   978
        heapify = heapq.heapify
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   979
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   980
        original = set(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   981
        seen = 0
2503
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   982
        # 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
   983
        # 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
   984
        progress_each = 100
cdf6a0e028c0 stablerange: report progress more often in slow case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2424
diff changeset
   985
        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
   986
        heapify(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   987
        while rangeheap:
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   988
            value = heappop(rangeheap)
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   989
            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
   990
                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
   991
                    # 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
   992
                    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
   993
                    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
   994
                        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
   995
                    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
   996
                                    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
   997
                    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
   998
                seen += 1
2ba541e1ea01 stablerange: add warming of the subrange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2222
diff changeset
   999
                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
  1000
            __, 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
  1001
            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
  1002
                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
  1003
                    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
  1004
                        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
  1005
        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
  1006
2235
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
  1007
        self._tiprev = upto
eadb1c69e350 stablerange: support loading the cache iteratively
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2234
diff changeset
  1008
        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
  1009
3685
bf000d1a525f timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3658
diff changeset
  1010
        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
  1011
        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
  1012
                    duration)
07725f25296b stablerange: log time spent updating the stable range
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2368
diff changeset
  1013
2182
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
  1014
    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
  1015
        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
  1016
        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
  1017
            return cached
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
  1018
        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
  1019
        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
  1020
        return value
884f6309eae7 stablerange: minor method reorders on the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2181
diff changeset
  1021
2183
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
  1022
    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
  1023
        headrev, index = rangeid
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
  1024
        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
  1025
        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
  1026
            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
  1027
        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
  1028
            # 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
  1029
            #
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
  1030
            # 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
  1031
            # 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
  1032
            # call for the general case.
2529
537058b433ef compat: fix stablerange for mercurial 3.9
Boris Feld <boris.feld@octobus.net>
parents: 2506
diff changeset
  1033
3145
ca6650879726 compat: drop 'lru.get' work-around for 3.9
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2551
diff changeset
  1034
            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
  1035
            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
  1036
                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
  1037
                if allrevs is None:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
  1038
                    mc = self._filestablesortcache
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
  1039
                    sorting = stablesort.stablesort_branchpoint
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3244
diff changeset
  1040
                    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
  1041
                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
  1042
            # 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
  1043
            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
  1044
        # sanity checks
2211
ecb46c7ee281 minor simplification around rangelength
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2210
diff changeset
  1045
        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
  1046
        return revs
3c2992afee71 stablerange: move revs computation within the main class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2182
diff changeset
  1047
2209
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1048
    def _parents(self, rev, func):
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1049
        parents = self._parentscache.get(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1050
        if parents is None:
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1051
            parents = func(rev)
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1052
            self._parentscache[rev] = parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1053
        return parents
d25d39b88c7f stablerange: cache parents
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2208
diff changeset
  1054
2226
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
  1055
    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
  1056
        """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
  1057
83e6933ae00e subranges: add a utility function to access the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2225
diff changeset
  1058
        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
  1059
        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
  1060
2227
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
  1061
    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
  1062
        """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
  1063
4b621b56e3a1 subranges: add a utility function to set the cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2226
diff changeset
  1064
        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
  1065
        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
  1066
2213
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1067
    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
  1068
        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
  1069
            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
  1070
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1071
    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
  1072
        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
  1073
        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
  1074
            return None
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1075
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1076
        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
  1077
        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
  1078
        nbextrarevs = prepared[1] - mergedepth
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1079
        if not nbextrarevs:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1080
            return allrevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1081
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1082
        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
  1083
        top = []
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1084
        counter = nbextrarevs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1085
        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
  1086
            if rev in anc:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1087
                top.append(rev)
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1088
            else:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1089
                counter -= 1
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1090
                if counter <= 0:
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1091
                    break
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1092
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1093
        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
  1094
        revs = allrevs[:bottomidx]
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1095
        revs.extend(reversed(top))
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1096
        return revs
fb2937b0dd49 revsfromrange: reuse information from the stablesort
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2212
diff changeset
  1097
2220
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
  1098
    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
  1099
        """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
  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
        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
  1102
        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
  1103
        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
  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
        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
  1106
        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
  1107
        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
  1108
        """
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
  1109
        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
  1110
        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
  1111
            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
  1112
            i = reversed(revs)
4738
45508676ed00 py3: replace iter.next() by next(iter)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4737
diff changeset
  1113
            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
  1114
            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
  1115
            # 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
  1116
            # 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
  1117
            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
  1118
            # 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
  1119
            # 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
  1120
            # branching.
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
  1121
            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
  1122
                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
  1123
                    break
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
  1124
                expected -= 1
2221
f61d091d318e stablerange: small style fix
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2220
diff changeset
  1125
            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
  1126
            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
  1127
        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
  1128
2204
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
  1129
    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
  1130
        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
  1131
            return []
61a8b51348a1 subranges: detach cache logic from computation logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2201
diff changeset
  1132
        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
  1133
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
        # 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
  1135
        # 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
  1136
        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
  1137
        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
  1138
        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
  1139
            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
  1140
            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
  1141
                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
  1142
        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
  1143
            # 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
  1144
            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
  1145
        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
  1146
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
  1147
    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
  1148
        """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
  1149
        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
  1150
bd5e2496e5cd subranges: remove the recursivity of the call to isubranges(parentrange)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2204
diff changeset
  1151
        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
  1152
        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
  1153
        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
  1154
        if not ps:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
  1155
            return None
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
  1156
        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
  1157
            # 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
  1158
            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
  1159
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
  1160
            # 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
  1161
            # 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
  1162
            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
  1163
2219
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
  1164
        # 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
  1165
        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
  1166
            return None
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
  1167
d83bf4773433 stablerange: rearrange the code picking subrange to warm
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2218
diff changeset
  1168
        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
  1169
        # 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
  1170
        # 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
  1171
        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
  1172
            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
  1173
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
  1174
        # 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
  1175
        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
  1176
2131
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
  1177
    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
  1178
        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
  1179
        if len(ps) == 1:
8e9ea8307cdd stablerange: use the filterparents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3307
diff changeset
  1180
            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
  1181
        else:
0b6745b91d6d merge-slicing: introduce and use "inheritance point" for merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2219
diff changeset
  1182
            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
  1183
            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
  1184
                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
  1185
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
  1186
        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
  1187
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
  1188
        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
  1189
        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
  1190
2218
9e30934d4487 stablerange: rearrange the reusing logic to prepare to merge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2217
diff changeset
  1191
        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
  1192
            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
  1193
        # 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
  1194
        # 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
  1195
        # 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
  1196
        # 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
  1197
        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
  1198
        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
  1199
        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
  1200
        return slices
2136
086a85c37e9e stablerange: compute subranges from parent when possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2135
diff changeset
  1201
2169
03baabcd1b9e stablerange: use rangelength in '_slicesatrange'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2168
diff changeset
  1202
    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
  1203
        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
  1204
86dd39478638 stablerange: move the slicing method on the central class
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2130
diff changeset
  1205
        result = []
2190
f4cc3cf27a3a revsfromrange: remove reference to '_revs' in merge slicing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2189
diff changeset
  1206
        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
  1207
        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
  1208
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
  1209
        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
  1210
            # 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
  1211
            # 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
  1212
            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
  1213
        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
  1214
            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
  1215
            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
  1216
            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
  1217
            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
  1218
                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
  1219
                    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
  1220
                    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
  1221
                    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
  1222
                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
  1223
                    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
  1224
                    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
  1225
                    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
  1226
                    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
  1227
                else:
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
  1228
                    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
  1229
            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
  1230
8dcb9e929a57 stablerange: fallback to a more naive approach to find subrange
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3252
diff changeset
  1231
            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
  1232
2215
6d9cadc635d5 merge-slicing: simplify various aspect of the code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2214
diff changeset
  1233
        # 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
  1234
        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
  1235
        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
  1236
        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
  1237
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3916
diff changeset
  1238
# 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
  1239
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
  1240
eh.merge(firstmergecache.eh)