Mercurial > hg
comparison mercurial/setdiscovery.py @ 39168:2d218db7389b
setdiscovery: reflect use of revs instead of nodes
This code all operates on revision numbers. Update variable names
and comments accordingly.
Differential Revision: https://phab.mercurial-scm.org/D4316
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Fri, 17 Aug 2018 17:21:11 +0000 |
parents | 484c9fe570a7 |
children | 140992750187 |
comparison
equal
deleted
inserted
replaced
39167:136ed75bbe12 | 39168:2d218db7389b |
---|---|
54 dagutil, | 54 dagutil, |
55 error, | 55 error, |
56 util, | 56 util, |
57 ) | 57 ) |
58 | 58 |
59 def _updatesample(dag, nodes, sample, quicksamplesize=0): | 59 def _updatesample(dag, revs, sample, quicksamplesize=0): |
60 """update an existing sample to match the expected size | 60 """update an existing sample to match the expected size |
61 | 61 |
62 The sample is updated with nodes exponentially distant from each head of the | 62 The sample is updated with revs exponentially distant from each head of the |
63 <nodes> set. (H~1, H~2, H~4, H~8, etc). | 63 <revs> set. (H~1, H~2, H~4, H~8, etc). |
64 | 64 |
65 If a target size is specified, the sampling will stop once this size is | 65 If a target size is specified, the sampling will stop once this size is |
66 reached. Otherwise sampling will happen until roots of the <nodes> set are | 66 reached. Otherwise sampling will happen until roots of the <revs> set are |
67 reached. | 67 reached. |
68 | 68 |
69 :dag: a dag object from dagutil | 69 :dag: a dag object from dagutil |
70 :nodes: set of nodes we want to discover (if None, assume the whole dag) | 70 :revs: set of revs we want to discover (if None, assume the whole dag) |
71 :sample: a sample to update | 71 :sample: a sample to update |
72 :quicksamplesize: optional target size of the sample""" | 72 :quicksamplesize: optional target size of the sample""" |
73 # if nodes is empty we scan the entire graph | 73 # if revs is empty we scan the entire graph |
74 if nodes: | 74 if revs: |
75 heads = dag.headsetofconnecteds(nodes) | 75 heads = dag.headsetofconnecteds(revs) |
76 else: | 76 else: |
77 heads = dag.heads() | 77 heads = dag.heads() |
78 dist = {} | 78 dist = {} |
79 visit = collections.deque(heads) | 79 visit = collections.deque(heads) |
80 seen = set() | 80 seen = set() |
90 sample.add(curr) | 90 sample.add(curr) |
91 if quicksamplesize and (len(sample) >= quicksamplesize): | 91 if quicksamplesize and (len(sample) >= quicksamplesize): |
92 return | 92 return |
93 seen.add(curr) | 93 seen.add(curr) |
94 for p in dag.parents(curr): | 94 for p in dag.parents(curr): |
95 if not nodes or p in nodes: | 95 if not revs or p in revs: |
96 dist.setdefault(p, d + 1) | 96 dist.setdefault(p, d + 1) |
97 visit.append(p) | 97 visit.append(p) |
98 | 98 |
99 def _takequicksample(dag, nodes, size): | 99 def _takequicksample(dag, revs, size): |
100 """takes a quick sample of size <size> | 100 """takes a quick sample of size <size> |
101 | 101 |
102 It is meant for initial sampling and focuses on querying heads and close | 102 It is meant for initial sampling and focuses on querying heads and close |
103 ancestors of heads. | 103 ancestors of heads. |
104 | 104 |
105 :dag: a dag object | 105 :dag: a dag object |
106 :nodes: set of nodes to discover | 106 :revs: set of revs to discover |
107 :size: the maximum size of the sample""" | 107 :size: the maximum size of the sample""" |
108 sample = dag.headsetofconnecteds(nodes) | 108 sample = dag.headsetofconnecteds(revs) |
109 if len(sample) >= size: | 109 if len(sample) >= size: |
110 return _limitsample(sample, size) | 110 return _limitsample(sample, size) |
111 _updatesample(dag, None, sample, quicksamplesize=size) | 111 _updatesample(dag, None, sample, quicksamplesize=size) |
112 return sample | 112 return sample |
113 | 113 |
114 def _takefullsample(dag, nodes, size): | 114 def _takefullsample(dag, revs, size): |
115 sample = dag.headsetofconnecteds(nodes) | 115 sample = dag.headsetofconnecteds(revs) |
116 # update from heads | 116 # update from heads |
117 _updatesample(dag, nodes, sample) | 117 _updatesample(dag, revs, sample) |
118 # update from roots | 118 # update from roots |
119 _updatesample(dag.inverse(), nodes, sample) | 119 _updatesample(dag.inverse(), revs, sample) |
120 assert sample | 120 assert sample |
121 sample = _limitsample(sample, size) | 121 sample = _limitsample(sample, size) |
122 if len(sample) < size: | 122 if len(sample) < size: |
123 more = size - len(sample) | 123 more = size - len(sample) |
124 sample.update(random.sample(list(nodes - sample), more)) | 124 sample.update(random.sample(list(revs - sample), more)) |
125 return sample | 125 return sample |
126 | 126 |
127 def _limitsample(sample, desiredlen): | 127 def _limitsample(sample, desiredlen): |
128 """return a random subset of sample of at most desiredlen item""" | 128 """return a random subset of sample of at most desiredlen item""" |
129 if len(sample) > desiredlen: | 129 if len(sample) > desiredlen: |