615 for name in names: |
615 for name in names: |
616 repo.hook('tag', node=hex(node), tag=name, local=local) |
616 repo.hook('tag', node=hex(node), tag=name, local=local) |
617 |
617 |
618 return tagnode |
618 return tagnode |
619 |
619 |
620 _fnodescachefile = 'cache/hgtagsfnodes1' |
620 _fnodescachefile = 'hgtagsfnodes1' |
621 _fnodesrecsize = 4 + 20 # changeset fragment + filenode |
621 _fnodesrecsize = 4 + 20 # changeset fragment + filenode |
622 _fnodesmissingrec = '\xff' * 24 |
622 _fnodesmissingrec = '\xff' * 24 |
623 |
623 |
624 class hgtagsfnodescache(object): |
624 class hgtagsfnodescache(object): |
625 """Persistent cache mapping revisions to .hgtags filenodes. |
625 """Persistent cache mapping revisions to .hgtags filenodes. |
757 repo = self._repo |
757 repo = self._repo |
758 |
758 |
759 try: |
759 try: |
760 lock = repo.wlock(wait=False) |
760 lock = repo.wlock(wait=False) |
761 except error.LockError: |
761 except error.LockError: |
762 repo.ui.log('tagscache', |
762 repo.ui.log('tagscache', 'not writing .hg/cache/%s because ' |
763 'not writing .hg/%s because lock cannot be acquired\n' % |
763 'lock cannot be acquired\n' % (_fnodescachefile)) |
764 (_fnodescachefile)) |
|
765 return |
764 return |
766 |
765 |
767 try: |
766 try: |
768 f = repo.vfs.open(_fnodescachefile, 'ab') |
767 f = repo.cachevfs.open(_fnodescachefile, 'ab') |
769 try: |
768 try: |
770 # if the file has been truncated |
769 # if the file has been truncated |
771 actualoffset = f.tell() |
770 actualoffset = f.tell() |
772 if actualoffset < self._dirtyoffset: |
771 if actualoffset < self._dirtyoffset: |
773 self._dirtyoffset = actualoffset |
772 self._dirtyoffset = actualoffset |
774 data = self._raw[self._dirtyoffset:] |
773 data = self._raw[self._dirtyoffset:] |
775 f.seek(self._dirtyoffset) |
774 f.seek(self._dirtyoffset) |
776 f.truncate() |
775 f.truncate() |
777 repo.ui.log('tagscache', |
776 repo.ui.log('tagscache', |
778 'writing %d bytes to %s\n' % ( |
777 'writing %d bytes to cache/%s\n' % ( |
779 len(data), _fnodescachefile)) |
778 len(data), _fnodescachefile)) |
780 f.write(data) |
779 f.write(data) |
781 self._dirtyoffset = None |
780 self._dirtyoffset = None |
782 finally: |
781 finally: |
783 f.close() |
782 f.close() |
784 except (IOError, OSError) as inst: |
783 except (IOError, OSError) as inst: |
785 repo.ui.log('tagscache', |
784 repo.ui.log('tagscache', |
786 "couldn't write %s: %s\n" % ( |
785 "couldn't write cache/%s: %s\n" % ( |
787 _fnodescachefile, inst)) |
786 _fnodescachefile, inst)) |
788 finally: |
787 finally: |
789 lock.release() |
788 lock.release() |