# HG changeset patch # User Gregory Szorc # Date 2018-10-19 12:59:03 # Node ID 7e3b6c4f01a2b67b7665353282b81e2721beadce # Parent 1b183edbb68e24af2c1d98b8340d3d1a9f475d5a localrepo: support marking repos as having shallow file storage Various operations against repositories need to know if repository storage is full or partial. For example, a checkout (including possibly a widening of a sparse checkout), needs to know if it can assume all file revisions are available or whether to look for missing revisions first. This commit lays the plumbing for doing that. We define a repo creation option that indicates that shallow file storage is desired. The SQLite store uses this creation option to add an extra repo requirement indicating file storage is shallow. A new repository feature has been added to indicate that file storage is shallow. The SQLite store adds this feature when the shallow file store requirement is present. Code can now look at repo.features to determine if repo file storage may be shallow and take additional actions if so. While we're here, we also teach the SQLite store to handle the narrow repo requirement, which gets added when making narrow clones. Differential Revision: https://phab.mercurial-scm.org/D5166 diff --git a/hgext/sqlitestore.py b/hgext/sqlitestore.py --- a/hgext/sqlitestore.py +++ b/hgext/sqlitestore.py @@ -101,6 +101,7 @@ REQUIREMENT = b'exp-sqlite-001' REQUIREMENT_ZSTD = b'exp-sqlite-comp-001=zstd' REQUIREMENT_ZLIB = b'exp-sqlite-comp-001=zlib' REQUIREMENT_NONE = b'exp-sqlite-comp-001=none' +REQUIREMENT_SHALLOW_FILES = b'exp-sqlite-shallow-files' CURRENT_SCHEMA_VERSION = 1 @@ -1014,6 +1015,8 @@ def featuresetup(ui, supported): supported.add(REQUIREMENT_ZLIB) supported.add(REQUIREMENT_NONE) + supported.add(REQUIREMENT_SHALLOW_FILES) + supported.add(repository.NARROW_REQUIREMENT) def newreporequirements(orig, ui, createopts): if createopts['backend'] != 'sqlite': @@ -1030,6 +1033,7 @@ def newreporequirements(orig, ui, create known = { 'narrowfiles', 'backend', + 'shallowfilestore', } unsupported = set(createopts) - known @@ -1061,6 +1065,9 @@ def newreporequirements(orig, ui, create raise error.Abort(_('unknown compression engine defined in ' 'storage.sqlite.compression: %s') % compression) + if createopts.get('shallowfilestore'): + requirements.add(REQUIREMENT_SHALLOW_FILES) + return requirements @interfaceutil.implementer(repository.ilocalrepositoryfilestorage) @@ -1082,12 +1089,15 @@ class sqlitefilestorage(object): return sqlitefilestore(self._dbconn, path, compression) -def makefilestorage(orig, requirements, **kwargs): +def makefilestorage(orig, requirements, features, **kwargs): """Produce a type conforming to ``ilocalrepositoryfilestorage``.""" if REQUIREMENT in requirements: + if REQUIREMENT_SHALLOW_FILES in requirements: + features.add(repository.REPO_FEATURE_SHALLOW_FILE_STORAGE) + return sqlitefilestorage else: - return orig(requirements=requirements, **kwargs) + return orig(requirements=requirements, features=features, **kwargs) def makemain(orig, ui, requirements, **kwargs): if REQUIREMENT in requirements: diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -578,6 +578,9 @@ def clone(ui, peeropts, source, dest=Non createopts['narrowfiles'] = True + if depth: + createopts['shallowfilestore'] = True + if srcpeer.capable(b'lfs-serve'): # Repository creation honors the config if it disabled the extension, so # we can't just announce that lfs will be enabled. This check avoids diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -2922,6 +2922,7 @@ def filterknowncreateopts(ui, createopts 'sharedrepo', 'sharedrelative', 'shareditems', + 'shallowfilestore', } return {k: v for k, v in createopts.items() if k not in known} @@ -2949,6 +2950,9 @@ def createrepository(ui, path, createopt is stored as an absolute path. shareditems Set of items to share to the new repository (in addition to storage). + shallowfilestore + Indicates that storage for files should be shallow (not all ancestor + revisions are known). """ createopts = defaultcreateopts(ui, createopts=createopts) diff --git a/mercurial/repository.py b/mercurial/repository.py --- a/mercurial/repository.py +++ b/mercurial/repository.py @@ -29,6 +29,8 @@ REPO_FEATURE_SHARED_STORAGE = b'sharedst REPO_FEATURE_LFS = b'lfs' # Repository supports being stream cloned. REPO_FEATURE_STREAM_CLONE = b'streamclone' +# Files storage may lack data for all ancestors. +REPO_FEATURE_SHALLOW_FILE_STORAGE = b'shallowfilestorage' REVISION_FLAG_CENSORED = 1 << 15 REVISION_FLAG_ELLIPSIS = 1 << 14