hgext3rd/evolve/stablesort.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Fri, 27 Sep 2019 06:55:05 +0200
changeset 4857 86cdc5efd769
parent 4854 79c9bc7663c2
child 5137 4fef6b157175
permissions -rw-r--r--
branching: merge with stable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
# Code dedicated to the computation of stable sorting
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
#
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
# These stable sorting are used stable ranges
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
#
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
#
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
4853
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    10
r"""Stable sorting for the mercurial graph
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    11
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    12
The goal is to provided an efficient, revnum independant way, to sort revisions
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    13
in a topologicaly. Having it independant from revnum is important to make it
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    14
stable from one repository to another, unlocking various capabilities. For
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    15
example it can be used for discovery purposes.
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    16
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    17
This docstring describe the currently preferred solution:
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    18
4853
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    19
Probleme definition
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    20
-------------------
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    21
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    22
We want a way to order revision in the graph. For a linear history things are simple::
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    23
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    24
  A -> B -> C -> D -> E -> F -> G -> H
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    25
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    26
  stablesort(::H) = [A, B, C, D, E, F, G, H]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    27
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    28
However, things become more complicated when the graph is not linear::
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    29
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    30
  A -> B -> C -> D -> G -> H
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    31
         \         /
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    32
          > E -> F
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    33
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    34
  stablesort(::A) = [A]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    35
  stablesort(::B) = [A, B]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    36
  stablesort(::C) = [A, B, C]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    37
  stablesort(::D) = [A, B, C, D]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    38
  stablesort(::E) = [A, B, E]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    39
  stablesort(::F) = [A, B, E, F]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    40
  stablesort(::G) = [A, B, C, D, E, F, G]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    41
  stablesort(::H) = [A, B, C, D, E, F, G, H]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    42
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    43
Basic principle:
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    44
----------------
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    45
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    46
We are always talking about set of revision defined by a single heads
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    47
(eg: `stablesort(::r)`)
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    48
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    49
For non merge revisions, the definition is simple::
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    50
4853
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    51
  stablesort(::r) == stablesort(p1(r)) + r
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    52
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    53
This is visible in some of the example above:
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    54
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    55
  stablesort(::B) = stablesort(::A) + [B]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    56
  stablesort(::E) = stablesort(::B) + [E]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    57
  stablesort(::H) = stablesort(::G) + [H]
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    58
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    59
For merge revision, we reuse as much as possible of the parents order:
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    60
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    61
    pl = stablemin(parents(m))
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    62
    ph = stablemax(parents(m))
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    63
    stablesort(::m) == stablesort(pl)
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    64
                       + [i for in in stablesort(ph) if in ph % pl]
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    65
                       + m
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    66
4853
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    67
This is visible in the example above:
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    68
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    69
    stablesort(::G) = stablesort(::D) + [stablesort(::F) - ::D] + [G]
4853
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    70
    stablesort(::G) = [A, B, C, D] + ([A, B, E, F] - [A, B, C ,D]) + [G]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    71
    stablesort(::G) = [A, B, C, D] + [E, F] + [G]
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    72
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    73
To decide which parent goes first in the stablesort, we need to order them. The
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    74
`stablemin/stablemax` function express this. The actual order used is an
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    75
implementation details (eg: could be node-order, in the example it is
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    76
alphabetical order)
4853
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    77
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    78
The `ph % pl` set of revision is called the "exclusive part". It correspond to
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    79
all revisions ancestors of `ph` (`ph` included) that are not ancestors of `pl`
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    80
(`pl` included).  In this area we try to reuse as much as the stable-sorted
004704c5834f stable-doc: add multiples example for the simple cases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4835
diff changeset
    81
order for `ph`. In simple case, the `[i for i in stablesort(ph) if i in ph %
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    82
pl]` is just the contiguous final range of `stablesort(ph)`. This is the case
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    83
in the example we have looked at so far::
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    84
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    85
    stablesort(::F) - ::D = [A, B, E, F] - [A, B, C ,D] = stablesort(::F)[-2:]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    86
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    87
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    88
However in more advance case, this will not be contiguous and we'll need to
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    89
skip over multiple parts of `stablesort(ph)` to cover `ph % pl`.Let's have a
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    90
look at an example of such case::
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    91
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    92
  A - B ----- F - H
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    93
   \    \   /   /
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    94
    \     E - G
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    95
     \  /   /
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    96
      C - D
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    97
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
    98
We have the following stablesort:
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
    99
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   100
  stablesort(::A) = [A]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   101
  stablesort(::B) = [A, B]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   102
  stablesort(::C) = [A, C]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   103
  stablesort(::D) = [A, C, D]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   104
  stablesort(::E) = [A, B, C, E]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   105
  stablesort(::F) = [A, B, C, E, F]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   106
  stablesort(::G) = [A, B, C, D, E, G]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   107
  stablesort(::H) = [A, B, C, E, F, D, G, H]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   108
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   109
The stable order of `stablesort(::H)` match our definition::
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   110
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   111
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   112
  stablesort(::H) = [A, B, C, E, F] + [D, G] + [H]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   113
  stablesort(::F) = [A, B, C, E, F]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   114
  stablesort(::G) - ::F = [A, B, C, D, E, G] - [A, B, C, E, F] = [D, G]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   115
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   116
In this order, we reuse all of `stablesort(::H)`, but the subset of
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   117
`stablesort(::G)` we reuse is not contiguous, we had to skip over 'E' that is
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   118
already contained inside ::F.
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   119
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   120
Usage
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   121
-----
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   122
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   123
An important details is that, in practice, the sorted revision are always
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   124
walked backward, from the head of the set of revisions.
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   125
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   126
preexisting cached data
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   127
-----------------------
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   128
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   129
The stable sort assume we already have 2 important property cached for each
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   130
changesets:
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   131
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   132
1) changeset depth == len(::r)
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   133
2) first merge == max(merge() and ::r)
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   134
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   135
Caching strategy
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   136
----------------
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   137
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   138
Since we always walk from the head, the iteration mostly have to follow the
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   139
unique parent of non merge revision. For merge revision, we need to iterate
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   140
over the revisions accessible only through one of the parent before coming back
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   141
to the other parent eventually.
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   142
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   143
To efficiently cache the revision path we need to walk, we records "jumps". A
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   144
jump is a revision where the next revision (in the stable sort) will not be a
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   145
parent of the current revision, but another revision in the graph.
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   146
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   147
In the first (simple) example above, we had::
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   148
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   149
  A -> B -> C -> D -> G -> H
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   150
         \         /
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   151
          > E -> F
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   152
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   153
  stablesort(::D) = [A, B, C, D]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   154
  stablesort(::F) = [A, B, E, F]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   155
  stablesort(::G) = [A, B, C, D, E, F, G]
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   156
4854
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   157
In this case, when caching stable sort data for `G`, we need to record the `E
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   158
-> D` jump. This correspond to point were we are done iterating over the
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   159
revision accessible through `F` and we need to "jump back to the other parent"
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   160
of `G`: `D`.
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   161
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   162
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   163
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   164
In the second (more advance) example above, we had::
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   165
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   166
  A - B ----- F - H
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   167
   \    \   /   /
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   168
    \     E - G
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   169
     \  /   /
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   170
      C - D
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   171
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   172
  stablesort(::F) = [A, B, C, E, F]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   173
  stablesort(::G) = [A, B, C, D, E, G]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   174
  stablesort(::H) = [A, B, C, E, F, D, G, H]
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   175
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   176
In this case, when caching stable sort data for `G`, we need to record the `G
79c9bc7663c2 stable-doc: add more advanced examples
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4853
diff changeset
   177
-> D` and the `D -> F` jumps.
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   178
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   179
Jumps are recorded using the following formats:
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   180
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   181
    (jump-point, jump-destination, section-size)
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   182
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   183
* jump-point is the last revision number we should iterate over before jumping,
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   184
* jump-destination is the next revision we should iterate over after the jump point,
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   185
* section-size is the number of revision to be iterated before reaching jump-point.
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   186
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   187
the section-size is not directly used when doing a stable-sorted walk. However
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   188
it is useful for higher level piece of code to take decision without having to
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   189
actually walk the graph, (see stable range documentation).
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   190
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   191
For each merge, we store the set of jumps that cover the exclusive side.
4835
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   192
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   193
Practical data
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   194
--------------
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   195
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   196
The mercurial repository has simple branching and few jumps:
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   197
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   198
    number of revisions:        69771
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   199
    number of merge:             2734
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   200
    number of jumps:             2950
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   201
    average jumps:                  1.079
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   202
    median jumps:                   1
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   203
    90% jumps:                      1
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   204
    99% jumps:                      3
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   205
    max jumps:                      6
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   206
    jump cache size:           35 400 bytes
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   207
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   208
Mozilla's branching is fairly simple too:
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   209
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   210
    number of revisions:       435078
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   211
    number of merge:            21035
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   212
    number of jumps:            31434
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   213
    average jumps:                  1.494
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   214
    median jumps:                   1
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   215
    90% jumps:                      2
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   216
    99% jumps:                      9
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   217
    max jumps:                    169
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   218
    jump cache size:          377 208 bytes
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   219
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   220
Pypy has a more complicated branching history but jumps cache remains reasonable
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   221
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   222
    number of revisions:        95010
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   223
    number of merge:             7911
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   224
    number of jumps:            24326
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   225
    average jumps:                  3.075
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   226
    median jumps:                   1
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   227
    90% jumps:                      5
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   228
    99% jumps:                     40
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   229
    max jumps:                    329
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   230
    jump cache size:          291 912 bytes
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   231
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   232
This still apply to larger private project:
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   233
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   234
    number of revisions:       605011
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   235
    number of merge:           118109
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   236
    number of jumps:           314925
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   237
    average jumps:                  2.667
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   238
    median jumps:                   1
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   239
    90% jumps:                      3
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   240
    99% jumps:                     34
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   241
    max jumps:                    660
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   242
    jump cache size:        3 779 100 bytes
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   243
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   244
It is worth noting that the last jump could be computed form other information,
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   245
removing one jump storage per merge. However this does not seems to be an issue
7c38a4353bb3 stablesort: add some field data about stable sort cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4834
diff changeset
   246
worth the troubles for now.
4833
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   247
"""
72cebe6642d7 stablesort: add some documentation for stablesort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814
diff changeset
   248
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   249
import array
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   250
import collections
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   251
import struct
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   252
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   253
from mercurial import (
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   254
    commands,
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   255
    localrepo,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   256
    error,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   257
    node as nodemod,
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4745
diff changeset
   258
    pycompat,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   259
    scmutil,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   260
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   261
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   262
from mercurial.i18n import _
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   263
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   264
from . import (
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
   265
    compat,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   266
    depthcache,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   267
    exthelper,
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   268
    utility,
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   269
    genericcaches,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   270
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   271
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   272
filterparents = utility.filterparents
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   273
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   274
eh = exthelper.exthelper()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   275
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   276
def _mergepoint_tie_breaker(repo):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   277
    """the key use to tie break merge parent
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   278
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   279
    Exists as a function to help playing with different approaches.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   280
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   281
    Possible other factor are:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   282
        * depth of node,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   283
        * number of exclusive merges,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   284
        * number of jump points.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   285
        * <insert-your-idea>
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   286
    """
3322
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
   287
    node = repo.changelog.node
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
   288
    depth = repo.depthcache.get
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
   289
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
   290
    def key(rev):
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
   291
        return (-depth(rev), node(rev))
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
   292
    return key
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   293
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   294
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4488
diff changeset
   295
    b'debugstablesort',
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   296
    [
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4488
diff changeset
   297
        (b'r', b'rev', [], b'heads to start from'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4488
diff changeset
   298
        (b'', b'method', b'branchpoint', b"method used for sorting, one of: "
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4488
diff changeset
   299
         b"branchpoint, basic-mergepoint and basic-headstart"),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4488
diff changeset
   300
        (b'l', b'limit', b'', b'number of revision display (default to all)')
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   301
    ] + commands.formatteropts,
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4488
diff changeset
   302
    _(b''))
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   303
def debugstablesort(ui, repo, **opts):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   304
    """display the ::REVS set topologically sorted in a stable way
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   305
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   306
    revs = scmutil.revrange(repo, opts['rev'])
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   307
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   308
    method = opts['method']
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   309
    sorting = _methodmap.get(method)
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   310
    if sorting is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   311
        valid_method = b', '.join(sorted(_methodmap))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   312
        raise error.Abort(b'unknown sorting method: "%s"' % method,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   313
                          hint=b'pick one of: %s' % valid_method)
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   314
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4745
diff changeset
   315
    displayer = compat.changesetdisplayer(ui, repo, pycompat.byteskwargs(opts),
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4745
diff changeset
   316
                                          buffered=True)
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   317
    kwargs = {}
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   318
    if opts['limit']:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   319
        kwargs['limit'] = int(opts['limit'])
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   320
    for r in sorting(repo, revs, **kwargs):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   321
        ctx = repo[r]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   322
        displayer.show(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   323
        displayer.flush(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   324
    displayer.close()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   325
4834
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   326
@eh.command(
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   327
    b'debugstablesortcache',
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   328
    [] + commands.formatteropts,
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   329
    _(b''))
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   330
def debugstablesortcache(ui, repo, **opts):
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   331
    """display data about the stable sort cache of a repository
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   332
    """
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   333
    unfi = repo.unfiltered()
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   334
    revs = unfi.revs('all()')
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   335
    nbrevs = len(revs)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   336
    ui.write('number of revisions: %12d\n' % nbrevs)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   337
    merge = unfi.revs('merge()')
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   338
    nbmerge = len(merge)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   339
    cache = unfi.stablesort
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   340
    ui.write('number of merge:     %12d\n' % nbmerge)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   341
    alljumps = []
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   342
    alljumpssize = []
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   343
    for r in merge:
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   344
        jumps = cache.getjumps(unfi, r)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   345
        if jumps is None:
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   346
            continue # not a merge
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   347
        jumps = list(jumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   348
        alljumps.append(jumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   349
        alljumpssize.append(len(jumps))
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   350
    nbjumps = sum(alljumpssize)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   351
    ui.write('number of jumps:     %12d\n' % nbjumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   352
    if not nbjumps:
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   353
        return 0
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   354
    avgjumps = nbjumps / float(len(alljumpssize))
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   355
    ui.write('average jumps:                 %6.3f\n' % avgjumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   356
    alljumpssize.sort()
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   357
    medianjumps = alljumpssize[len(alljumpssize) // 2]
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   358
    ui.write('median jumps:        %12d\n' % medianjumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   359
    tensjumps = alljumpssize[len(alljumpssize) * 9 // 10]
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   360
    ui.write('90%% jumps:           %12d\n' % tensjumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   361
    centsjumps = alljumpssize[len(alljumpssize) * 99 // 100]
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   362
    ui.write('99%% jumps:           %12d\n' % centsjumps)
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   363
    ui.write('max jumps:           %12d\n' % max(alljumpssize))
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   364
    ui.write('jump cache size:     %12d bytes\n' % (nbjumps * 12))
9a52930f6781 stablesort: introduce a small debugstablesortcache command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4833
diff changeset
   365
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3243
diff changeset
   366
def stablesort_branchpoint(repo, revs, mergecallback=None):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   367
    """return '::revs' topologically sorted in "stable" order
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   368
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   369
    This is a depth first traversal starting from 'nullrev', using node as a
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   370
    tie breaker.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   371
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   372
    # Various notes:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   373
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   374
    # * Bitbucket is used dates as tie breaker, that might be a good idea.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   375
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   376
    # * It seemds we can traverse in the same order from (one) head to bottom,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   377
    #   if we the following record data for each merge:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   378
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   379
    #  - highest (stablesort-wise) common ancestors,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   380
    #  - order of parents (tablesort-wise)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   381
    cl = repo.changelog
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   382
    parents = cl.parentrevs
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   383
    nullrev = nodemod.nullrev
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   384
    n = cl.node
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   385
    # step 1: We need a parents -> children mapping for 2 reasons.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   386
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   387
    # * we build the order from nullrev to tip
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   388
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   389
    # * we need to detect branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   390
    children = collections.defaultdict(list)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   391
    for r in cl.ancestors(revs, inclusive=True):
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   392
        ps = filterparents(parents(r))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   393
        if not ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   394
            children[nullrev].append(r)
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   395
        for p in ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   396
            children[p].append(r)
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   397
    # step two: walk back up
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   398
    # * pick lowest node in case of branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   399
    # * stack disregarded part of the branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   400
    # * process merge when both parents are yielded
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   401
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   402
    # track what changeset has been
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   403
    seen = [0] * (max(revs) + 2)
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   404
    seen[nullrev] = True # nullrev is known
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   405
    # starts from repository roots
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   406
    # reuse the list form the mapping as we won't need it again anyway
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   407
    stack = children[nullrev]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   408
    if not stack:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   409
        return []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   410
    if 1 < len(stack):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   411
        stack.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   412
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   413
    # list of rev, maybe we should yield, but since we built a children mapping we are 'O(N)' already
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   414
    result = []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   415
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   416
    current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   417
    while current is not None or stack:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   418
        if current is None:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   419
            # previous iteration reached a merge or an unready merge,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   420
            current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   421
            if seen[current]:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   422
                current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   423
                continue
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   424
        ps = filterparents(parents(current))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   425
        if not all(seen[p] for p in ps):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   426
            # we can't iterate on this merge yet because other child is not
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   427
            # yielded yet (and we are topo sorting) we can discard it for now
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   428
            # because it will be reached from the other child.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   429
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   430
            continue
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   431
        assert not seen[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   432
        seen[current] = True
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   433
        result.append(current) # could be yield, cf earlier comment
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   434
        if mergecallback is not None and 2 <= len(ps):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   435
            mergecallback(result, current)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   436
        cs = children[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   437
        if not cs:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   438
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   439
        elif 1 == len(cs):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   440
            current = cs[0]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   441
        else:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   442
            cs.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   443
            current = cs.pop() # proceed on smallest
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   444
            stack.extend(cs)   # stack the rest for later
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   445
    assert len(result) == len(set(result))
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   446
    return result
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   447
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   448
def stablesort_mergepoint_multirevs(repo, revs):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   449
    """return '::revs' topologically sorted in "stable" order
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   450
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   451
    This is a depth first traversal starting from 'revs' (toward root), using node as a
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   452
    tie breaker.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   453
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   454
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   455
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   456
    if not revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   457
        return []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   458
    elif len(revs) == 1:
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   459
        heads = list(sorted(revs))
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   460
    else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   461
        # keeps heads only
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   462
        heads = sorted(repo.revs(b'sort(heads(%ld::%ld))', revs, revs), key=tiebreaker)
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   463
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   464
    results = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   465
    while heads:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   466
        h = heads.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   467
        if revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   468
            bound = cl.findmissingrevs(common=heads, heads=[h])
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   469
        else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   470
            bound = cl.ancestors([h], inclusive=True)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   471
        results.append(stablesort_mergepoint_bounded(repo, h, bound))
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   472
    if len(results) == 1:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   473
        return results[0]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   474
    finalresults = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   475
    for r in results[::-1]:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   476
        finalresults.extend(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   477
    return finalresults
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   478
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   479
def stablesort_mergepoint_bounded(repo, head, revs):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   480
    """return 'revs' topologically sorted in "stable" order.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   481
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   482
    The 'revs' set MUST have 'head' as its one and unique head.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   483
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   484
    # Various notes:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   485
    #
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   486
    # * Bitbucket is using dates as tie breaker, that might be a good idea.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   487
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   488
    parents = cl.parentrevs
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   489
    nullrev = nodemod.nullrev
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   490
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   491
    # step 1: We need a parents -> children mapping to detect dependencies
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   492
    children = collections.defaultdict(set)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   493
    parentmap = {}
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   494
    for r in revs:
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   495
        ps = filterparents(parents(r))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   496
        if 2 <= len(ps):
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   497
            ps = tuple(sorted(ps, key=tiebreaker))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   498
        parentmap[r] = ps
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   499
        for p in ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   500
            children[p].add(r)
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   501
        if not ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   502
            children[nullrev].add(r)
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   503
    # step two: walk again,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   504
    stack = [head]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   505
    resultset = set()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   506
    result = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   507
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   508
    def add(current):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   509
        resultset.add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   510
        result.append(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   511
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   512
    while stack:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   513
        current = stack.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   514
        add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   515
        parents = parentmap[current]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   516
        for p in parents:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   517
            if 1 < len(children[p]) and not children[p].issubset(resultset):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   518
                # we need other children to be yield first
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   519
                continue
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   520
            if p in revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   521
                stack.append(p)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   522
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   523
    result.reverse()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   524
    assert len(result) == len(resultset)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   525
    return result
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   526
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   527
def stablesort_mergepoint_head_basic(repo, revs, limit=None):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   528
    heads = repo.revs(b'sort(heads(%ld))', revs)
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   529
    if not heads:
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   530
        return []
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   531
    elif 2 < len(heads):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   532
        raise error.Abort(b'cannot use head based merging, %d heads found'
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   533
                          % len(heads))
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   534
    head = heads.first()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   535
    revs = stablesort_mergepoint_bounded(repo, head, repo.revs(b'::%d', head))
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   536
    if limit is None:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   537
        return revs
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   538
    return revs[-limit:]
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   539
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   540
def stablesort_mergepoint_head_debug(repo, revs, limit=None):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   541
    heads = repo.revs(b'sort(heads(%ld))', revs)
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   542
    if not heads:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   543
        return []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   544
    elif 2 < len(heads):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   545
        raise error.Abort(b'cannot use head based merging, %d heads found'
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   546
                          % len(heads))
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   547
    head = heads.first()
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   548
    revs = stablesort_mergepoint_head(repo, head)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   549
    if limit is None:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   550
        return revs
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   551
    return revs[-limit:]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   552
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   553
def stablesort_mergepoint_head(repo, head):
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   554
    """return '::rev' topologically sorted in "stable" order
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   555
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   556
    This is a depth first traversal starting from 'rev' (toward root), using node as a
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   557
    tie breaker.
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   558
    """
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   559
    cl = repo.changelog
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   560
    parents = cl.parentrevs
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   561
    tiebreaker = _mergepoint_tie_breaker(repo)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   562
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   563
    top = [head]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   564
    mid = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   565
    bottom = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   566
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   567
    ps = filterparents(parents(head))
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   568
    while len(ps) == 1:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   569
        top.append(ps[0])
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   570
        ps = filterparents(parents(ps[0]))
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   571
    top.reverse()
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   572
    if len(ps) == 2:
3313
efceae0bfa35 stablesort: avoid attempting to sort a tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3311
diff changeset
   573
        ps = sorted(ps, key=tiebreaker)
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   574
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   575
        # get the part from the highest parent. This is the part that changes
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   576
        mid_revs = repo.revs(b'only(%d, %d)', ps[1], ps[0])
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   577
        if mid_revs:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   578
            mid = stablesort_mergepoint_bounded(repo, ps[1], mid_revs)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   579
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   580
        # And follow up with part othe parent we can inherit from
3314
110202a00de2 stablesort: fix head start computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3313
diff changeset
   581
        bottom = stablesort_mergepoint_head(repo, ps[0])
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   582
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   583
    return bottom + mid + top
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   584
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   585
def stablesort_mergepoint_head_cached(repo, revs, limit=None):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   586
    heads = repo.revs(b'sort(heads(%ld))', revs)
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   587
    if not heads:
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   588
        return []
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   589
    elif 2 < len(heads):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   590
        raise error.Abort(b'cannot use head based merging, %d heads found'
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   591
                          % len(heads))
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   592
    head = heads.first()
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   593
    cache = stablesortcache()
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   594
    first = list(cache.get(repo, head, limit=limit))
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   595
    second = list(cache.get(repo, head, limit=limit))
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   596
    if first != second:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   597
        repo.ui.warn(b'stablesort-cache: initial run different from re-run:\n'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   598
                     b'    %s\n'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   599
                     b'    %s\n' % (first, second))
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   600
    return second
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   601
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   602
class stablesortcache(object):
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   603
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   604
    def __init__(self):
3325
83d2a2f3dc8f stablesort: use a regular dict for jumps
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3323
diff changeset
   605
        self._jumps = {}
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   606
        super(stablesortcache, self).__init__()
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   607
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   608
    def get(self, repo, rev, limit=None):
3265
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   609
        result = []
3300
2d49773a378b stablesort: make the iteration from head available to all
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3267
diff changeset
   610
        for r in self.walkfrom(repo, rev):
3265
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   611
            result.append(r)
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   612
            if limit is not None and limit <= len(result):
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   613
                break
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   614
        result.reverse()
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   615
        return result
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   616
3323
4a84947010a1 stablesort: expose the jumps sequence to other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3322
diff changeset
   617
    def getjumps(self, repo, rev):
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   618
        if not self._hasjumpsdata(rev):
3358
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   619
            parents = filterparents(repo.changelog.parentrevs(rev))
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   620
            if len(parents) <= 1:
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   621
                self._setjumps(rev, None)
3326
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   622
            else:
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   623
                # merge ! warn the cache
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   624
                tiebreaker = _mergepoint_tie_breaker(repo)
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   625
                minparent = sorted(parents, key=tiebreaker)[0]
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   626
                for r in self.walkfrom(repo, rev):
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   627
                    if r == minparent:
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   628
                        break
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   629
        return self._getjumps(rev)
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   630
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   631
    def _hasjumpsdata(self, rev):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   632
        return rev in self._jumps
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   633
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   634
    def _getjumps(self, rev):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   635
        return self._jumps.get(rev)
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   636
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   637
    def _setjumps(self, rev, jumps):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   638
        self._jumps[rev] = jumps
3323
4a84947010a1 stablesort: expose the jumps sequence to other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3322
diff changeset
   639
3300
2d49773a378b stablesort: make the iteration from head available to all
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3267
diff changeset
   640
    def walkfrom(self, repo, head):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   641
        tiebreaker = _mergepoint_tie_breaker(repo)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   642
        cl = repo.changelog
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   643
        parentsfunc = cl.parentrevs
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   644
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   645
        def parents(rev):
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   646
            return filterparents(parentsfunc(rev))
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   647
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   648
        def oneparent(rev):
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   649
            ps = parents(rev)
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   650
            if not ps:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   651
                return None
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   652
            if len(ps) == 1:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   653
                return ps[0]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   654
            return max(ps, key=tiebreaker)
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   655
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   656
        current = head
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   657
        previous_current_1 = object()
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   658
        previous_current_2 = object()
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   659
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   660
        while current is not None:
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   661
            previous_current_2 = previous_current_1
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   662
            previous_current_1 = current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   663
            assert previous_current_1 is not previous_current_2
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   664
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   665
            jumps = self._getjumps(current)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   666
            if jumps is not None:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   667
                # we have enough cached information to directly iterate over
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   668
                # the exclusive size.
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   669
                for j in jumps:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   670
                    jump_point = j[0]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   671
                    jump_dest = j[1]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   672
                    if current == jump_point:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   673
                        yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   674
                    else:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   675
                        while current != jump_point:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   676
                            yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   677
                            current = oneparent(current)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   678
                            assert current is not None
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   679
                        yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   680
                    current = jump_dest
3336
c42158efb64e stablesort: realign a misaligned continue
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3335
diff changeset
   681
                continue
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   682
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   683
            yield current
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   684
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   685
            ps = parents(current)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   686
            if not ps:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   687
                current = None # break
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   688
            if len(ps) == 1:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   689
                current = ps[0]
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   690
            elif len(ps) == 2:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   691
                lower_parent, higher_parent = sorted(ps, key=tiebreaker)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   692
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   693
                rev = current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   694
                jumps = []
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   695
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   696
                def recordjump(source, destination, size):
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   697
                    jump = (source, destination, size)
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   698
                    jumps.append(jump)
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   699
                process = self._process_exclusive_side
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   700
                for rev in process(lower_parent, higher_parent, cl, parents,
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   701
                                   tiebreaker, recordjump):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   702
                    yield rev
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   703
3328
ff262ae59541 stablesort: move jump recording inside the exclusive function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3326
diff changeset
   704
                if rev == current:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   705
                    recordjump(rev, lower_parent, 1)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   706
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   707
                self._setjumps(current, jumps)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   708
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   709
                current = lower_parent
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   710
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   711
    def _process_exclusive_side(self, lower, higher, cl, parents, tiebreaker,
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   712
                                recordjump):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   713
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   714
        exclusive = cl.findmissingrevs(common=[lower], heads=[higher])
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   715
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   716
        def popready(stack):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   717
            """pop the top most ready item in the list"""
4737
46c990705a96 py3: replace xrange() by range()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   718
            for idx in range(len(stack) - 1, -1, -1):
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   719
                if children[stack[idx]].issubset(seen):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   720
                    return stack.pop(idx)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   721
            return None
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   722
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   723
        hardstack = []
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   724
        previous = None
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   725
        seen = set()
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   726
        current = higher
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   727
        children = collections.defaultdict(set)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   728
        bound = set(exclusive)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   729
        if exclusive:
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   730
            for r in exclusive:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   731
                for p in parents(r):
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   732
                    children[p].add(r)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   733
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   734
            hardstack.append(higher)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   735
        nextjump = False
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   736
        size = 1 # take the merge point into account
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   737
        while hardstack:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   738
            current = popready(hardstack)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   739
            if current in seen:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   740
                continue
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   741
            softstack = []
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   742
            while current in bound and current not in seen:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   743
                if nextjump:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   744
                    recordjump(previous, current, size)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   745
                    nextjump = False
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   746
                    size = 0
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   747
                yield current
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   748
                size += 1
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   749
                previous = current
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   750
                seen.add(current)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   751
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   752
                all_parents = parents(current)
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   753
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   754
                # search or next parent to walk through
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   755
                fallback, next = None, None
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   756
                if 1 == len(all_parents):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   757
                    next = all_parents[0]
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   758
                elif 2 <= len(all_parents):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   759
                    fallback, next = sorted(all_parents, key=tiebreaker)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   760
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   761
                # filter parent not ready (children not emitted)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   762
                while next is not None and not children[next].issubset(seen):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   763
                    nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   764
                    next = fallback
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   765
                    fallback = None
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   766
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   767
                # stack management
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   768
                if next is None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   769
                    next = popready(softstack)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   770
                    if next is not None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   771
                        nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   772
                elif fallback is not None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   773
                    softstack.append(fallback)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   774
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   775
                # get ready for next iteration
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   776
                current = next
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   777
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   778
            # any in processed head has to go in the hard stack
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   779
            nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   780
            hardstack.extend(softstack)
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   781
3328
ff262ae59541 stablesort: move jump recording inside the exclusive function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3326
diff changeset
   782
        if previous is not None:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   783
            recordjump(previous, lower, size)
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   784
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   785
def stablesort_mergepoint_head_ondisk(repo, revs, limit=None):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   786
    heads = repo.revs(b'sort(heads(%ld))', revs)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   787
    if not heads:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   788
        return []
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   789
    elif 2 < len(heads):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   790
        raise error.Abort(b'cannot use head based merging, %d heads found'
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   791
                          % len(heads))
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   792
    head = heads.first()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   793
    unfi = repo.unfiltered()
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   794
    cache = unfi.stablesort
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   795
    cache.save(unfi)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   796
    return cache.get(repo, head, limit=limit)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   797
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   798
S_INDEXSIZE = struct.Struct(b'>I')
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   799
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   800
class ondiskstablesortcache(stablesortcache, genericcaches.changelogsourcebase):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   801
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   802
    _filepath = b'evoext-stablesortcache-00'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   803
    _cachename = b'evo-ext-stablesort'
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   804
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   805
    def __init__(self):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   806
        super(ondiskstablesortcache, self).__init__()
4806
44629ae21b84 python3: add raw prefix to all array.array() calls
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   807
        self._index = array.array(r'l')
44629ae21b84 python3: add raw prefix to all array.array() calls
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   808
        self._data = array.array(r'l')
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   809
        del self._jumps
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   810
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   811
    def getjumps(self, repo, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   812
        if len(self._index) < rev:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   813
            msg = b'stablesortcache must be warmed before use (%d < %d)'
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   814
            msg %= (len(self._index), rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   815
            raise error.ProgrammingError(msg)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   816
        return self._getjumps(rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   817
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   818
    def _getjumps(self, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   819
        # very first revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   820
        if rev == 0:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   821
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   822
        # no data yet
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   823
        if len(self._index) <= rev:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   824
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   825
        index = self._index
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   826
        # non merge revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   827
        if index[rev] == index[rev - 1]:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   828
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   829
        data = self._data
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   830
        # merge revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   831
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   832
        def jumps():
4737
46c990705a96 py3: replace xrange() by range()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   833
            for idx in range(index[rev - 1], index[rev]):
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   834
                i = idx * 3
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   835
                yield tuple(data[i:i + 3])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   836
        return jumps()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   837
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   838
    def _setjumps(self, rev, jumps):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   839
        assert len(self._index) == rev, (len(self._index), rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   840
        if rev == 0:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   841
            self._index.append(0)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   842
            return
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   843
        end = self._index[rev - 1]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   844
        if jumps is None:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   845
            self._index.append(end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   846
            return
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   847
        assert len(self._data) == end * 3, (len(self._data), end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   848
        for j in jumps:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   849
            self._data.append(j[0])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   850
            self._data.append(j[1])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   851
            self._data.append(j[2])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   852
            end += 1
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   853
        self._index.append(end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   854
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   855
    def _updatefrom(self, repo, data):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   856
        repo = repo.unfiltered()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   857
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   858
        total = len(data)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   859
4755
8664231b47ac py3: fix progress() functions to not use "%s" with int
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
   860
        def progress(pos, rev=None):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   861
            revstr = b'' if rev is None else (b'rev %d' % rev)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   862
            compat.progress(repo.ui, b'updating stablesort cache',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   863
                            pos, revstr, unit=b'revision', total=total)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   864
4796
4b1518d69a41 py3: add back a progress(0) call lost in 8664231b47ac
Martin von Zweigbergk <martinvonz@google.com>
parents: 4755
diff changeset
   865
        progress(0)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   866
        for idx, rev in enumerate(data):
3358
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   867
            parents = filterparents(repo.changelog.parentrevs(rev))
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   868
            if len(parents) <= 1:
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   869
                self._setjumps(rev, None)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   870
            else:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   871
                # merge! warn the cache
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   872
                tiebreaker = _mergepoint_tie_breaker(repo)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   873
                minparent = sorted(parents, key=tiebreaker)[0]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   874
                for r in self.walkfrom(repo, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   875
                    if r == minparent:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   876
                        break
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   877
            if not (idx % 1000): # progress as a too high performance impact
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   878
                progress(idx, rev)
4755
8664231b47ac py3: fix progress() functions to not use "%s" with int
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
   879
        progress(None)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   880
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   881
    def clear(self, reset=False):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   882
        super(ondiskstablesortcache, self).clear()
4806
44629ae21b84 python3: add raw prefix to all array.array() calls
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   883
        self._index = array.array(r'l')
44629ae21b84 python3: add raw prefix to all array.array() calls
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   884
        self._data = array.array(r'l')
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   885
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   886
    def load(self, repo):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   887
        """load data from disk
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   888
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   889
        (crude version, read everything all the time)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   890
        """
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   891
        assert repo.filtername is None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   892
4488
6c0992ce05f7 compat: drop getcachevfs, repo.cachevfs is supported in hg 4.4
Joerg Sonnenberger <joerg@bec.de>
parents: 4341
diff changeset
   893
        data = repo.cachevfs.tryread(self._filepath)
4806
44629ae21b84 python3: add raw prefix to all array.array() calls
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   894
        self._index = array.array(r'l')
44629ae21b84 python3: add raw prefix to all array.array() calls
Raphaël Gomès <rgomes@octobus.net>
parents: 4804
diff changeset
   895
        self._data = array.array(r'l')
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   896
        if not data:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   897
            self._cachekey = self.emptykey
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   898
        else:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   899
            headerdata = data[:self._cachekeysize]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   900
            self._cachekey = self._deserializecachekey(headerdata)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   901
            offset = self._cachekeysize
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   902
            indexsizedata = data[offset:offset + S_INDEXSIZE.size]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   903
            indexsize = S_INDEXSIZE.unpack(indexsizedata)[0]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   904
            offset += S_INDEXSIZE.size
4745
854637e3d2d0 py3: use array.array.{to,from}bytes() on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4737
diff changeset
   905
            compat.arrayfrombytes(self._index, data[offset:offset + indexsize])
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   906
            offset += indexsize
4745
854637e3d2d0 py3: use array.array.{to,from}bytes() on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4737
diff changeset
   907
            compat.arrayfrombytes(self._data, data[offset:])
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   908
        self._ondiskkey = self._cachekey
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   909
        pass
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   910
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   911
    def save(self, repo):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   912
        """save the data to disk
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   913
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   914
        (crude version, rewrite everything all the time)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   915
        """
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   916
        if self._cachekey is None or self._cachekey == self._ondiskkey:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   917
            return
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   918
        try:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   919
            cachefile = repo.cachevfs(self._filepath, b'w', atomictemp=True)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   920
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   921
            # data to write
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   922
            headerdata = self._serializecachekey()
4745
854637e3d2d0 py3: use array.array.{to,from}bytes() on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4737
diff changeset
   923
            indexdata = compat.arraytobytes(self._index)
854637e3d2d0 py3: use array.array.{to,from}bytes() on py3
Martin von Zweigbergk <martinvonz@google.com>
parents: 4737
diff changeset
   924
            data = compat.arraytobytes(self._data)
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   925
            indexsize = S_INDEXSIZE.pack(len(indexdata))
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   926
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   927
            # writing
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   928
            cachefile.write(headerdata)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   929
            cachefile.write(indexsize)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   930
            cachefile.write(indexdata)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   931
            cachefile.write(data)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   932
            cachefile.close()
4104
a023abd12f3b stablesortcache: update the variable tracking on-disk state after write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4103
diff changeset
   933
            self._ondiskkey = self._cachekey
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   934
        except (IOError, OSError) as exc:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   935
            repo.ui.log(b'stablesortcache', b'could not write update %s\n' % exc)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   936
            repo.ui.debug(b'stablesortcache: could not write update %s\n' % exc)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   937
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   938
@eh.reposetup
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   939
def setupcache(ui, repo):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   940
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   941
    class stablesortrepo(repo.__class__):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   942
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   943
        @localrepo.unfilteredpropertycache
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   944
        def stablesort(self):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   945
            cache = ondiskstablesortcache()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   946
            cache.update(self)
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   947
            return cache
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   948
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   949
        @localrepo.unfilteredmethod
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   950
        def destroyed(self):
4804
079dbf36e884 python3: add raw prefix in cases harder to analyze at the token level
Raphaël Gomès <rgomes@octobus.net>
parents: 4796
diff changeset
   951
            if r'stablesort' in vars(self):
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   952
                self.stablesort.clear()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   953
            super(stablesortrepo, self).destroyed()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   954
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   955
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   956
        def updatecaches(self, tr=None, **kwargs):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   957
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   958
                self.stablesort.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   959
                self.stablesort.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   960
            super(stablesortrepo, self).updatecaches(tr, **kwargs)
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   961
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   962
    repo.__class__ = stablesortrepo
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   963
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   964
_methodmap = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   965
    b'branchpoint': stablesort_branchpoint,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   966
    b'basic-mergepoint': stablesort_mergepoint_multirevs,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   967
    b'basic-headstart': stablesort_mergepoint_head_basic,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   968
    b'headstart': stablesort_mergepoint_head_debug,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   969
    b'headcached': stablesort_mergepoint_head_cached,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4806
diff changeset
   970
    b'headondisk': stablesort_mergepoint_head_ondisk,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   971
}
3952
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3857
diff changeset
   972
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3857
diff changeset
   973
# merge last so that repo setup wrap after that one.
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3857
diff changeset
   974
eh.merge(depthcache.eh)