comparison mercurial/branchmap.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 74802979dd9d
comparison
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
108 closednodes=closed, 108 closednodes=closed,
109 ) 109 )
110 110
111 # Try to stick it as low as possible 111 # Try to stick it as low as possible
112 # filter above served are unlikely to be fetch from a clone 112 # filter above served are unlikely to be fetch from a clone
113 for candidate in ('base', 'immutable', 'served'): 113 for candidate in (b'base', b'immutable', b'served'):
114 rview = repo.filtered(candidate) 114 rview = repo.filtered(candidate)
115 if cache.validfor(rview): 115 if cache.validfor(rview):
116 self._per_filter[candidate] = cache 116 self._per_filter[candidate] = cache
117 cache.write(rview) 117 cache.write(rview)
118 return 118 return
127 raise ValueError(r'node %s does not exist' % pycompat.sysstr(hex(node))) 127 raise ValueError(r'node %s does not exist' % pycompat.sysstr(hex(node)))
128 128
129 129
130 def _branchcachedesc(repo): 130 def _branchcachedesc(repo):
131 if repo.filtername is not None: 131 if repo.filtername is not None:
132 return 'branch cache (%s)' % repo.filtername 132 return b'branch cache (%s)' % repo.filtername
133 else: 133 else:
134 return 'branch cache' 134 return b'branch cache'
135 135
136 136
137 class branchcache(object): 137 class branchcache(object):
138 """A dict like object that hold branches heads cache. 138 """A dict like object that hold branches heads cache.
139 139
243 def fromfile(cls, repo): 243 def fromfile(cls, repo):
244 f = None 244 f = None
245 try: 245 try:
246 f = repo.cachevfs(cls._filename(repo)) 246 f = repo.cachevfs(cls._filename(repo))
247 lineiter = iter(f) 247 lineiter = iter(f)
248 cachekey = next(lineiter).rstrip('\n').split(" ", 2) 248 cachekey = next(lineiter).rstrip(b'\n').split(b" ", 2)
249 last, lrev = cachekey[:2] 249 last, lrev = cachekey[:2]
250 last, lrev = bin(last), int(lrev) 250 last, lrev = bin(last), int(lrev)
251 filteredhash = None 251 filteredhash = None
252 hasnode = repo.changelog.hasnode 252 hasnode = repo.changelog.hasnode
253 if len(cachekey) > 2: 253 if len(cachekey) > 2:
265 except (IOError, OSError): 265 except (IOError, OSError):
266 return None 266 return None
267 267
268 except Exception as inst: 268 except Exception as inst:
269 if repo.ui.debugflag: 269 if repo.ui.debugflag:
270 msg = 'invalid %s: %s\n' 270 msg = b'invalid %s: %s\n'
271 repo.ui.debug( 271 repo.ui.debug(
272 msg % (_branchcachedesc(repo), pycompat.bytestr(inst)) 272 msg % (_branchcachedesc(repo), pycompat.bytestr(inst))
273 ) 273 )
274 bcache = None 274 bcache = None
275 275
281 281
282 def load(self, repo, lineiter): 282 def load(self, repo, lineiter):
283 """ fully loads the branchcache by reading from the file using the line 283 """ fully loads the branchcache by reading from the file using the line
284 iterator passed""" 284 iterator passed"""
285 for line in lineiter: 285 for line in lineiter:
286 line = line.rstrip('\n') 286 line = line.rstrip(b'\n')
287 if not line: 287 if not line:
288 continue 288 continue
289 node, state, label = line.split(" ", 2) 289 node, state, label = line.split(b" ", 2)
290 if state not in 'oc': 290 if state not in b'oc':
291 raise ValueError(r'invalid branch state') 291 raise ValueError(r'invalid branch state')
292 label = encoding.tolocal(label.strip()) 292 label = encoding.tolocal(label.strip())
293 node = bin(node) 293 node = bin(node)
294 self._entries.setdefault(label, []).append(node) 294 self._entries.setdefault(label, []).append(node)
295 if state == 'c': 295 if state == b'c':
296 self._closednodes.add(node) 296 self._closednodes.add(node)
297 297
298 @staticmethod 298 @staticmethod
299 def _filename(repo): 299 def _filename(repo):
300 """name of a branchcache file for a given repo or repoview""" 300 """name of a branchcache file for a given repo or repoview"""
301 filename = "branch2" 301 filename = b"branch2"
302 if repo.filtername: 302 if repo.filtername:
303 filename = '%s-%s' % (filename, repo.filtername) 303 filename = b'%s-%s' % (filename, repo.filtername)
304 return filename 304 return filename
305 305
306 def validfor(self, repo): 306 def validfor(self, repo):
307 """Is the cache content valid regarding a repo 307 """Is the cache content valid regarding a repo
308 308
362 self._closednodes, 362 self._closednodes,
363 ) 363 )
364 364
365 def write(self, repo): 365 def write(self, repo):
366 try: 366 try:
367 f = repo.cachevfs(self._filename(repo), "w", atomictemp=True) 367 f = repo.cachevfs(self._filename(repo), b"w", atomictemp=True)
368 cachekey = [hex(self.tipnode), '%d' % self.tiprev] 368 cachekey = [hex(self.tipnode), b'%d' % self.tiprev]
369 if self.filteredhash is not None: 369 if self.filteredhash is not None:
370 cachekey.append(hex(self.filteredhash)) 370 cachekey.append(hex(self.filteredhash))
371 f.write(" ".join(cachekey) + '\n') 371 f.write(b" ".join(cachekey) + b'\n')
372 nodecount = 0 372 nodecount = 0
373 for label, nodes in sorted(self._entries.iteritems()): 373 for label, nodes in sorted(self._entries.iteritems()):
374 label = encoding.fromlocal(label) 374 label = encoding.fromlocal(label)
375 for node in nodes: 375 for node in nodes:
376 nodecount += 1 376 nodecount += 1
377 if node in self._closednodes: 377 if node in self._closednodes:
378 state = 'c' 378 state = b'c'
379 else: 379 else:
380 state = 'o' 380 state = b'o'
381 f.write("%s %s %s\n" % (hex(node), state, label)) 381 f.write(b"%s %s %s\n" % (hex(node), state, label))
382 f.close() 382 f.close()
383 repo.ui.log( 383 repo.ui.log(
384 'branchcache', 384 b'branchcache',
385 'wrote %s with %d labels and %d nodes\n', 385 b'wrote %s with %d labels and %d nodes\n',
386 _branchcachedesc(repo), 386 _branchcachedesc(repo),
387 len(self._entries), 387 len(self._entries),
388 nodecount, 388 nodecount,
389 ) 389 )
390 except (IOError, OSError, error.Abort) as inst: 390 except (IOError, OSError, error.Abort) as inst:
391 # Abort may be raised by read only opener, so log and continue 391 # Abort may be raised by read only opener, so log and continue
392 repo.ui.debug( 392 repo.ui.debug(
393 "couldn't write branch cache: %s\n" 393 b"couldn't write branch cache: %s\n"
394 % stringutil.forcebytestr(inst) 394 % stringutil.forcebytestr(inst)
395 ) 395 )
396 396
397 def update(self, repo, revgen): 397 def update(self, repo, revgen):
398 """Given a branchhead cache, self, that may have extra nodes or be 398 """Given a branchhead cache, self, that may have extra nodes or be
458 self.tiprev = tiprev 458 self.tiprev = tiprev
459 self.filteredhash = scmutil.filteredhash(repo, self.tiprev) 459 self.filteredhash = scmutil.filteredhash(repo, self.tiprev)
460 460
461 duration = util.timer() - starttime 461 duration = util.timer() - starttime
462 repo.ui.log( 462 repo.ui.log(
463 'branchcache', 463 b'branchcache',
464 'updated %s in %.4f seconds\n', 464 b'updated %s in %.4f seconds\n',
465 _branchcachedesc(repo), 465 _branchcachedesc(repo),
466 duration, 466 duration,
467 ) 467 )
468 468
469 self.write(repo) 469 self.write(repo)
476 pass 476 pass
477 477
478 478
479 # Revision branch info cache 479 # Revision branch info cache
480 480
481 _rbcversion = '-v1' 481 _rbcversion = b'-v1'
482 _rbcnames = 'rbc-names' + _rbcversion 482 _rbcnames = b'rbc-names' + _rbcversion
483 _rbcrevs = 'rbc-revs' + _rbcversion 483 _rbcrevs = b'rbc-revs' + _rbcversion
484 # [4 byte hash prefix][4 byte branch name number with sign bit indicating open] 484 # [4 byte hash prefix][4 byte branch name number with sign bit indicating open]
485 _rbcrecfmt = '>4sI' 485 _rbcrecfmt = b'>4sI'
486 _rbcrecsize = calcsize(_rbcrecfmt) 486 _rbcrecsize = calcsize(_rbcrecfmt)
487 _rbcnodelen = 4 487 _rbcnodelen = 4
488 _rbcbranchidxmask = 0x7FFFFFFF 488 _rbcbranchidxmask = 0x7FFFFFFF
489 _rbccloseflag = 0x80000000 489 _rbccloseflag = 0x80000000
490 490
521 try: 521 try:
522 bndata = repo.cachevfs.read(_rbcnames) 522 bndata = repo.cachevfs.read(_rbcnames)
523 self._rbcsnameslen = len(bndata) # for verification before writing 523 self._rbcsnameslen = len(bndata) # for verification before writing
524 if bndata: 524 if bndata:
525 self._names = [ 525 self._names = [
526 encoding.tolocal(bn) for bn in bndata.split('\0') 526 encoding.tolocal(bn) for bn in bndata.split(b'\0')
527 ] 527 ]
528 except (IOError, OSError): 528 except (IOError, OSError):
529 if readonly: 529 if readonly:
530 # don't try to use cache - fall back to the slow path 530 # don't try to use cache - fall back to the slow path
531 self.branchinfo = self._branchinfo 531 self.branchinfo = self._branchinfo
534 try: 534 try:
535 data = repo.cachevfs.read(_rbcrevs) 535 data = repo.cachevfs.read(_rbcrevs)
536 self._rbcrevs[:] = data 536 self._rbcrevs[:] = data
537 except (IOError, OSError) as inst: 537 except (IOError, OSError) as inst:
538 repo.ui.debug( 538 repo.ui.debug(
539 "couldn't read revision branch cache: %s\n" 539 b"couldn't read revision branch cache: %s\n"
540 % stringutil.forcebytestr(inst) 540 % stringutil.forcebytestr(inst)
541 ) 541 )
542 # remember number of good records on disk 542 # remember number of good records on disk
543 self._rbcrevslen = min( 543 self._rbcrevslen = min(
544 len(self._rbcrevs) // _rbcrecsize, len(repo.changelog) 544 len(self._rbcrevs) // _rbcrecsize, len(repo.changelog)
552 self._rbcsnameslen = 0 552 self._rbcsnameslen = 0
553 del self._names[:] 553 del self._names[:]
554 self._rbcnamescount = 0 554 self._rbcnamescount = 0
555 self._rbcrevslen = len(self._repo.changelog) 555 self._rbcrevslen = len(self._repo.changelog)
556 self._rbcrevs = bytearray(self._rbcrevslen * _rbcrecsize) 556 self._rbcrevs = bytearray(self._rbcrevslen * _rbcrecsize)
557 util.clearcachedproperty(self, '_namesreverse') 557 util.clearcachedproperty(self, b'_namesreverse')
558 558
559 @util.propertycache 559 @util.propertycache
560 def _namesreverse(self): 560 def _namesreverse(self):
561 return dict((b, r) for r, b in enumerate(self._names)) 561 return dict((b, r) for r, b in enumerate(self._names))
562 562
580 _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx 580 _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx
581 ) 581 )
582 close = bool(branchidx & _rbccloseflag) 582 close = bool(branchidx & _rbccloseflag)
583 if close: 583 if close:
584 branchidx &= _rbcbranchidxmask 584 branchidx &= _rbcbranchidxmask
585 if cachenode == '\0\0\0\0': 585 if cachenode == b'\0\0\0\0':
586 pass 586 pass
587 elif cachenode == reponode: 587 elif cachenode == reponode:
588 try: 588 try:
589 return self._names[branchidx], close 589 return self._names[branchidx], close
590 except IndexError: 590 except IndexError:
591 # recover from invalid reference to unknown branch 591 # recover from invalid reference to unknown branch
592 self._repo.ui.debug( 592 self._repo.ui.debug(
593 "referenced branch names not found" 593 b"referenced branch names not found"
594 " - rebuilding revision branch cache from scratch\n" 594 b" - rebuilding revision branch cache from scratch\n"
595 ) 595 )
596 self._clear() 596 self._clear()
597 else: 597 else:
598 # rev/node map has changed, invalidate the cache from here up 598 # rev/node map has changed, invalidate the cache from here up
599 self._repo.ui.debug( 599 self._repo.ui.debug(
600 "history modification detected - truncating " 600 b"history modification detected - truncating "
601 "revision branch cache to revision %d\n" % rev 601 b"revision branch cache to revision %d\n" % rev
602 ) 602 )
603 truncate = rbcrevidx + _rbcrecsize 603 truncate = rbcrevidx + _rbcrecsize
604 del self._rbcrevs[truncate:] 604 del self._rbcrevs[truncate:]
605 self._rbcrevslen = min(self._rbcrevslen, truncate) 605 self._rbcrevslen = min(self._rbcrevslen, truncate)
606 606
648 if rev == nullrev: 648 if rev == nullrev:
649 return 649 return
650 rbcrevidx = rev * _rbcrecsize 650 rbcrevidx = rev * _rbcrecsize
651 if len(self._rbcrevs) < rbcrevidx + _rbcrecsize: 651 if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
652 self._rbcrevs.extend( 652 self._rbcrevs.extend(
653 '\0' 653 b'\0'
654 * (len(self._repo.changelog) * _rbcrecsize - len(self._rbcrevs)) 654 * (len(self._repo.changelog) * _rbcrecsize - len(self._rbcrevs))
655 ) 655 )
656 pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx) 656 pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx)
657 self._rbcrevslen = min(self._rbcrevslen, rev) 657 self._rbcrevslen = min(self._rbcrevslen, rev)
658 658
659 tr = self._repo.currenttransaction() 659 tr = self._repo.currenttransaction()
660 if tr: 660 if tr:
661 tr.addfinalize('write-revbranchcache', self.write) 661 tr.addfinalize(b'write-revbranchcache', self.write)
662 662
663 def write(self, tr=None): 663 def write(self, tr=None):
664 """Save branch cache if it is dirty.""" 664 """Save branch cache if it is dirty."""
665 repo = self._repo 665 repo = self._repo
666 wlock = None 666 wlock = None
667 step = '' 667 step = b''
668 try: 668 try:
669 # write the new names 669 # write the new names
670 if self._rbcnamescount < len(self._names): 670 if self._rbcnamescount < len(self._names):
671 wlock = repo.wlock(wait=False) 671 wlock = repo.wlock(wait=False)
672 step = ' names' 672 step = b' names'
673 self._writenames(repo) 673 self._writenames(repo)
674 674
675 # write the new revs 675 # write the new revs
676 start = self._rbcrevslen * _rbcrecsize 676 start = self._rbcrevslen * _rbcrecsize
677 if start != len(self._rbcrevs): 677 if start != len(self._rbcrevs):
678 step = '' 678 step = b''
679 if wlock is None: 679 if wlock is None:
680 wlock = repo.wlock(wait=False) 680 wlock = repo.wlock(wait=False)
681 self._writerevs(repo, start) 681 self._writerevs(repo, start)
682 682
683 except (IOError, OSError, error.Abort, error.LockError) as inst: 683 except (IOError, OSError, error.Abort, error.LockError) as inst:
684 repo.ui.debug( 684 repo.ui.debug(
685 "couldn't write revision branch cache%s: %s\n" 685 b"couldn't write revision branch cache%s: %s\n"
686 % (step, stringutil.forcebytestr(inst)) 686 % (step, stringutil.forcebytestr(inst))
687 ) 687 )
688 finally: 688 finally:
689 if wlock is not None: 689 if wlock is not None:
690 wlock.release() 690 wlock.release()
691 691
692 def _writenames(self, repo): 692 def _writenames(self, repo):
693 """ write the new branch names to revbranchcache """ 693 """ write the new branch names to revbranchcache """
694 if self._rbcnamescount != 0: 694 if self._rbcnamescount != 0:
695 f = repo.cachevfs.open(_rbcnames, 'ab') 695 f = repo.cachevfs.open(_rbcnames, b'ab')
696 if f.tell() == self._rbcsnameslen: 696 if f.tell() == self._rbcsnameslen:
697 f.write('\0') 697 f.write(b'\0')
698 else: 698 else:
699 f.close() 699 f.close()
700 repo.ui.debug("%s changed - rewriting it\n" % _rbcnames) 700 repo.ui.debug(b"%s changed - rewriting it\n" % _rbcnames)
701 self._rbcnamescount = 0 701 self._rbcnamescount = 0
702 self._rbcrevslen = 0 702 self._rbcrevslen = 0
703 if self._rbcnamescount == 0: 703 if self._rbcnamescount == 0:
704 # before rewriting names, make sure references are removed 704 # before rewriting names, make sure references are removed
705 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True) 705 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True)
706 f = repo.cachevfs.open(_rbcnames, 'wb') 706 f = repo.cachevfs.open(_rbcnames, b'wb')
707 f.write( 707 f.write(
708 '\0'.join( 708 b'\0'.join(
709 encoding.fromlocal(b) 709 encoding.fromlocal(b)
710 for b in self._names[self._rbcnamescount :] 710 for b in self._names[self._rbcnamescount :]
711 ) 711 )
712 ) 712 )
713 self._rbcsnameslen = f.tell() 713 self._rbcsnameslen = f.tell()
715 self._rbcnamescount = len(self._names) 715 self._rbcnamescount = len(self._names)
716 716
717 def _writerevs(self, repo, start): 717 def _writerevs(self, repo, start):
718 """ write the new revs to revbranchcache """ 718 """ write the new revs to revbranchcache """
719 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize) 719 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize)
720 with repo.cachevfs.open(_rbcrevs, 'ab') as f: 720 with repo.cachevfs.open(_rbcrevs, b'ab') as f:
721 if f.tell() != start: 721 if f.tell() != start:
722 repo.ui.debug("truncating cache/%s to %d\n" % (_rbcrevs, start)) 722 repo.ui.debug(
723 b"truncating cache/%s to %d\n" % (_rbcrevs, start)
724 )
723 f.seek(start) 725 f.seek(start)
724 if f.tell() != start: 726 if f.tell() != start:
725 start = 0 727 start = 0
726 f.seek(start) 728 f.seek(start)
727 f.truncate() 729 f.truncate()