author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
Sat, 11 Mar 2017 14:46:27 -0800 | |
changeset 2092 | ed140544e7fd |
parent 2091 | fcb8db796576 |
child 2093 | e7ad31804da8 |
permissions | -rw-r--r-- |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
1 |
# Code dedicated to the discovery of obsolescence marker "over the wire" |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
2 |
# |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
3 |
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
4 |
# |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
6 |
# GNU General Public License version 2 or any later version. |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
7 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
8 |
from __future__ import absolute_import |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
9 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
10 |
try: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
11 |
import StringIO as io |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
12 |
StringIO = io.StringIO |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
13 |
except ImportError: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
14 |
import io |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
15 |
StringIO = io.StringIO |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
16 |
|
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
17 |
import collections |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
18 |
import hashlib |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
19 |
import heapq |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
20 |
import math |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
21 |
import struct |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
22 |
|
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
23 |
from mercurial import ( |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
24 |
bundle2, |
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
25 |
cmdutil, |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
26 |
commands, |
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
27 |
dagutil, |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
28 |
error, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
29 |
exchange, |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
30 |
extensions, |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
31 |
localrepo, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
32 |
node, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
33 |
obsolete, |
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
34 |
scmutil, |
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
35 |
setdiscovery, |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
36 |
util, |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
37 |
wireproto, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
38 |
) |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
39 |
from mercurial.hgweb import hgweb_mod |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
40 |
from mercurial.i18n import _ |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
41 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
42 |
from . import ( |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
43 |
exthelper, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
44 |
utility, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
45 |
) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
46 |
|
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
47 |
_pack = struct.pack |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
48 |
_unpack = struct.unpack |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
49 |
|
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
50 |
eh = exthelper.exthelper() |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
51 |
obsexcmsg = utility.obsexcmsg |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
52 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
53 |
########################################## |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
54 |
### trigger discovery during exchange ### |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
55 |
########################################## |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
56 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
57 |
@eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers') |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
58 |
def _pushdiscoveryobsmarkers(orig, pushop): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
59 |
if (obsolete.isenabled(pushop.repo, obsolete.exchangeopt) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
60 |
and pushop.repo.obsstore |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
61 |
and 'obsolete' in pushop.remote.listkeys('namespaces')): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
62 |
repo = pushop.repo |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
63 |
obsexcmsg(repo.ui, "computing relevant nodes\n") |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
64 |
revs = list(repo.revs('::%ln', pushop.futureheads)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
65 |
unfi = repo.unfiltered() |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
66 |
cl = unfi.changelog |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
67 |
if not pushop.remote.capable('_evoext_obshash_0'): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
68 |
# do not trust core yet |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
69 |
# return orig(pushop) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
70 |
nodes = [cl.node(r) for r in revs] |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
71 |
if nodes: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
72 |
obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n" |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
73 |
% len(nodes)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
74 |
pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
75 |
else: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
76 |
obsexcmsg(repo.ui, "markers already in sync\n") |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
77 |
pushop.outobsmarkers = [] |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
78 |
pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
79 |
return |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
80 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
81 |
common = [] |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
82 |
missing = None |
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
83 |
obsexcmsg(repo.ui, "looking for common markers in %i nodes\n" |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
84 |
% len(revs)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
85 |
commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads)) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
86 |
if _canobshashrange(repo, pushop.remote): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
87 |
missing = findmissingrange(pushop.ui, unfi, pushop.remote, |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
88 |
commonrevs) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
89 |
else: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
90 |
common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote, |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
91 |
commonrevs) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
92 |
if missing is None: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
93 |
revs = list(unfi.revs('%ld - (::%ln)', revs, common)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
94 |
nodes = [cl.node(r) for r in revs] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
95 |
else: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
96 |
revs = list(repo.revs('only(%ln, %ln)', pushop.futureheads, |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
97 |
pushop.outgoing.commonheads)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
98 |
nodes = [cl.node(r) for r in revs] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
99 |
nodes += missing |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
100 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
101 |
if nodes: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
102 |
obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n" |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
103 |
% len(nodes)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
104 |
pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
105 |
else: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
106 |
obsexcmsg(repo.ui, "markers already in sync\n") |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
107 |
pushop.outobsmarkers = [] |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
108 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
109 |
@eh.extsetup |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
110 |
def _installobsmarkersdiscovery(ui): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
111 |
olddisco = exchange.pushdiscoverymapping['obsmarker'] |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
112 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
113 |
def newdisco(pushop): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
114 |
_pushdiscoveryobsmarkers(olddisco, pushop) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
115 |
exchange.pushdiscoverymapping['obsmarker'] = newdisco |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
116 |
|
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
117 |
def buildpullobsmarkersboundaries(pullop, bundle2=True): |
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
118 |
"""small function returning the argument for pull markers call |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
119 |
may to contains 'heads' and 'common'. skip the key for None. |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
120 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
121 |
It is a separed function to play around with strategy for that.""" |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
122 |
repo = pullop.repo |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
123 |
remote = pullop.remote |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
124 |
unfi = repo.unfiltered() |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
125 |
revs = unfi.revs('::(%ln - null)', pullop.common) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
126 |
boundaries = {'heads': pullop.pulledsubset} |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
127 |
if not revs: # nothing common |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
128 |
boundaries['common'] = [node.nullid] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
129 |
return boundaries |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
130 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
131 |
if bundle2 and _canobshashrange(repo, remote): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
132 |
obsexcmsg(repo.ui, "looking for common markers in %i nodes\n" |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
133 |
% len(revs)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
134 |
boundaries['missing'] = findmissingrange(repo.ui, repo, pullop.remote, |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
135 |
revs) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
136 |
elif remote.capable('_evoext_obshash_0'): |
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
137 |
obsexcmsg(repo.ui, "looking for common markers in %i nodes\n" |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
138 |
% len(revs)) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
139 |
boundaries['common'] = findcommonobsmarkers(repo.ui, repo, remote, revs) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
140 |
else: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
141 |
boundaries['common'] = [node.nullid] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
142 |
return boundaries |
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
143 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
144 |
################################## |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
145 |
### Code performing discovery ### |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
146 |
################################## |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
147 |
|
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
148 |
def _canobshashrange(local, remote): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
149 |
return (local.ui.configbool('experimental', 'obshashrange', False) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
150 |
and remote.capable('_evoext_obshashrange_1')) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
151 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
152 |
def _obshashrange_capabilities(orig, repo, proto): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
153 |
"""wrapper to advertise new capability""" |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
154 |
caps = orig(repo, proto) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
155 |
enabled = repo.ui.configbool('experimental', 'obshashrange', False) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
156 |
if obsolete.isenabled(repo, obsolete.exchangeopt) and enabled: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
157 |
caps = caps.split() |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
158 |
caps.append('_evoext_obshashrange_1') |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
159 |
caps.sort() |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
160 |
caps = ' '.join(caps) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
161 |
return caps |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
162 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
163 |
@eh.extsetup |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
164 |
def obshashrange_extsetup(ui): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
165 |
extensions.wrapfunction(wireproto, 'capabilities', _obshashrange_capabilities) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
166 |
# wrap command content |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
167 |
oldcap, args = wireproto.commands['capabilities'] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
168 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
169 |
def newcap(repo, proto): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
170 |
return _obshashrange_capabilities(oldcap, repo, proto) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
171 |
wireproto.commands['capabilities'] = (newcap, args) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
172 |
|
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
173 |
def findcommonobsmarkers(ui, local, remote, probeset, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
174 |
initialsamplesize=100, |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
175 |
fullsamplesize=200): |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
176 |
# from discovery |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
177 |
roundtrips = 0 |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
178 |
cl = local.changelog |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
179 |
dag = dagutil.revlogdag(cl) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
180 |
missing = set() |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
181 |
common = set() |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
182 |
undecided = set(probeset) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
183 |
totalnb = len(undecided) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
184 |
ui.progress(_("comparing with other"), 0, total=totalnb) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
185 |
_takefullsample = setdiscovery._takefullsample |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
186 |
if remote.capable('_evoext_obshash_1'): |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
187 |
getremotehash = remote.evoext_obshash1 |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
188 |
localhash = _obsrelsethashtreefm1(local) |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
189 |
else: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
190 |
getremotehash = remote.evoext_obshash |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
191 |
localhash = _obsrelsethashtreefm0(local) |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
192 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
193 |
while undecided: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
194 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
195 |
ui.note(_("sampling from both directions\n")) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
196 |
if len(undecided) < fullsamplesize: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
197 |
sample = set(undecided) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
198 |
else: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
199 |
sample = _takefullsample(dag, undecided, size=fullsamplesize) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
200 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
201 |
roundtrips += 1 |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
202 |
ui.progress(_("comparing with other"), totalnb - len(undecided), |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
203 |
total=totalnb) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
204 |
ui.debug("query %i; still undecided: %i, sample size is: %i\n" |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
205 |
% (roundtrips, len(undecided), len(sample))) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
206 |
# indices between sample and externalized version must match |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
207 |
sample = list(sample) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
208 |
remotehash = getremotehash(dag.externalizeall(sample)) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
209 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
210 |
yesno = [localhash[ix][1] == remotehash[si] |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
211 |
for si, ix in enumerate(sample)] |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
212 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
213 |
commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
214 |
common.update(dag.ancestorset(commoninsample, common)) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
215 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
216 |
missinginsample = [n for i, n in enumerate(sample) if not yesno[i]] |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
217 |
missing.update(dag.descendantset(missinginsample, missing)) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
218 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
219 |
undecided.difference_update(missing) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
220 |
undecided.difference_update(common) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
221 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
222 |
ui.progress(_("comparing with other"), None) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
223 |
result = dag.headsetofconnecteds(common) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
224 |
ui.debug("%d total queries\n" % roundtrips) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
225 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
226 |
if not result: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
227 |
return set([node.nullid]) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
228 |
return dag.externalizeall(result) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
229 |
|
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
230 |
def findmissingrange(ui, local, remote, probeset, |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
231 |
initialsamplesize=100, |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
232 |
fullsamplesize=200): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
233 |
missing = set() |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
234 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
235 |
heads = local.revs('heads(%ld)', probeset) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
236 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
237 |
# size of slice ? |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
238 |
heappop = heapq.heappop |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
239 |
heappush = heapq.heappush |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
240 |
heapify = heapq.heapify |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
241 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
242 |
tested = set() |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
243 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
244 |
sample = [] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
245 |
samplesize = initialsamplesize |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
246 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
247 |
def addentry(entry): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
248 |
if entry in tested: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
249 |
return False |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
250 |
sample.append(entry) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
251 |
tested.add(entry) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
252 |
return True |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
253 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
254 |
for h in heads: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
255 |
entry = _range(local, h, 0) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
256 |
addentry(entry) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
257 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
258 |
querycount = 0 |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
259 |
ui.progress(_("comparing obsmarker with other"), querycount) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
260 |
overflow = [] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
261 |
while sample or overflow: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
262 |
if overflow: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
263 |
sample.extend(overflow) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
264 |
overflow = [] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
265 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
266 |
if samplesize < len(sample): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
267 |
# too much sample already |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
268 |
overflow = sample[samplesize:] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
269 |
sample = sample[:samplesize] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
270 |
elif len(sample) < samplesize: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
271 |
# we need more sample ! |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
272 |
needed = samplesize - len(sample) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
273 |
sliceme = [] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
274 |
heapify(sliceme) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
275 |
for entry in sample: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
276 |
if 1 < len(entry): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
277 |
heappush(sliceme, (-len(entry), entry)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
278 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
279 |
while sliceme and 0 < needed: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
280 |
_key, target = heappop(sliceme) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
281 |
for new in target.subranges(): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
282 |
# XXX we could record hierarchy to optimise drop |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
283 |
if addentry(entry): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
284 |
if 1 < len(entry): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
285 |
heappush(sliceme, (-len(entry), entry)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
286 |
needed -= 1 |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
287 |
if needed <= 0: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
288 |
break |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
289 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
290 |
# no longer the first interation |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
291 |
samplesize = fullsamplesize |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
292 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
293 |
nbsample = len(sample) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
294 |
maxsize = max([len(r) for r in sample]) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
295 |
ui.debug("query %i; sample size is %i, largest range %i\n" |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
296 |
% (querycount, maxsize, nbsample)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
297 |
nbreplies = 0 |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
298 |
replies = list(_queryrange(ui, local, remote, sample)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
299 |
sample = [] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
300 |
for entry, remotehash in replies: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
301 |
nbreplies += 1 |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
302 |
if remotehash == entry.obshash: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
303 |
continue |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
304 |
elif 1 == len(entry): |
2085
6d61c5ed3bfa
obsdiscovery: simply some of the missing computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2084
diff
changeset
|
305 |
missing.add(entry.node) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
306 |
else: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
307 |
for new in entry.subranges(): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
308 |
addentry(new) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
309 |
assert nbsample == nbreplies |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
310 |
querycount += 1 |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
311 |
ui.progress(_("comparing obsmarker with other"), querycount) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
312 |
ui.progress(_("comparing obsmarker with other"), None) |
2085
6d61c5ed3bfa
obsdiscovery: simply some of the missing computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2084
diff
changeset
|
313 |
return sorted(missing) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
314 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
315 |
def _queryrange(ui, repo, remote, allentries): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
316 |
mapping = {} |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
317 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
318 |
def gen(): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
319 |
for entry in allentries: |
2091
fcb8db796576
stablerange: reuse node calculation as much as possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2090
diff
changeset
|
320 |
key = entry.node + _pack('>I', entry.index) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
321 |
mapping[key] = entry |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
322 |
yield key |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
323 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
324 |
bundler = bundle2.bundle20(ui, bundle2.bundle2caps(remote)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
325 |
capsblob = bundle2.encodecaps(bundle2.getrepocaps(repo)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
326 |
bundler.newpart('replycaps', data=capsblob) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
327 |
bundler.newpart('_evoexp_obsrangehash_0', data=gen()) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
328 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
329 |
stream = util.chunkbuffer(bundler.getchunks()) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
330 |
try: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
331 |
reply = remote.unbundle( |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
332 |
stream, ['force'], remote.url()) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
333 |
except error.BundleValueError as exc: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
334 |
raise error.Abort(_('missing support for %s') % exc) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
335 |
try: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
336 |
op = bundle2.processbundle(repo, reply) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
337 |
except error.BundleValueError as exc: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
338 |
raise error.Abort(_('missing support for %s') % exc) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
339 |
except bundle2.AbortFromPart as exc: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
340 |
ui.status(_('remote: %s\n') % exc) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
341 |
if exc.hint is not None: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
342 |
ui.status(_('remote: %s\n') % ('(%s)' % exc.hint)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
343 |
raise error.Abort(_('push failed on remote')) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
344 |
for rep in op.records['_evoexp_obsrangehash_0']: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
345 |
yield mapping[rep['key']], rep['value'] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
346 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
347 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
348 |
@bundle2.parthandler('_evoexp_obsrangehash_0', ()) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
349 |
def _processqueryrange(op, inpart): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
350 |
assert op.reply is not None |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
351 |
replies = [] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
352 |
data = inpart.read(24) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
353 |
while data: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
354 |
n = data[:20] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
355 |
index = _unpack('>I', data[20:])[0] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
356 |
r = op.repo.changelog.rev(n) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
357 |
rhash = _range(op.repo, r, index).obshash |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
358 |
replies.append(data + rhash) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
359 |
data = inpart.read(24) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
360 |
op.reply.newpart('reply:_evoexp_obsrangehash_0', data=iter(replies)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
361 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
362 |
|
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
363 |
@bundle2.parthandler('reply:_evoexp_obsrangehash_0', ()) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
364 |
def _processqueryrangereply(op, inpart): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
365 |
data = inpart.read(44) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
366 |
while data: |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
367 |
key = data[:24] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
368 |
rhash = data[24:] |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
369 |
op.records.add('_evoexp_obsrangehash_0', {'key': key, 'value': rhash}) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
370 |
data = inpart.read(44) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
371 |
|
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
372 |
################################## |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
373 |
### Stable topological sorting ### |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
374 |
################################## |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
375 |
@eh.command( |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
376 |
'debugstablesort', |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
377 |
[ |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
378 |
('', 'rev', [], 'heads to start from'), |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
379 |
] + commands.formatteropts, |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
380 |
_('')) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
381 |
def debugstablesort(ui, repo, **opts): |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
382 |
"""display the ::REVS set topologically sorted in a stable way |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
383 |
""" |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
384 |
revs = scmutil.revrange(repo, opts['rev']) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
385 |
displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
386 |
for r in _stablesort(repo, revs): |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
387 |
ctx = repo[r] |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
388 |
displayer.show(ctx) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
389 |
displayer.flush(ctx) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
390 |
displayer.close() |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
391 |
|
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
392 |
def _stablesort(repo, revs): |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
393 |
"""return '::revs' topologically sorted in "stable" order |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
394 |
|
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
395 |
This is a depth first traversal starting from 'nullrev', using node as a |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
396 |
tie breaker. |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
397 |
""" |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
398 |
# Various notes: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
399 |
# |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
400 |
# * Bitbucket is used dates as tie breaker, that might be a good idea. |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
401 |
# |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
402 |
# * It seemds we can traverse in the same order from (one) head to bottom, |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
403 |
# if we the following record data for each merge: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
404 |
# |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
405 |
# - highest (stablesort-wise) common ancestors, |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
406 |
# - order of parents (tablesort-wise) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
407 |
cl = repo.changelog |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
408 |
parents = cl.parentrevs |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
409 |
nullrev = node.nullrev |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
410 |
n = cl.node |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
411 |
# step 1: We need a parents -> children mapping for 2 reasons. |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
412 |
# |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
413 |
# * we build the order from nullrev to tip |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
414 |
# |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
415 |
# * we need to detect branching |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
416 |
children = collections.defaultdict(list) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
417 |
for r in cl.ancestors(revs, inclusive=True): |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
418 |
p1, p2 = parents(r) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
419 |
children[p1].append(r) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
420 |
if p2 != nullrev: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
421 |
children[p2].append(r) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
422 |
# step two: walk back up |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
423 |
# * pick lowest node in case of branching |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
424 |
# * stack disregarded part of the branching |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
425 |
# * process merge when both parents are yielded |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
426 |
|
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
427 |
# track what changeset has been |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
428 |
seen = [0] * (max(revs) + 2) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
429 |
seen[-1] = True # nullrev is known |
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
430 |
# starts from repository roots |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
431 |
# reuse the list form the mapping as we won't need it again anyway |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
432 |
stack = children[nullrev] |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
433 |
if not stack: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
434 |
return [] |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
435 |
if 1 < len(stack): |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
436 |
stack.sort(key=n, reverse=True) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
437 |
|
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
438 |
# list of rev, maybe we should yield, but since we built a children mapping we are 'O(N)' already |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
439 |
result = [] |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
440 |
|
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
441 |
current = stack.pop() |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
442 |
while current is not None or stack: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
443 |
if current is None: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
444 |
# previous iteration reached a merge or an unready merge, |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
445 |
current = stack.pop() |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
446 |
if seen[current]: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
447 |
current = None |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
448 |
continue |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
449 |
p1, p2 = parents(current) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
450 |
if not (seen[p1] and seen[p2]): |
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
451 |
# we can't iterate on this merge yet because other child is not |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
452 |
# yielded yet (and we are topo sorting) we can discard it for now |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
453 |
# because it will be reached from the other child. |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
454 |
current = None |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
455 |
continue |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
456 |
assert not seen[current] |
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
457 |
seen[current] = True |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
458 |
result.append(current) # could be yield, cf earlier comment |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
459 |
cs = children[current] |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
460 |
if not cs: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
461 |
current = None |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
462 |
elif 1 == len(cs): |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
463 |
current = cs[0] |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
464 |
else: |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
465 |
cs.sort(key=n, reverse=True) |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
466 |
current = cs.pop() # proceed on smallest |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
467 |
stack.extend(cs) # stack the rest for later |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
468 |
assert len(result) == len(set(result)) |
2081
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
469 |
return result |
010a8af416a0
discovery: adds a function doing revnum independant sorting
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2076
diff
changeset
|
470 |
|
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
471 |
############################## |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
472 |
### Range Hash computation ### |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
473 |
############################## |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
474 |
|
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
475 |
@eh.command( |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
476 |
'debugstablerange', |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
477 |
[ |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
478 |
('', 'rev', [], 'heads to start from'), |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
479 |
], |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
480 |
_('')) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
481 |
def debugstablerange(ui, repo, **opts): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
482 |
"""display the ::REVS set topologically sorted in a stable way |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
483 |
""" |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
484 |
s = node.short |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
485 |
revs = scmutil.revrange(repo, opts['rev']) |
2087
0c2371542687
depth: update depth to code to reuse ancestors depth
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2086
diff
changeset
|
486 |
# prewarm depth cache |
0c2371542687
depth: update depth to code to reuse ancestors depth
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2086
diff
changeset
|
487 |
for r in repo.revs("::%ld", revs): |
0c2371542687
depth: update depth to code to reuse ancestors depth
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2086
diff
changeset
|
488 |
utility.depth(repo, r) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
489 |
toproceed = [_range(repo, r, 0, ) for r in revs] |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
490 |
ranges = set(toproceed) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
491 |
while toproceed: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
492 |
entry = toproceed.pop() |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
493 |
for r in entry.subranges(): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
494 |
if r not in ranges: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
495 |
ranges.add(r) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
496 |
toproceed.append(r) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
497 |
ranges = list(ranges) |
2091
fcb8db796576
stablerange: reuse node calculation as much as possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2090
diff
changeset
|
498 |
ranges.sort(key=lambda r: (-len(r), r.node)) |
2083
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
499 |
ui.status('rev node index size depth obshash\n') |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
500 |
for r in ranges: |
2091
fcb8db796576
stablerange: reuse node calculation as much as possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2090
diff
changeset
|
501 |
d = (r.head, s(r.node), r.index, len(r), r.depth, node.short(r.obshash)) |
2083
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
502 |
ui.status('%3d %s %5d %4d %5d %s\n' % d) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
503 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
504 |
def _hlp2(i): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
505 |
"""return highest power of two lower than 'i'""" |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
506 |
return 2 ** int(math.log(i - 1, 2)) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
507 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
508 |
class _range(object): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
509 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
510 |
def __init__(self, repo, head, index, revs=None): |
2089
338d5600376c
stablerange: operate on an unfiltered repository
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2087
diff
changeset
|
511 |
self._repo = repo.unfiltered() |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
512 |
self.head = head |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
513 |
self.index = index |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
514 |
if revs is not None: |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
515 |
assert len(revs) == len(self) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
516 |
self._revs = revs |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
517 |
assert index < self.depth, (head, index, self.depth, revs) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
518 |
|
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
519 |
def __repr__(self): |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
520 |
return '%s %d %d %s' % (node.short(self.node), self.depth, self.index, node.short(self.obshash)) |
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
521 |
|
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
522 |
def __hash__(self): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
523 |
return self._id |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
524 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
525 |
def __eq__(self, other): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
526 |
if type(self) != type(other): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
527 |
raise NotImplementedError() |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
528 |
return self.stablekey == other.stablekey |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
529 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
530 |
@util.propertycache |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
531 |
def _id(self): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
532 |
return hash(self.stablekey) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
533 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
534 |
@util.propertycache |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
535 |
def stablekey(self): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
536 |
return (self.node, self.index) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
537 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
538 |
@util.propertycache |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
539 |
def node(self): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
540 |
return self._repo.changelog.node(self.head) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
541 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
542 |
def __len__(self): |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
543 |
return self.depth - self.index |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
544 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
545 |
@util.propertycache |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
546 |
def depth(self): |
2086
28241509ff6f
obsdiscovery: extract a smarted depth in utility
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2085
diff
changeset
|
547 |
return utility.depth(self._repo, self.head) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
548 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
549 |
@util.propertycache |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
550 |
def _revs(self): |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
551 |
r = _stablesort(self._repo, [self.head])[self.index:] |
2087
0c2371542687
depth: update depth to code to reuse ancestors depth
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2086
diff
changeset
|
552 |
assert len(r) == len(self), (self.head, self.index, len(r), len(self)) |
2084
b1f029dcf573
discovery: implement some range based discovery
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2083
diff
changeset
|
553 |
return r |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
554 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
555 |
def _slicesat(self, globalindex): |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
556 |
localindex = globalindex - self.index |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
557 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
558 |
cl = self._repo.changelog |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
559 |
|
2092
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
560 |
result = [] |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
561 |
bottom = self._revs[:localindex] |
2092
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
562 |
top = _range(self._repo, self.head, globalindex, self._revs[localindex:]) |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
563 |
# |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
564 |
toprootdepth = utility.depth(self._repo, top._revs[0]) |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
565 |
if toprootdepth + len(top) == self.depth + 1: |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
566 |
bheads = [bottom[-1]] |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
567 |
else: |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
568 |
bheads = set(bottom) |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
569 |
parentrevs = cl.parentrevs |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
570 |
du = bheads.difference_update |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
571 |
for r in bottom: |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
572 |
du(parentrevs(r)) |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
573 |
# if len(bheads) == 1: |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
574 |
# assert 1 == len(self._repo.revs('roots(%ld)', top._revs)) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
575 |
if len(bheads) == 1: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
576 |
newhead = bottom[-1] |
2092
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
577 |
bottomdepth = utility.depth(self._repo, newhead) |
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
578 |
newstart = bottomdepth - len(bottom) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
579 |
result.append(_range(self._repo, newhead, newstart, bottom)) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
580 |
else: |
2092
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
581 |
# assert 1 < len(bheads), (toprootdepth, len(top), len(self)) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
582 |
cl = self._repo.changelog |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
583 |
for h in bheads: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
584 |
subset = cl.ancestors([h], inclusive=True) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
585 |
hrevs = [r for r in bottom if r in subset] |
2086
28241509ff6f
obsdiscovery: extract a smarted depth in utility
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2085
diff
changeset
|
586 |
start = utility.depth(self._repo, h) - len(hrevs) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
587 |
entry = _range(self._repo, h, start, [r for r in bottom if r in subset]) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
588 |
result.append(entry) |
2092
ed140544e7fd
stablerange: remove call to 'repo.revs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2091
diff
changeset
|
589 |
result.append(top) |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
590 |
return result |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
591 |
|
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
592 |
def subranges(self): |
2090
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
593 |
if not util.safehasattr(self._repo, '_subrangecache'): |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
594 |
self._repo._subrangecache = {} |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
595 |
cached = self._repo._subrangecache.get(self) |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
596 |
if cached is not None: |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
597 |
return cached |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
598 |
if len(self) == 1: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
599 |
return [] |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
600 |
step = _hlp2(self.depth) |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
601 |
standard_start = 0 |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
602 |
while standard_start < self.index and 0 < step: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
603 |
if standard_start + step < self.depth: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
604 |
standard_start += step |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
605 |
step //= 2 |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
606 |
if self.index == standard_start: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
607 |
slicesize = _hlp2(len(self)) |
2090
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
608 |
slicepoint = self.index + slicesize |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
609 |
else: |
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
610 |
assert standard_start < self.depth |
2090
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
611 |
slicepoint = standard_start |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
612 |
result = self._slicesat(slicepoint) |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
613 |
self._repo._subrangecache[self] = result |
622191719863
stablerange: adds some caching of the subranges
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2089
diff
changeset
|
614 |
return result |
2082
3f787182509f
discovery: introduce "stable slicing" methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2081
diff
changeset
|
615 |
|
2083
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
616 |
@util.propertycache |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
617 |
def obshash(self): |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
618 |
cache = self._repo.obsstore.rangeobshashcache |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
619 |
obshash = cache.get(self._id) |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
620 |
if obshash is not None: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
621 |
return obshash |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
622 |
sha = hashlib.sha1() |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
623 |
count = 0 |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
624 |
if len(self) == 1: |
2091
fcb8db796576
stablerange: reuse node calculation as much as possible
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2090
diff
changeset
|
625 |
tmarkers = self._repo.obsstore.relevantmarkers([self.node]) |
2083
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
626 |
bmarkers = [] |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
627 |
for m in tmarkers: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
628 |
mbin = obsolete._fm1encodeonemarker(m) |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
629 |
bmarkers.append(mbin) |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
630 |
bmarkers.sort() |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
631 |
for m in bmarkers: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
632 |
count += 1 |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
633 |
sha.update(m) |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
634 |
else: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
635 |
for subrange in self.subranges(): |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
636 |
obshash = subrange.obshash |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
637 |
if obshash != node.nullid: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
638 |
count += 1 |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
639 |
sha.update(obshash) |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
640 |
|
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
641 |
# note: if there is only one subrange with actual data, we'll just |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
642 |
# reuse the same hash. |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
643 |
if not count: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
644 |
obshash = node.nullid |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
645 |
elif count != 1 or obshash is None: |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
646 |
obshash = cache[self._id] = sha.digest() |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
647 |
return obshash |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
648 |
|
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
649 |
@eh.wrapfunction(obsolete.obsstore, '_addmarkers') |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
650 |
def _addmarkers(orig, obsstore, *args, **kwargs): |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
651 |
obsstore.rangeobshashcache.clear() |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
652 |
return orig(obsstore, *args, **kwargs) |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
653 |
|
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
654 |
@eh.addattr(obsolete.obsstore, 'rangeobshashcache') |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
655 |
@util.propertycache |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
656 |
def rangeobshashcache(obsstore): |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
657 |
return {} |
778afb036245
discovery: introduce a official 'obshash associated to a range
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2082
diff
changeset
|
658 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
659 |
############################# |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
660 |
### Tree Hash computation ### |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
661 |
############################# |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
662 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
663 |
# Dash computed from a given changesets using all markers relevant to it and |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
664 |
# the obshash of its parents. This is similar to what happend for changeset |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
665 |
# node where the parent is used in the computation |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
666 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
667 |
@eh.command( |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
668 |
'debugobsrelsethashtree', |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
669 |
[('', 'v0', None, 'hash on marker format "0"'), |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
670 |
('', 'v1', None, 'hash on marker format "1" (default)')], _('')) |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
671 |
def debugobsrelsethashtree(ui, repo, v0=False, v1=False): |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
672 |
"""display Obsolete markers, Relevant Set, Hash Tree |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
673 |
changeset-node obsrelsethashtree-node |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
674 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
675 |
It computed form the "orsht" of its parent and markers |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
676 |
relevant to the changeset itself.""" |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
677 |
if v0 and v1: |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
678 |
raise error.Abort('cannot only specify one format') |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
679 |
elif v0: |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
680 |
treefunc = _obsrelsethashtreefm0 |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
681 |
else: |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
682 |
treefunc = _obsrelsethashtreefm1 |
2054
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
683 |
|
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
684 |
for chg, obs in treefunc(repo): |
f9d65d24b9f9
discovery: split discovery related code in 'obsdiscovery'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
685 |
ui.status('%s %s\n' % (node.hex(chg), node.hex(obs))) |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
686 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
687 |
def _obsrelsethashtreefm0(repo): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
688 |
return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
689 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
690 |
def _obsrelsethashtreefm1(repo): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
691 |
return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
692 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
693 |
def _obsrelsethashtree(repo, encodeonemarker): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
694 |
cache = [] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
695 |
unfi = repo.unfiltered() |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
696 |
markercache = {} |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
697 |
repo.ui.progress(_("preparing locally"), 0, total=len(unfi)) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
698 |
for i in unfi: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
699 |
ctx = unfi[i] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
700 |
entry = 0 |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
701 |
sha = hashlib.sha1() |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
702 |
# add data from p1 |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
703 |
for p in ctx.parents(): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
704 |
p = p.rev() |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
705 |
if p < 0: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
706 |
p = node.nullid |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
707 |
else: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
708 |
p = cache[p][1] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
709 |
if p != node.nullid: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
710 |
entry += 1 |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
711 |
sha.update(p) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
712 |
tmarkers = repo.obsstore.relevantmarkers([ctx.node()]) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
713 |
if tmarkers: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
714 |
bmarkers = [] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
715 |
for m in tmarkers: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
716 |
if m not in markercache: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
717 |
markercache[m] = encodeonemarker(m) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
718 |
bmarkers.append(markercache[m]) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
719 |
bmarkers.sort() |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
720 |
for m in bmarkers: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
721 |
entry += 1 |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
722 |
sha.update(m) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
723 |
if entry: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
724 |
cache.append((ctx.node(), sha.digest())) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
725 |
else: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
726 |
cache.append((ctx.node(), node.nullid)) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
727 |
repo.ui.progress(_("preparing locally"), i, total=len(unfi)) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
728 |
repo.ui.progress(_("preparing locally"), None) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
729 |
return cache |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
730 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
731 |
def _obshash(repo, nodes, version=0): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
732 |
if version == 0: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
733 |
hashs = _obsrelsethashtreefm0(repo) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
734 |
elif version == 1: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
735 |
hashs = _obsrelsethashtreefm1(repo) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
736 |
else: |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
737 |
assert False |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
738 |
nm = repo.changelog.nodemap |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
739 |
revs = [nm.get(n) for n in nodes] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
740 |
return [r is None and node.nullid or hashs[r][1] for r in revs] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
741 |
|
2076
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
742 |
@eh.addattr(localrepo.localpeer, 'evoext_obshash') |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
743 |
def local_obshash(peer, nodes): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
744 |
return _obshash(peer._repo, nodes) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
745 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
746 |
@eh.addattr(localrepo.localpeer, 'evoext_obshash1') |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
747 |
def local_obshash1(peer, nodes): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
748 |
return _obshash(peer._repo, nodes, version=1) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
749 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
750 |
@eh.addattr(wireproto.wirepeer, 'evoext_obshash') |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
751 |
def peer_obshash(self, nodes): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
752 |
d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
753 |
try: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
754 |
return wireproto.decodelist(d) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
755 |
except ValueError: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
756 |
self._abort(error.ResponseError(_("unexpected response:"), d)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
757 |
|
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
758 |
@eh.addattr(wireproto.wirepeer, 'evoext_obshash1') |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
759 |
def peer_obshash1(self, nodes): |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
760 |
d = self._call("evoext_obshash1", nodes=wireproto.encodelist(nodes)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
761 |
try: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
762 |
return wireproto.decodelist(d) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
763 |
except ValueError: |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
764 |
self._abort(error.ResponseError(_("unexpected response:"), d)) |
5c6d05c34ba4
obsdiscovery: organize the code by category
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2075
diff
changeset
|
765 |
|
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
766 |
def srv_obshash(repo, proto, nodes): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
767 |
return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes))) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
768 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
769 |
def srv_obshash1(repo, proto, nodes): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
770 |
return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes), |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
771 |
version=1)) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
772 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
773 |
def _obshash_capabilities(orig, repo, proto): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
774 |
"""wrapper to advertise new capability""" |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
775 |
caps = orig(repo, proto) |
2075
a7c0685ba6d9
evolution: drop the old __temporary__.advertiseobsolete option
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2061
diff
changeset
|
776 |
if obsolete.isenabled(repo, obsolete.exchangeopt): |
2061
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
777 |
caps = caps.split() |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
778 |
caps.append('_evoext_obshash_0') |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
779 |
caps.append('_evoext_obshash_1') |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
780 |
caps.sort() |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
781 |
caps = ' '.join(caps) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
782 |
return caps |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
783 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
784 |
@eh.extsetup |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
785 |
def obshash_extsetup(ui): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
786 |
hgweb_mod.perms['evoext_obshash'] = 'pull' |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
787 |
hgweb_mod.perms['evoext_obshash1'] = 'pull' |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
788 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
789 |
wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes') |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
790 |
wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes') |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
791 |
extensions.wrapfunction(wireproto, 'capabilities', _obshash_capabilities) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
792 |
# wrap command content |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
793 |
oldcap, args = wireproto.commands['capabilities'] |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
794 |
|
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
795 |
def newcap(repo, proto): |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
796 |
return _obshash_capabilities(oldcap, repo, proto) |
302aa8bbb3af
exchange: dispatch all code in 'serveronly' to the appropriate submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2054
diff
changeset
|
797 |
wireproto.commands['capabilities'] = (newcap, args) |