comparison mercurial/localrepo.py @ 39765:3e801ffd7269

filelog: custom filelog to be used with narrow repos Narrow repos may have file revisions whose copy/rename metadata references files not in the store. This can pose problems when consumers attempt to access a missing referenced file revision. The narrow extension hacks around this problem by implementing a derived filelog type that provides custom implementations of renamed(), size(), and cmp() which handle renames against files not in the narrow spec by silently removing the rename metadata. While silently dropping metadata isn't the most robust solution, it is the easiest to implement. This commit ports the custom narrow filelog class to core. When a narrow repo is constructed, its ifilestorage creation function will automatically use the new filelog type. This means the extra logic is 0 cost for non-narrow repos and shouldn't interfere with their operation. Differential Revision: https://phab.mercurial-scm.org/D4643
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 13 Sep 2018 16:02:22 -0700
parents e4e881572382
children 7aa440222323
comparison
equal deleted inserted replaced
39764:e4e881572382 39765:3e801ffd7269
741 if path[0] == b'/': 741 if path[0] == b'/':
742 path = path[1:] 742 path = path[1:]
743 743
744 return filelog.filelog(self.svfs, path) 744 return filelog.filelog(self.svfs, path)
745 745
746 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
747 class revlognarrowfilestorage(object):
748 """File storage when using revlogs and narrow files."""
749
750 def file(self, path):
751 if path[0] == b'/':
752 path = path[1:]
753
754 return filelog.narrowfilelog(self.svfs, path, self.narrowmatch())
755
746 def makefilestorage(requirements, **kwargs): 756 def makefilestorage(requirements, **kwargs):
747 """Produce a type conforming to ``ilocalrepositoryfilestorage``.""" 757 """Produce a type conforming to ``ilocalrepositoryfilestorage``."""
748 return revlogfilestorage 758 if repository.NARROW_REQUIREMENT in requirements:
759 return revlognarrowfilestorage
760 else:
761 return revlogfilestorage
749 762
750 # List of repository interfaces and factory functions for them. Each 763 # List of repository interfaces and factory functions for them. Each
751 # will be called in order during ``makelocalrepository()`` to iteratively 764 # will be called in order during ``makelocalrepository()`` to iteratively
752 # derive the final type for a local repository instance. 765 # derive the final type for a local repository instance.
753 REPO_INTERFACES = [ 766 REPO_INTERFACES = [