hgext3rd/evolve/stablerange.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 30 Apr 2020 10:05:14 -0700
changeset 5341 13376ca93fa3
parent 4856 894f58f5b59b
permissions -rw-r--r--
evolve: always create commit when resolving divergence When resolving content-divergence, the final commit we create may end up empty (which means that Mercurial won't even create it). We've had code for handling that in evolve ever since 41bf6c27a122 (evolve: stabilize now handle conflicting changeset, 2012-08-23). However, that resolved the issue by marking on the divergent commits as successor. As Pierre-Yves has pointed out (in other code reviews), we should instead be creating a new successor. So that's what this patch does. It does that by setting `ui.allowemptycommit` while creating the final commit. However, that is not enough, because we may end up creating the same nodeid as already existed (we'd then end up trying to mark the "new" commit a successor of itself). To solve that, we add some salt to the commit extras. That salt affects lots of tests.
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)