Show More
@@ -11,10 +11,7 b' import errno' | |||
|
11 | 11 | import struct |
|
12 | 12 | |
|
13 | 13 | from mercurial.i18n import _ |
|
14 |
from mercurial.node import |
|
|
15 | bin, | |
|
16 | nullid, | |
|
17 | ) | |
|
14 | from mercurial.node import nullid | |
|
18 | 15 | from mercurial import ( |
|
19 | 16 | bundle2, |
|
20 | 17 | changegroup, |
@@ -65,42 +62,24 b' def getbundlechangegrouppart_narrow(' | |||
|
65 | 62 | raise ValueError(_(b'no common changegroup version')) |
|
66 | 63 | version = max(cgversions) |
|
67 | 64 | |
|
68 |
|
|
|
69 |
|
|
|
70 | newinclude = sorted(filter(bool, kwargs.get(r'includepats', []))) | |
|
71 | newexclude = sorted(filter(bool, kwargs.get(r'excludepats', []))) | |
|
72 | known = {bin(n) for n in kwargs.get(r'known', [])} | |
|
65 | include = sorted(filter(bool, kwargs.get(r'includepats', []))) | |
|
66 | exclude = sorted(filter(bool, kwargs.get(r'excludepats', []))) | |
|
73 | 67 | generateellipsesbundle2( |
|
74 | 68 | bundler, |
|
75 | 69 | repo, |
|
76 |
|
|
|
77 |
|
|
|
78 | newinclude, | |
|
79 | newexclude, | |
|
70 | include, | |
|
71 | exclude, | |
|
80 | 72 | version, |
|
81 | 73 | common, |
|
82 | 74 | heads, |
|
83 | known, | |
|
84 | 75 | kwargs.get(r'depth', None), |
|
85 | 76 | ) |
|
86 | 77 | |
|
87 | 78 | |
|
88 | 79 | def generateellipsesbundle2( |
|
89 | bundler, | |
|
90 | repo, | |
|
91 | oldinclude, | |
|
92 | oldexclude, | |
|
93 | newinclude, | |
|
94 | newexclude, | |
|
95 | version, | |
|
96 | common, | |
|
97 | heads, | |
|
98 | known, | |
|
99 | depth, | |
|
80 | bundler, repo, include, exclude, version, common, heads, depth, | |
|
100 | 81 | ): |
|
101 | newmatch = narrowspec.match( | |
|
102 | repo.root, include=newinclude, exclude=newexclude | |
|
103 | ) | |
|
82 | match = narrowspec.match(repo.root, include=include, exclude=exclude) | |
|
104 | 83 | if depth is not None: |
|
105 | 84 | depth = int(depth) |
|
106 | 85 | if depth < 1: |
@@ -108,61 +87,9 b' def generateellipsesbundle2(' | |||
|
108 | 87 | |
|
109 | 88 | heads = set(heads or repo.heads()) |
|
110 | 89 | common = set(common or [nullid]) |
|
111 | if known and (oldinclude != newinclude or oldexclude != newexclude): | |
|
112 | # Steps: | |
|
113 | # 1. Send kill for "$known & ::common" | |
|
114 | # | |
|
115 | # 2. Send changegroup for ::common | |
|
116 | # | |
|
117 | # 3. Proceed. | |
|
118 | # | |
|
119 | # In the future, we can send kills for only the specific | |
|
120 | # nodes we know should go away or change shape, and then | |
|
121 | # send a data stream that tells the client something like this: | |
|
122 | # | |
|
123 | # a) apply this changegroup | |
|
124 | # b) apply nodes XXX, YYY, ZZZ that you already have | |
|
125 | # c) goto a | |
|
126 | # | |
|
127 | # until they've built up the full new state. | |
|
128 | # Convert to revnums and intersect with "common". The client should | |
|
129 | # have made it a subset of "common" already, but let's be safe. | |
|
130 | known = set(repo.revs(b"%ln & ::%ln", known, common)) | |
|
131 | # TODO: we could send only roots() of this set, and the | |
|
132 | # list of nodes in common, and the client could work out | |
|
133 | # what to strip, instead of us explicitly sending every | |
|
134 | # single node. | |
|
135 | deadrevs = known | |
|
136 | ||
|
137 | def genkills(): | |
|
138 | for r in deadrevs: | |
|
139 | yield _KILLNODESIGNAL | |
|
140 | yield repo.changelog.node(r) | |
|
141 | yield _DONESIGNAL | |
|
142 | ||
|
143 | bundler.newpart(_CHANGESPECPART, data=genkills()) | |
|
144 | newvisit, newfull, newellipsis = exchange._computeellipsis( | |
|
145 | repo, set(), common, known, newmatch | |
|
146 | ) | |
|
147 | if newvisit: | |
|
148 | packer = changegroup.getbundler( | |
|
149 | version, | |
|
150 | repo, | |
|
151 | matcher=newmatch, | |
|
152 | ellipses=True, | |
|
153 | shallow=depth is not None, | |
|
154 | ellipsisroots=newellipsis, | |
|
155 | fullnodes=newfull, | |
|
156 | ) | |
|
157 | cgdata = packer.generate(common, newvisit, False, b'narrow_widen') | |
|
158 | ||
|
159 | part = bundler.newpart(b'changegroup', data=cgdata) | |
|
160 | part.addparam(b'version', version) | |
|
161 | if b'treemanifest' in repo.requirements: | |
|
162 | part.addparam(b'treemanifest', b'1') | |
|
163 | 90 | |
|
164 | 91 | visitnodes, relevant_nodes, ellipsisroots = exchange._computeellipsis( |
|
165 |
repo, common, heads, set(), |
|
|
92 | repo, common, heads, set(), match, depth=depth | |
|
166 | 93 | ) |
|
167 | 94 | |
|
168 | 95 | repo.ui.debug(b'Found %d relevant revs\n' % len(relevant_nodes)) |
@@ -170,7 +97,7 b' def generateellipsesbundle2(' | |||
|
170 | 97 | packer = changegroup.getbundler( |
|
171 | 98 | version, |
|
172 | 99 | repo, |
|
173 |
matcher= |
|
|
100 | matcher=match, | |
|
174 | 101 | ellipses=True, |
|
175 | 102 | shallow=depth is not None, |
|
176 | 103 | ellipsisroots=ellipsisroots, |
General Comments 0
You need to be logged in to leave comments.
Login now