author | Pierre-Yves David <pierre-yves.david@octobus.net> |
Mon, 15 Mar 2021 16:35:54 +0100 | |
changeset 46766 | cb70dabe5718 |
child 46767 | 36b4640ccb6a |
permissions | -rw-r--r-- |
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 |