Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/localrepo.py @ 28164:ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
This patch extracts the code for determining requirements for a new
repo into a standalone function. By doing so, future code that will
perform an in-place repository upgrade (e.g. to generaldelta) can
examine the set of proposed new requirements and possibly take
additional actions (such as adding dotencode or fncache) when
performing the upgrade.
This patch is marked as API because _baserequirements (which was added
in b090601a80d1 so extensions could override it) has been removed and
will presumably impact whatever extension it was added for. Consumers
should be able to monkeypatch the new function to achieve the same
functionality.
The "create" argument has been dropped because the function is only
called in one location and "create" is always true in that case.
While it makes logical sense for this code to be a method so extensions
can implement a custom repo class / method to override it, this won't
actually work. This is because requirements determination occurs during
localrepository.__init__ and this is before the "reposetup"
"callback" is fired. So, the only way for extensions to customize
requirements would be to overwrite localrepo.localrepository or to
monkeypatch a function on a module during extsetup(). Since we try to
keep localrepository small, we use a standalone function. There is
probably room to offer extensions a "hook" point to alter repository
creation. But that is scope bloat.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 15 Feb 2016 13:20:20 -0800 |
parents | 5d3495e394d5 |
children | ddc07ddcca94 |
comparison
equal
deleted
inserted
replaced
28163:5d3495e394d5 | 28164:ad11edefa7c4 |
---|---|
240 | 240 |
241 # a list of (ui, featureset) functions. | 241 # a list of (ui, featureset) functions. |
242 # only functions defined in module of enabled extensions are invoked | 242 # only functions defined in module of enabled extensions are invoked |
243 featuresetupfuncs = set() | 243 featuresetupfuncs = set() |
244 | 244 |
245 def _baserequirements(self, create): | |
246 return ['revlogv1'] | |
247 | |
248 def __init__(self, baseui, path=None, create=False): | 245 def __init__(self, baseui, path=None, create=False): |
249 self.requirements = set() | 246 self.requirements = set() |
250 self.wvfs = scmutil.vfs(path, expandpath=True, realpath=True) | 247 self.wvfs = scmutil.vfs(path, expandpath=True, realpath=True) |
251 self.wopener = self.wvfs | 248 self.wopener = self.wvfs |
252 self.root = self.wvfs.base | 249 self.root = self.wvfs.base |
280 else: | 277 else: |
281 self.supported = self._basesupported | 278 self.supported = self._basesupported |
282 | 279 |
283 if not self.vfs.isdir(): | 280 if not self.vfs.isdir(): |
284 if create: | 281 if create: |
285 requirements = set(self._baserequirements(create)) | 282 self.requirements = newreporequirements(self) |
286 if self.ui.configbool('format', 'usestore', True): | |
287 requirements.add("store") | |
288 if self.ui.configbool('format', 'usefncache', True): | |
289 requirements.add("fncache") | |
290 if self.ui.configbool('format', 'dotencode', True): | |
291 requirements.add('dotencode') | |
292 | |
293 if scmutil.gdinitconfig(self.ui): | |
294 requirements.add("generaldelta") | |
295 if self.ui.configbool('experimental', 'treemanifest', False): | |
296 requirements.add("treemanifest") | |
297 if self.ui.configbool('experimental', 'manifestv2', False): | |
298 requirements.add("manifestv2") | |
299 | |
300 self.requirements = requirements | |
301 | 283 |
302 if not self.wvfs.exists(): | 284 if not self.wvfs.exists(): |
303 self.wvfs.makedirs() | 285 self.wvfs.makedirs() |
304 self.vfs.makedir(notindexed=True) | 286 self.vfs.makedir(notindexed=True) |
305 | 287 |
306 if 'store' in requirements: | 288 if 'store' in self.requirements: |
307 self.vfs.mkdir("store") | 289 self.vfs.mkdir("store") |
308 | 290 |
309 # create an invalid changelog | 291 # create an invalid changelog |
310 self.vfs.append( | 292 self.vfs.append( |
311 "00changelog.i", | 293 "00changelog.i", |
1967 def instance(ui, path, create): | 1949 def instance(ui, path, create): |
1968 return localrepository(ui, util.urllocalpath(path), create) | 1950 return localrepository(ui, util.urllocalpath(path), create) |
1969 | 1951 |
1970 def islocal(path): | 1952 def islocal(path): |
1971 return True | 1953 return True |
1954 | |
1955 def newreporequirements(repo): | |
1956 """Determine the set of requirements for a new local repository. | |
1957 | |
1958 Extensions can wrap this function to specify custom requirements for | |
1959 new repositories. | |
1960 """ | |
1961 ui = repo.ui | |
1962 requirements = set(['revlogv1']) | |
1963 if ui.configbool('format', 'usestore', True): | |
1964 requirements.add('store') | |
1965 if ui.configbool('format', 'usefncache', True): | |
1966 requirements.add('fncache') | |
1967 if ui.configbool('format', 'dotencode', True): | |
1968 requirements.add('dotencode') | |
1969 | |
1970 if scmutil.gdinitconfig(ui): | |
1971 requirements.add('generaldelta') | |
1972 if ui.configbool('experimental', 'treemanifest', False): | |
1973 requirements.add('treemanifest') | |
1974 if ui.configbool('experimental', 'manifestv2', False): | |
1975 requirements.add('manifestv2') | |
1976 | |
1977 return requirements |