Show More
@@ -199,23 +199,36 b' class cg1unpacker(object):' | |||||
199 | network API. To do so, it parse the changegroup data, otherwise it will |
|
199 | network API. To do so, it parse the changegroup data, otherwise it will | |
200 | block in case of sshrepo because it don't know the end of the stream. |
|
200 | block in case of sshrepo because it don't know the end of the stream. | |
201 | """ |
|
201 | """ | |
202 | # an empty chunkgroup is the end of the changegroup |
|
202 | # For changegroup 1 and 2, we expect 3 parts: changelog, manifestlog, | |
203 | # a changegroup has at least 2 chunkgroups (changelog and manifest). |
|
203 | # and a list of filelogs. For changegroup 3, we expect 4 parts: | |
204 | # after that, changegroup versions 1 and 2 have a series of groups |
|
204 | # changelog, manifestlog, a list of tree manifestlogs, and a list of | |
205 | # with one group per file. changegroup 3 has a series of directory |
|
205 | # filelogs. | |
206 | # manifests before the files. |
|
206 | # | |
207 | count = 0 |
|
207 | # Changelog and manifestlog parts are terminated with empty chunks. The | |
208 | emptycount = 0 |
|
208 | # tree and file parts are a list of entry sections. Each entry section | |
209 | while emptycount < self._grouplistcount: |
|
209 | # is a series of chunks terminating in an empty chunk. The list of these | |
210 | empty = True |
|
210 | # entry sections is terminated in yet another empty chunk, so we know | |
211 | count += 1 |
|
211 | # we've reached the end of the tree/file list when we reach an empty | |
|
212 | # chunk that was proceeded by no non-empty chunks. | |||
|
213 | ||||
|
214 | parts = 0 | |||
|
215 | while parts < 2 + self._grouplistcount: | |||
|
216 | noentries = True | |||
212 | while True: |
|
217 | while True: | |
213 | chunk = getchunk(self) |
|
218 | chunk = getchunk(self) | |
214 | if not chunk: |
|
219 | if not chunk: | |
215 | if empty and count > 2: |
|
220 | # The first two empty chunks represent the end of the | |
216 | emptycount += 1 |
|
221 | # changelog and the manifestlog portions. The remaining | |
|
222 | # empty chunks represent either A) the end of individual | |||
|
223 | # tree or file entries in the file list, or B) the end of | |||
|
224 | # the entire list. It's the end of the entire list if there | |||
|
225 | # were no entries (i.e. noentries is True). | |||
|
226 | if parts < 2: | |||
|
227 | parts += 1 | |||
|
228 | elif noentries: | |||
|
229 | parts += 1 | |||
217 | break |
|
230 | break | |
218 |
|
|
231 | noentries = False | |
219 | yield chunkheader(len(chunk)) |
|
232 | yield chunkheader(len(chunk)) | |
220 | pos = 0 |
|
233 | pos = 0 | |
221 | while pos < len(chunk): |
|
234 | while pos < len(chunk): |
General Comments 0
You need to be logged in to leave comments.
Login now