contrib/perf-utils/subsetmaker.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 15 Mar 2021 16:37:11 +0100
changeset 46767 36b4640ccb6a
parent 46766 cb70dabe5718
child 46772 63a3941d9847
permissions -rw-r--r--
perf-helper: add a new sampling revset based on anti-chain See inline documentation for details. Differential Revision: https://phab.mercurial-scm.org/D10222
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46766
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
"""revset to select sample of repository
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
Hopefully this is useful to create interesting discovery cases.
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
"""
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
import collections
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
import random
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
from mercurial.i18n import _
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
from mercurial import (
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
    registrar,
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
    revset,
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
    revsetlang,
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
    smartset,
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
revsetpredicate = registrar.revsetpredicate()
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
@revsetpredicate(b'scratch(REVS, <count>, [seed])')
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
def scratch(repo, subset, x):
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
    """randomly remove <count> revision from the repository top
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
    This subset is created by recursively picking changeset starting from the
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
    heads. It can be summarized using the following algorithm::
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
        selected = set()
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
        for i in range(<count>):
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
            unselected = repo.revs("not <selected>")
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
            candidates = repo.revs("heads(<unselected>)")
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
            pick = random.choice(candidates)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
            selected.add(pick)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
    """
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
    m = _(b"scratch expects revisions, count argument and an optional seed")
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
    args = revsetlang.getargs(x, 2, 3, m)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
    if len(args) == 2:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
        x, n = args
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    39
        rand = random
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    40
    elif len(args) == 3:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    41
        x, n, seed = args
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    42
        seed = revsetlang.getinteger(seed, _(b"seed should be a number"))
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
        rand = random.Random(seed)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
    else:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
        assert False
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    46
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    47
    n = revsetlang.getinteger(n, _(b"scratch expects a number"))
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    48
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    49
    selected = set()
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    50
    heads = set()
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
    children_count = collections.defaultdict(lambda: 0)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    52
    parents = repo.changelog._uncheckedparentrevs
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
    baseset = revset.getset(repo, smartset.fullreposet(repo), x)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
    baseset.sort()
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
    for r in baseset:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
        heads.add(r)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
        p1, p2 = parents(r)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
        if p1 >= 0:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
            heads.discard(p1)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
            children_count[p1] += 1
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
        if p2 >= 0:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
            heads.discard(p2)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    65
            children_count[p2] += 1
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
    for h in heads:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    68
        assert children_count[h] == 0
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
    selected = set()
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
    for x in range(n):
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
        if not heads:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
            break
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    74
        pick = rand.choice(list(heads))
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    75
        heads.remove(pick)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    76
        assert pick not in selected
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
        selected.add(pick)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
        p1, p2 = parents(pick)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
        if p1 in children_count:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
            assert p1 in children_count
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
            children_count[p1] -= 1
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
            assert children_count[p1] >= 0
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
            if children_count[p1] == 0:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
                assert p1 not in selected, (r, p1)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    85
                heads.add(p1)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
        if p2 in children_count:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
            assert p2 in children_count
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
            children_count[p2] -= 1
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
            assert children_count[p2] >= 0
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
            if children_count[p2] == 0:
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
                assert p2 not in selected, (r, p2)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
                heads.add(p2)
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
cb70dabe5718 perf-helper: add a small extension with revsets to select repository subset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
    return smartset.baseset(selected) & subset
46767
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
    95
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
    96
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
    97
@revsetpredicate(b'randomantichain(REVS, [seed])')
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
    98
def antichain(repo, subset, x):
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
    99
    """Pick a random anti-chain in the repository
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   100
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   101
    A antichain is a set of changeset where there isn't any element that is
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   102
    either a descendant or ancestors of any other element in the set. In other
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   103
    word, all the elements are independant. It can be summarized with the
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   104
    following algorithm::
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   105
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   106
    selected = set()
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   107
    unselected = repo.revs('all()')
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   108
    while unselected:
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   109
        pick = random.choice(unselected)
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   110
        selected.add(pick)
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   111
        unselected -= repo.revs('::<pick> + <pick>::')
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   112
    """
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   113
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   114
    args = revsetlang.getargs(
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   115
        x, 1, 2, _(b"randomantichain expects revisions and an optional seed")
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   116
    )
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   117
    if len(args) == 1:
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   118
        (x,) = args
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   119
        rand = random
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   120
    elif len(args) == 2:
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   121
        x, seed = args
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   122
        seed = revsetlang.getinteger(seed, _(b"seed should be a number"))
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   123
        rand = random.Random(seed)
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   124
    else:
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   125
        assert False
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   126
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   127
    selected = set()
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   128
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   129
    baseset = revset.getset(repo, smartset.fullreposet(repo), x)
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   130
    undecided = baseset
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   131
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   132
    while undecided:
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   133
        pick = rand.choice(list(undecided))
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   134
        selected.add(pick)
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   135
        undecided = repo.revs(
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   136
            '%ld and not (::%ld or %ld::head())', baseset, selected, selected
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   137
        )
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   138
36b4640ccb6a perf-helper: add a new sampling revset based on anti-chain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46766
diff changeset
   139
    return smartset.baseset(selected) & subset