Mercurial > hg
comparison hgext/convert/hg.py @ 43077:687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Done with
python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py')
black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**')
# skip-blame mass-reformatting only
Differential Revision: https://phab.mercurial-scm.org/D6972
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:48:39 -0400 |
parents | 2372284d9457 |
children | eef9a2d67051 |
comparison
equal
deleted
inserted
replaced
43076:2372284d9457 | 43077:687b865b95ad |
---|---|
49 | 49 |
50 | 50 |
51 class mercurial_sink(common.converter_sink): | 51 class mercurial_sink(common.converter_sink): |
52 def __init__(self, ui, repotype, path): | 52 def __init__(self, ui, repotype, path): |
53 common.converter_sink.__init__(self, ui, repotype, path) | 53 common.converter_sink.__init__(self, ui, repotype, path) |
54 self.branchnames = ui.configbool('convert', 'hg.usebranchnames') | 54 self.branchnames = ui.configbool(b'convert', b'hg.usebranchnames') |
55 self.clonebranches = ui.configbool('convert', 'hg.clonebranches') | 55 self.clonebranches = ui.configbool(b'convert', b'hg.clonebranches') |
56 self.tagsbranch = ui.config('convert', 'hg.tagsbranch') | 56 self.tagsbranch = ui.config(b'convert', b'hg.tagsbranch') |
57 self.lastbranch = None | 57 self.lastbranch = None |
58 if os.path.isdir(path) and len(os.listdir(path)) > 0: | 58 if os.path.isdir(path) and len(os.listdir(path)) > 0: |
59 try: | 59 try: |
60 self.repo = hg.repository(self.ui, path) | 60 self.repo = hg.repository(self.ui, path) |
61 if not self.repo.local(): | 61 if not self.repo.local(): |
62 raise NoRepo( | 62 raise NoRepo( |
63 _('%s is not a local Mercurial repository') % path | 63 _(b'%s is not a local Mercurial repository') % path |
64 ) | 64 ) |
65 except error.RepoError as err: | 65 except error.RepoError as err: |
66 ui.traceback() | 66 ui.traceback() |
67 raise NoRepo(err.args[0]) | 67 raise NoRepo(err.args[0]) |
68 else: | 68 else: |
69 try: | 69 try: |
70 ui.status(_('initializing destination %s repository\n') % path) | 70 ui.status(_(b'initializing destination %s repository\n') % path) |
71 self.repo = hg.repository(self.ui, path, create=True) | 71 self.repo = hg.repository(self.ui, path, create=True) |
72 if not self.repo.local(): | 72 if not self.repo.local(): |
73 raise NoRepo( | 73 raise NoRepo( |
74 _('%s is not a local Mercurial repository') % path | 74 _(b'%s is not a local Mercurial repository') % path |
75 ) | 75 ) |
76 self.created.append(path) | 76 self.created.append(path) |
77 except error.RepoError: | 77 except error.RepoError: |
78 ui.traceback() | 78 ui.traceback() |
79 raise NoRepo( | 79 raise NoRepo( |
80 _("could not create hg repository %s as sink") % path | 80 _(b"could not create hg repository %s as sink") % path |
81 ) | 81 ) |
82 self.lock = None | 82 self.lock = None |
83 self.wlock = None | 83 self.wlock = None |
84 self.filemapmode = False | 84 self.filemapmode = False |
85 self.subrevmaps = {} | 85 self.subrevmaps = {} |
86 | 86 |
87 def before(self): | 87 def before(self): |
88 self.ui.debug('run hg sink pre-conversion action\n') | 88 self.ui.debug(b'run hg sink pre-conversion action\n') |
89 self.wlock = self.repo.wlock() | 89 self.wlock = self.repo.wlock() |
90 self.lock = self.repo.lock() | 90 self.lock = self.repo.lock() |
91 | 91 |
92 def after(self): | 92 def after(self): |
93 self.ui.debug('run hg sink post-conversion action\n') | 93 self.ui.debug(b'run hg sink post-conversion action\n') |
94 if self.lock: | 94 if self.lock: |
95 self.lock.release() | 95 self.lock.release() |
96 if self.wlock: | 96 if self.wlock: |
97 self.wlock.release() | 97 self.wlock.release() |
98 | 98 |
99 def revmapfile(self): | 99 def revmapfile(self): |
100 return self.repo.vfs.join("shamap") | 100 return self.repo.vfs.join(b"shamap") |
101 | 101 |
102 def authorfile(self): | 102 def authorfile(self): |
103 return self.repo.vfs.join("authormap") | 103 return self.repo.vfs.join(b"authormap") |
104 | 104 |
105 def setbranch(self, branch, pbranches): | 105 def setbranch(self, branch, pbranches): |
106 if not self.clonebranches: | 106 if not self.clonebranches: |
107 return | 107 return |
108 | 108 |
109 setbranch = branch != self.lastbranch | 109 setbranch = branch != self.lastbranch |
110 self.lastbranch = branch | 110 self.lastbranch = branch |
111 if not branch: | 111 if not branch: |
112 branch = 'default' | 112 branch = b'default' |
113 pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches] | 113 pbranches = [(b[0], b[1] and b[1] or b'default') for b in pbranches] |
114 | 114 |
115 branchpath = os.path.join(self.path, branch) | 115 branchpath = os.path.join(self.path, branch) |
116 if setbranch: | 116 if setbranch: |
117 self.after() | 117 self.after() |
118 try: | 118 try: |
133 if missings: | 133 if missings: |
134 self.after() | 134 self.after() |
135 for pbranch, heads in sorted(missings.iteritems()): | 135 for pbranch, heads in sorted(missings.iteritems()): |
136 pbranchpath = os.path.join(self.path, pbranch) | 136 pbranchpath = os.path.join(self.path, pbranch) |
137 prepo = hg.peer(self.ui, {}, pbranchpath) | 137 prepo = hg.peer(self.ui, {}, pbranchpath) |
138 self.ui.note(_('pulling from %s into %s\n') % (pbranch, branch)) | 138 self.ui.note( |
139 _(b'pulling from %s into %s\n') % (pbranch, branch) | |
140 ) | |
139 exchange.pull( | 141 exchange.pull( |
140 self.repo, prepo, [prepo.lookup(h) for h in heads] | 142 self.repo, prepo, [prepo.lookup(h) for h in heads] |
141 ) | 143 ) |
142 self.before() | 144 self.before() |
143 | 145 |
144 def _rewritetags(self, source, revmap, data): | 146 def _rewritetags(self, source, revmap, data): |
145 fp = stringio() | 147 fp = stringio() |
146 for line in data.splitlines(): | 148 for line in data.splitlines(): |
147 s = line.split(' ', 1) | 149 s = line.split(b' ', 1) |
148 if len(s) != 2: | 150 if len(s) != 2: |
149 self.ui.warn(_('invalid tag entry: "%s"\n') % line) | 151 self.ui.warn(_(b'invalid tag entry: "%s"\n') % line) |
150 fp.write('%s\n' % line) # Bogus, but keep for hash stability | 152 fp.write(b'%s\n' % line) # Bogus, but keep for hash stability |
151 continue | 153 continue |
152 revid = revmap.get(source.lookuprev(s[0])) | 154 revid = revmap.get(source.lookuprev(s[0])) |
153 if not revid: | 155 if not revid: |
154 if s[0] == nodemod.nullhex: | 156 if s[0] == nodemod.nullhex: |
155 revid = s[0] | 157 revid = s[0] |
156 else: | 158 else: |
157 # missing, but keep for hash stability | 159 # missing, but keep for hash stability |
158 self.ui.warn(_('missing tag entry: "%s"\n') % line) | 160 self.ui.warn(_(b'missing tag entry: "%s"\n') % line) |
159 fp.write('%s\n' % line) | 161 fp.write(b'%s\n' % line) |
160 continue | 162 continue |
161 fp.write('%s %s\n' % (revid, s[1])) | 163 fp.write(b'%s %s\n' % (revid, s[1])) |
162 return fp.getvalue() | 164 return fp.getvalue() |
163 | 165 |
164 def _rewritesubstate(self, source, data): | 166 def _rewritesubstate(self, source, data): |
165 fp = stringio() | 167 fp = stringio() |
166 for line in data.splitlines(): | 168 for line in data.splitlines(): |
167 s = line.split(' ', 1) | 169 s = line.split(b' ', 1) |
168 if len(s) != 2: | 170 if len(s) != 2: |
169 continue | 171 continue |
170 | 172 |
171 revid = s[0] | 173 revid = s[0] |
172 subpath = s[1] | 174 subpath = s[1] |
173 if revid != nodemod.nullhex: | 175 if revid != nodemod.nullhex: |
174 revmap = self.subrevmaps.get(subpath) | 176 revmap = self.subrevmaps.get(subpath) |
175 if revmap is None: | 177 if revmap is None: |
176 revmap = mapfile( | 178 revmap = mapfile( |
177 self.ui, self.repo.wjoin(subpath, '.hg/shamap') | 179 self.ui, self.repo.wjoin(subpath, b'.hg/shamap') |
178 ) | 180 ) |
179 self.subrevmaps[subpath] = revmap | 181 self.subrevmaps[subpath] = revmap |
180 | 182 |
181 # It is reasonable that one or more of the subrepos don't | 183 # It is reasonable that one or more of the subrepos don't |
182 # need to be converted, in which case they can be cloned | 184 # need to be converted, in which case they can be cloned |
183 # into place instead of converted. Therefore, only warn | 185 # into place instead of converted. Therefore, only warn |
184 # once. | 186 # once. |
185 msg = _('no ".hgsubstate" updates will be made for "%s"\n') | 187 msg = _(b'no ".hgsubstate" updates will be made for "%s"\n') |
186 if len(revmap) == 0: | 188 if len(revmap) == 0: |
187 sub = self.repo.wvfs.reljoin(subpath, '.hg') | 189 sub = self.repo.wvfs.reljoin(subpath, b'.hg') |
188 | 190 |
189 if self.repo.wvfs.exists(sub): | 191 if self.repo.wvfs.exists(sub): |
190 self.ui.warn(msg % subpath) | 192 self.ui.warn(msg % subpath) |
191 | 193 |
192 newid = revmap.get(revid) | 194 newid = revmap.get(revid) |
193 if not newid: | 195 if not newid: |
194 if len(revmap) > 0: | 196 if len(revmap) > 0: |
195 self.ui.warn( | 197 self.ui.warn( |
196 _("%s is missing from %s/.hg/shamap\n") | 198 _(b"%s is missing from %s/.hg/shamap\n") |
197 % (revid, subpath) | 199 % (revid, subpath) |
198 ) | 200 ) |
199 else: | 201 else: |
200 revid = newid | 202 revid = newid |
201 | 203 |
202 fp.write('%s %s\n' % (revid, subpath)) | 204 fp.write(b'%s %s\n' % (revid, subpath)) |
203 | 205 |
204 return fp.getvalue() | 206 return fp.getvalue() |
205 | 207 |
206 def _calculatemergedfiles(self, source, p1ctx, p2ctx): | 208 def _calculatemergedfiles(self, source, p1ctx, p2ctx): |
207 """Calculates the files from p2 that we need to pull in when merging p1 | 209 """Calculates the files from p2 that we need to pull in when merging p1 |
230 # since it will be covered by the existing fileset. | 232 # since it will be covered by the existing fileset. |
231 continue | 233 continue |
232 | 234 |
233 # If the file requires actual merging, abort. We don't have enough | 235 # If the file requires actual merging, abort. We don't have enough |
234 # context to resolve merges correctly. | 236 # context to resolve merges correctly. |
235 if action in ['m', 'dm', 'cd', 'dc']: | 237 if action in [b'm', b'dm', b'cd', b'dc']: |
236 raise error.Abort( | 238 raise error.Abort( |
237 _( | 239 _( |
238 "unable to convert merge commit " | 240 b"unable to convert merge commit " |
239 "since target parents do not merge cleanly (file " | 241 b"since target parents do not merge cleanly (file " |
240 "%s, parents %s and %s)" | 242 b"%s, parents %s and %s)" |
241 ) | 243 ) |
242 % (file, p1ctx, p2ctx) | 244 % (file, p1ctx, p2ctx) |
243 ) | 245 ) |
244 elif action == 'k': | 246 elif action == b'k': |
245 # 'keep' means nothing changed from p1 | 247 # 'keep' means nothing changed from p1 |
246 continue | 248 continue |
247 else: | 249 else: |
248 # Any other change means we want to take the p2 version | 250 # Any other change means we want to take the p2 version |
249 yield file | 251 yield file |
253 ): | 255 ): |
254 files = dict(files) | 256 files = dict(files) |
255 | 257 |
256 def getfilectx(repo, memctx, f): | 258 def getfilectx(repo, memctx, f): |
257 if p2ctx and f in p2files and f not in copies: | 259 if p2ctx and f in p2files and f not in copies: |
258 self.ui.debug('reusing %s from p2\n' % f) | 260 self.ui.debug(b'reusing %s from p2\n' % f) |
259 try: | 261 try: |
260 return p2ctx[f] | 262 return p2ctx[f] |
261 except error.ManifestLookupError: | 263 except error.ManifestLookupError: |
262 # If the file doesn't exist in p2, then we're syncing a | 264 # If the file doesn't exist in p2, then we're syncing a |
263 # delete, so just return None. | 265 # delete, so just return None. |
267 except KeyError: | 269 except KeyError: |
268 return None | 270 return None |
269 data, mode = source.getfile(f, v) | 271 data, mode = source.getfile(f, v) |
270 if data is None: | 272 if data is None: |
271 return None | 273 return None |
272 if f == '.hgtags': | 274 if f == b'.hgtags': |
273 data = self._rewritetags(source, revmap, data) | 275 data = self._rewritetags(source, revmap, data) |
274 if f == '.hgsubstate': | 276 if f == b'.hgsubstate': |
275 data = self._rewritesubstate(source, data) | 277 data = self._rewritesubstate(source, data) |
276 return context.memfilectx( | 278 return context.memfilectx( |
277 self.repo, | 279 self.repo, |
278 memctx, | 280 memctx, |
279 f, | 281 f, |
280 data, | 282 data, |
281 'l' in mode, | 283 b'l' in mode, |
282 'x' in mode, | 284 b'x' in mode, |
283 copies.get(f), | 285 copies.get(f), |
284 ) | 286 ) |
285 | 287 |
286 pl = [] | 288 pl = [] |
287 for p in parents: | 289 for p in parents: |
308 if newrev is not None: | 310 if newrev is not None: |
309 text = text.replace(sha1, newrev[: len(sha1)]) | 311 text = text.replace(sha1, newrev[: len(sha1)]) |
310 | 312 |
311 extra = commit.extra.copy() | 313 extra = commit.extra.copy() |
312 | 314 |
313 sourcename = self.repo.ui.config('convert', 'hg.sourcename') | 315 sourcename = self.repo.ui.config(b'convert', b'hg.sourcename') |
314 if sourcename: | 316 if sourcename: |
315 extra['convert_source'] = sourcename | 317 extra[b'convert_source'] = sourcename |
316 | 318 |
317 for label in ( | 319 for label in ( |
318 'source', | 320 b'source', |
319 'transplant_source', | 321 b'transplant_source', |
320 'rebase_source', | 322 b'rebase_source', |
321 'intermediate-source', | 323 b'intermediate-source', |
322 ): | 324 ): |
323 node = extra.get(label) | 325 node = extra.get(label) |
324 | 326 |
325 if node is None: | 327 if node is None: |
326 continue | 328 continue |
327 | 329 |
328 # Only transplant stores its reference in binary | 330 # Only transplant stores its reference in binary |
329 if label == 'transplant_source': | 331 if label == b'transplant_source': |
330 node = nodemod.hex(node) | 332 node = nodemod.hex(node) |
331 | 333 |
332 newrev = revmap.get(node) | 334 newrev = revmap.get(node) |
333 if newrev is not None: | 335 if newrev is not None: |
334 if label == 'transplant_source': | 336 if label == b'transplant_source': |
335 newrev = nodemod.bin(newrev) | 337 newrev = nodemod.bin(newrev) |
336 | 338 |
337 extra[label] = newrev | 339 extra[label] = newrev |
338 | 340 |
339 if self.branchnames and commit.branch: | 341 if self.branchnames and commit.branch: |
340 extra['branch'] = commit.branch | 342 extra[b'branch'] = commit.branch |
341 if commit.rev and commit.saverev: | 343 if commit.rev and commit.saverev: |
342 extra['convert_revision'] = commit.rev | 344 extra[b'convert_revision'] = commit.rev |
343 | 345 |
344 while parents: | 346 while parents: |
345 p1 = p2 | 347 p1 = p2 |
346 p2 = parents.pop(0) | 348 p2 = parents.pop(0) |
347 p1ctx = self.repo[p1] | 349 p1ctx = self.repo[p1] |
371 ) | 373 ) |
372 | 374 |
373 # We won't know if the conversion changes the node until after the | 375 # We won't know if the conversion changes the node until after the |
374 # commit, so copy the source's phase for now. | 376 # commit, so copy the source's phase for now. |
375 self.repo.ui.setconfig( | 377 self.repo.ui.setconfig( |
376 'phases', | 378 b'phases', |
377 'new-commit', | 379 b'new-commit', |
378 phases.phasenames[commit.phase], | 380 phases.phasenames[commit.phase], |
379 'convert', | 381 b'convert', |
380 ) | 382 ) |
381 | 383 |
382 with self.repo.transaction("convert") as tr: | 384 with self.repo.transaction(b"convert") as tr: |
383 if self.repo.ui.config('convert', 'hg.preserve-hash'): | 385 if self.repo.ui.config(b'convert', b'hg.preserve-hash'): |
384 origctx = commit.ctx | 386 origctx = commit.ctx |
385 else: | 387 else: |
386 origctx = None | 388 origctx = None |
387 node = nodemod.hex(self.repo.commitctx(ctx, origctx=origctx)) | 389 node = nodemod.hex(self.repo.commitctx(ctx, origctx=origctx)) |
388 | 390 |
394 if ctx.phase() < phases.draft: | 396 if ctx.phase() < phases.draft: |
395 phases.registernew( | 397 phases.registernew( |
396 self.repo, tr, phases.draft, [ctx.node()] | 398 self.repo, tr, phases.draft, [ctx.node()] |
397 ) | 399 ) |
398 | 400 |
399 text = "(octopus merge fixup)\n" | 401 text = b"(octopus merge fixup)\n" |
400 p2 = node | 402 p2 = node |
401 | 403 |
402 if self.filemapmode and nparents == 1: | 404 if self.filemapmode and nparents == 1: |
403 man = self.repo.manifestlog.getstorage(b'') | 405 man = self.repo.manifestlog.getstorage(b'') |
404 mnode = self.repo.changelog.read(nodemod.bin(p2))[0] | 406 mnode = self.repo.changelog.read(nodemod.bin(p2))[0] |
405 closed = 'close' in commit.extra | 407 closed = b'close' in commit.extra |
406 if not closed and not man.cmp(m1node, man.revision(mnode)): | 408 if not closed and not man.cmp(m1node, man.revision(mnode)): |
407 self.ui.status(_("filtering out empty revision\n")) | 409 self.ui.status(_(b"filtering out empty revision\n")) |
408 self.repo.rollback(force=True) | 410 self.repo.rollback(force=True) |
409 return parent | 411 return parent |
410 return p2 | 412 return p2 |
411 | 413 |
412 def puttags(self, tags): | 414 def puttags(self, tags): |
414 tagparent = tagparent or nodemod.nullid | 416 tagparent = tagparent or nodemod.nullid |
415 | 417 |
416 oldlines = set() | 418 oldlines = set() |
417 for branch, heads in self.repo.branchmap().iteritems(): | 419 for branch, heads in self.repo.branchmap().iteritems(): |
418 for h in heads: | 420 for h in heads: |
419 if '.hgtags' in self.repo[h]: | 421 if b'.hgtags' in self.repo[h]: |
420 oldlines.update( | 422 oldlines.update( |
421 set(self.repo[h]['.hgtags'].data().splitlines(True)) | 423 set(self.repo[h][b'.hgtags'].data().splitlines(True)) |
422 ) | 424 ) |
423 oldlines = sorted(list(oldlines)) | 425 oldlines = sorted(list(oldlines)) |
424 | 426 |
425 newlines = sorted([("%s %s\n" % (tags[tag], tag)) for tag in tags]) | 427 newlines = sorted([(b"%s %s\n" % (tags[tag], tag)) for tag in tags]) |
426 if newlines == oldlines: | 428 if newlines == oldlines: |
427 return None, None | 429 return None, None |
428 | 430 |
429 # if the old and new tags match, then there is nothing to update | 431 # if the old and new tags match, then there is nothing to update |
430 oldtags = set() | 432 oldtags = set() |
431 newtags = set() | 433 newtags = set() |
432 for line in oldlines: | 434 for line in oldlines: |
433 s = line.strip().split(' ', 1) | 435 s = line.strip().split(b' ', 1) |
434 if len(s) != 2: | 436 if len(s) != 2: |
435 continue | 437 continue |
436 oldtags.add(s[1]) | 438 oldtags.add(s[1]) |
437 for line in newlines: | 439 for line in newlines: |
438 s = line.strip().split(' ', 1) | 440 s = line.strip().split(b' ', 1) |
439 if len(s) != 2: | 441 if len(s) != 2: |
440 continue | 442 continue |
441 if s[1] not in oldtags: | 443 if s[1] not in oldtags: |
442 newtags.add(s[1].strip()) | 444 newtags.add(s[1].strip()) |
443 | 445 |
444 if not newtags: | 446 if not newtags: |
445 return None, None | 447 return None, None |
446 | 448 |
447 data = "".join(newlines) | 449 data = b"".join(newlines) |
448 | 450 |
449 def getfilectx(repo, memctx, f): | 451 def getfilectx(repo, memctx, f): |
450 return context.memfilectx(repo, memctx, f, data, False, False, None) | 452 return context.memfilectx(repo, memctx, f, data, False, False, None) |
451 | 453 |
452 self.ui.status(_("updating tags\n")) | 454 self.ui.status(_(b"updating tags\n")) |
453 date = "%d 0" % int(time.mktime(time.gmtime())) | 455 date = b"%d 0" % int(time.mktime(time.gmtime())) |
454 extra = {'branch': self.tagsbranch} | 456 extra = {b'branch': self.tagsbranch} |
455 ctx = context.memctx( | 457 ctx = context.memctx( |
456 self.repo, | 458 self.repo, |
457 (tagparent, None), | 459 (tagparent, None), |
458 "update tags", | 460 b"update tags", |
459 [".hgtags"], | 461 [b".hgtags"], |
460 getfilectx, | 462 getfilectx, |
461 "convert-repo", | 463 b"convert-repo", |
462 date, | 464 date, |
463 extra, | 465 extra, |
464 ) | 466 ) |
465 node = self.repo.commitctx(ctx) | 467 node = self.repo.commitctx(ctx) |
466 return nodemod.hex(node), nodemod.hex(tagparent) | 468 return nodemod.hex(node), nodemod.hex(tagparent) |
473 return | 475 return |
474 wlock = lock = tr = None | 476 wlock = lock = tr = None |
475 try: | 477 try: |
476 wlock = self.repo.wlock() | 478 wlock = self.repo.wlock() |
477 lock = self.repo.lock() | 479 lock = self.repo.lock() |
478 tr = self.repo.transaction('bookmark') | 480 tr = self.repo.transaction(b'bookmark') |
479 self.ui.status(_("updating bookmarks\n")) | 481 self.ui.status(_(b"updating bookmarks\n")) |
480 destmarks = self.repo._bookmarks | 482 destmarks = self.repo._bookmarks |
481 changes = [ | 483 changes = [ |
482 (bookmark, nodemod.bin(updatedbookmark[bookmark])) | 484 (bookmark, nodemod.bin(updatedbookmark[bookmark])) |
483 for bookmark in updatedbookmark | 485 for bookmark in updatedbookmark |
484 ] | 486 ] |
493 | 495 |
494 def hascommitforsplicemap(self, rev): | 496 def hascommitforsplicemap(self, rev): |
495 if rev not in self.repo and self.clonebranches: | 497 if rev not in self.repo and self.clonebranches: |
496 raise error.Abort( | 498 raise error.Abort( |
497 _( | 499 _( |
498 'revision %s not found in destination ' | 500 b'revision %s not found in destination ' |
499 'repository (lookups with clonebranches=true ' | 501 b'repository (lookups with clonebranches=true ' |
500 'are not implemented)' | 502 b'are not implemented)' |
501 ) | 503 ) |
502 % rev | 504 % rev |
503 ) | 505 ) |
504 return rev in self.repo | 506 return rev in self.repo |
505 | 507 |
506 | 508 |
507 class mercurial_source(common.converter_source): | 509 class mercurial_source(common.converter_source): |
508 def __init__(self, ui, repotype, path, revs=None): | 510 def __init__(self, ui, repotype, path, revs=None): |
509 common.converter_source.__init__(self, ui, repotype, path, revs) | 511 common.converter_source.__init__(self, ui, repotype, path, revs) |
510 self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors') | 512 self.ignoreerrors = ui.configbool(b'convert', b'hg.ignoreerrors') |
511 self.ignored = set() | 513 self.ignored = set() |
512 self.saverev = ui.configbool('convert', 'hg.saverev') | 514 self.saverev = ui.configbool(b'convert', b'hg.saverev') |
513 try: | 515 try: |
514 self.repo = hg.repository(self.ui, path) | 516 self.repo = hg.repository(self.ui, path) |
515 # try to provoke an exception if this isn't really a hg | 517 # try to provoke an exception if this isn't really a hg |
516 # repo, but some other bogus compatible-looking url | 518 # repo, but some other bogus compatible-looking url |
517 if not self.repo.local(): | 519 if not self.repo.local(): |
518 raise error.RepoError | 520 raise error.RepoError |
519 except error.RepoError: | 521 except error.RepoError: |
520 ui.traceback() | 522 ui.traceback() |
521 raise NoRepo(_("%s is not a local Mercurial repository") % path) | 523 raise NoRepo(_(b"%s is not a local Mercurial repository") % path) |
522 self.lastrev = None | 524 self.lastrev = None |
523 self.lastctx = None | 525 self.lastctx = None |
524 self._changescache = None, None | 526 self._changescache = None, None |
525 self.convertfp = None | 527 self.convertfp = None |
526 # Restrict converted revisions to startrev descendants | 528 # Restrict converted revisions to startrev descendants |
527 startnode = ui.config('convert', 'hg.startrev') | 529 startnode = ui.config(b'convert', b'hg.startrev') |
528 hgrevs = ui.config('convert', 'hg.revs') | 530 hgrevs = ui.config(b'convert', b'hg.revs') |
529 if hgrevs is None: | 531 if hgrevs is None: |
530 if startnode is not None: | 532 if startnode is not None: |
531 try: | 533 try: |
532 startnode = self.repo.lookup(startnode) | 534 startnode = self.repo.lookup(startnode) |
533 except error.RepoError: | 535 except error.RepoError: |
534 raise error.Abort( | 536 raise error.Abort( |
535 _('%s is not a valid start revision') % startnode | 537 _(b'%s is not a valid start revision') % startnode |
536 ) | 538 ) |
537 startrev = self.repo.changelog.rev(startnode) | 539 startrev = self.repo.changelog.rev(startnode) |
538 children = {startnode: 1} | 540 children = {startnode: 1} |
539 for r in self.repo.changelog.descendants([startrev]): | 541 for r in self.repo.changelog.descendants([startrev]): |
540 children[self.repo.changelog.node(r)] = 1 | 542 children[self.repo.changelog.node(r)] = 1 |
546 else: | 548 else: |
547 self._heads = self.repo.heads() | 549 self._heads = self.repo.heads() |
548 else: | 550 else: |
549 if revs or startnode is not None: | 551 if revs or startnode is not None: |
550 raise error.Abort( | 552 raise error.Abort( |
551 _('hg.revs cannot be combined with ' 'hg.startrev or --rev') | 553 _( |
554 b'hg.revs cannot be combined with ' | |
555 b'hg.startrev or --rev' | |
556 ) | |
552 ) | 557 ) |
553 nodes = set() | 558 nodes = set() |
554 parents = set() | 559 parents = set() |
555 for r in scmutil.revrange(self.repo, [hgrevs]): | 560 for r in scmutil.revrange(self.repo, [hgrevs]): |
556 ctx = self.repo[r] | 561 ctx = self.repo[r] |
633 pass | 638 pass |
634 except error.LookupError as e: | 639 except error.LookupError as e: |
635 if not self.ignoreerrors: | 640 if not self.ignoreerrors: |
636 raise | 641 raise |
637 self.ignored.add(name) | 642 self.ignored.add(name) |
638 self.ui.warn(_('ignoring: %s\n') % e) | 643 self.ui.warn(_(b'ignoring: %s\n') % e) |
639 return copies | 644 return copies |
640 | 645 |
641 def getcommit(self, rev): | 646 def getcommit(self, rev): |
642 ctx = self._changectx(rev) | 647 ctx = self._changectx(rev) |
643 _parents = self._parents(ctx) | 648 _parents = self._parents(ctx) |
645 optparents = [p.hex() for p in ctx.parents() if p and p not in _parents] | 650 optparents = [p.hex() for p in ctx.parents() if p and p not in _parents] |
646 crev = rev | 651 crev = rev |
647 | 652 |
648 return common.commit( | 653 return common.commit( |
649 author=ctx.user(), | 654 author=ctx.user(), |
650 date=dateutil.datestr(ctx.date(), '%Y-%m-%d %H:%M:%S %1%2'), | 655 date=dateutil.datestr(ctx.date(), b'%Y-%m-%d %H:%M:%S %1%2'), |
651 desc=ctx.description(), | 656 desc=ctx.description(), |
652 rev=crev, | 657 rev=crev, |
653 parents=parents, | 658 parents=parents, |
654 optparents=optparents, | 659 optparents=optparents, |
655 branch=ctx.branch(), | 660 branch=ctx.branch(), |
666 def gettags(self): | 671 def gettags(self): |
667 # This will get written to .hgtags, filter non global tags out. | 672 # This will get written to .hgtags, filter non global tags out. |
668 tags = [ | 673 tags = [ |
669 t | 674 t |
670 for t in self.repo.tagslist() | 675 for t in self.repo.tagslist() |
671 if self.repo.tagtype(t[0]) == 'global' | 676 if self.repo.tagtype(t[0]) == b'global' |
672 ] | 677 ] |
673 return dict( | 678 return dict( |
674 [ | 679 [ |
675 (name, nodemod.hex(node)) | 680 (name, nodemod.hex(node)) |
676 for name, node in tags | 681 for name, node in tags |
694 | 699 |
695 return ma + r | 700 return ma + r |
696 | 701 |
697 def converted(self, rev, destrev): | 702 def converted(self, rev, destrev): |
698 if self.convertfp is None: | 703 if self.convertfp is None: |
699 self.convertfp = open(self.repo.vfs.join('shamap'), 'ab') | 704 self.convertfp = open(self.repo.vfs.join(b'shamap'), b'ab') |
700 self.convertfp.write(util.tonativeeol('%s %s\n' % (destrev, rev))) | 705 self.convertfp.write(util.tonativeeol(b'%s %s\n' % (destrev, rev))) |
701 self.convertfp.flush() | 706 self.convertfp.flush() |
702 | 707 |
703 def before(self): | 708 def before(self): |
704 self.ui.debug('run hg source pre-conversion action\n') | 709 self.ui.debug(b'run hg source pre-conversion action\n') |
705 | 710 |
706 def after(self): | 711 def after(self): |
707 self.ui.debug('run hg source post-conversion action\n') | 712 self.ui.debug(b'run hg source post-conversion action\n') |
708 | 713 |
709 def hasnativeorder(self): | 714 def hasnativeorder(self): |
710 return True | 715 return True |
711 | 716 |
712 def hasnativeclose(self): | 717 def hasnativeclose(self): |
719 return None | 724 return None |
720 | 725 |
721 def getbookmarks(self): | 726 def getbookmarks(self): |
722 return bookmarks.listbookmarks(self.repo) | 727 return bookmarks.listbookmarks(self.repo) |
723 | 728 |
724 def checkrevformat(self, revstr, mapname='splicemap'): | 729 def checkrevformat(self, revstr, mapname=b'splicemap'): |
725 """ Mercurial, revision string is a 40 byte hex """ | 730 """ Mercurial, revision string is a 40 byte hex """ |
726 self.checkhexformat(revstr, mapname) | 731 self.checkhexformat(revstr, mapname) |