mercurial/localrepo.py
changeset 45373 d7dcc75a3eae
parent 45372 77b8588dd84e
child 45386 034d94f8761b
equal deleted inserted replaced
45372:77b8588dd84e 45373:d7dcc75a3eae
   424         return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
   424         return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
   425 
   425 
   426     # End of baselegacywirecommands interface.
   426     # End of baselegacywirecommands interface.
   427 
   427 
   428 
   428 
   429 # Increment the sub-version when the revlog v2 format changes to lock out old
       
   430 # clients.
       
   431 REVLOGV2_REQUIREMENT = b'exp-revlogv2.1'
       
   432 
       
   433 # A repository with the sparserevlog feature will have delta chains that
       
   434 # can spread over a larger span. Sparse reading cuts these large spans into
       
   435 # pieces, so that each piece isn't too big.
       
   436 # Without the sparserevlog capability, reading from the repository could use
       
   437 # huge amounts of memory, because the whole span would be read at once,
       
   438 # including all the intermediate revisions that aren't pertinent for the chain.
       
   439 # This is why once a repository has enabled sparse-read, it becomes required.
       
   440 SPARSEREVLOG_REQUIREMENT = b'sparserevlog'
       
   441 
       
   442 # A repository with the sidedataflag requirement will allow to store extra
       
   443 # information for revision without altering their original hashes.
       
   444 SIDEDATA_REQUIREMENT = b'exp-sidedata-flag'
       
   445 
       
   446 # A repository with the the copies-sidedata-changeset requirement will store
       
   447 # copies related information in changeset's sidedata.
       
   448 COPIESSDC_REQUIREMENT = b'exp-copies-sidedata-changeset'
       
   449 
       
   450 # The repository use persistent nodemap for the changelog and the manifest.
       
   451 NODEMAP_REQUIREMENT = b'persistent-nodemap'
       
   452 
       
   453 # Functions receiving (ui, features) that extensions can register to impact
   429 # Functions receiving (ui, features) that extensions can register to impact
   454 # the ability to load repositories with custom requirements. Only
   430 # the ability to load repositories with custom requirements. Only
   455 # functions defined in loaded extensions are called.
   431 # functions defined in loaded extensions are called.
   456 #
   432 #
   457 # The function receives a set of requirement strings that the repository
   433 # The function receives a set of requirement strings that the repository
   861     # In the absence of another requirement superseding a revlog-related
   837     # In the absence of another requirement superseding a revlog-related
   862     # requirement, we have to assume the repo is using revlog version 0.
   838     # requirement, we have to assume the repo is using revlog version 0.
   863     # This revlog format is super old and we don't bother trying to parse
   839     # This revlog format is super old and we don't bother trying to parse
   864     # opener options for it because those options wouldn't do anything
   840     # opener options for it because those options wouldn't do anything
   865     # meaningful on such old repos.
   841     # meaningful on such old repos.
   866     if b'revlogv1' in requirements or REVLOGV2_REQUIREMENT in requirements:
   842     if (
       
   843         b'revlogv1' in requirements
       
   844         or requirementsmod.REVLOGV2_REQUIREMENT in requirements
       
   845     ):
   867         options.update(resolverevlogstorevfsoptions(ui, requirements, features))
   846         options.update(resolverevlogstorevfsoptions(ui, requirements, features))
   868     else:  # explicitly mark repo as using revlogv0
   847     else:  # explicitly mark repo as using revlogv0
   869         options[b'revlogv0'] = True
   848         options[b'revlogv0'] = True
   870 
   849 
   871     if COPIESSDC_REQUIREMENT in requirements:
   850     if requirementsmod.COPIESSDC_REQUIREMENT in requirements:
   872         options[b'copies-storage'] = b'changeset-sidedata'
   851         options[b'copies-storage'] = b'changeset-sidedata'
   873     else:
   852     else:
   874         writecopiesto = ui.config(b'experimental', b'copies.write-to')
   853         writecopiesto = ui.config(b'experimental', b'copies.write-to')
   875         copiesextramode = (b'changeset-only', b'compatibility')
   854         copiesextramode = (b'changeset-only', b'compatibility')
   876         if writecopiesto in copiesextramode:
   855         if writecopiesto in copiesextramode:
   885     options = {}
   864     options = {}
   886     options[b'flagprocessors'] = {}
   865     options[b'flagprocessors'] = {}
   887 
   866 
   888     if b'revlogv1' in requirements:
   867     if b'revlogv1' in requirements:
   889         options[b'revlogv1'] = True
   868         options[b'revlogv1'] = True
   890     if REVLOGV2_REQUIREMENT in requirements:
   869     if requirementsmod.REVLOGV2_REQUIREMENT in requirements:
   891         options[b'revlogv2'] = True
   870         options[b'revlogv2'] = True
   892 
   871 
   893     if b'generaldelta' in requirements:
   872     if b'generaldelta' in requirements:
   894         options[b'generaldelta'] = True
   873         options[b'generaldelta'] = True
   895 
   874 
   929     srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
   908     srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
   930     options[b'with-sparse-read'] = withsparseread
   909     options[b'with-sparse-read'] = withsparseread
   931     options[b'sparse-read-density-threshold'] = srdensitythres
   910     options[b'sparse-read-density-threshold'] = srdensitythres
   932     options[b'sparse-read-min-gap-size'] = srmingapsize
   911     options[b'sparse-read-min-gap-size'] = srmingapsize
   933 
   912 
   934     sparserevlog = SPARSEREVLOG_REQUIREMENT in requirements
   913     sparserevlog = requirementsmod.SPARSEREVLOG_REQUIREMENT in requirements
   935     options[b'sparse-revlog'] = sparserevlog
   914     options[b'sparse-revlog'] = sparserevlog
   936     if sparserevlog:
   915     if sparserevlog:
   937         options[b'generaldelta'] = True
   916         options[b'generaldelta'] = True
   938 
   917 
   939     sidedata = SIDEDATA_REQUIREMENT in requirements
   918     sidedata = requirementsmod.SIDEDATA_REQUIREMENT in requirements
   940     options[b'side-data'] = sidedata
   919     options[b'side-data'] = sidedata
   941 
   920 
   942     maxchainlen = None
   921     maxchainlen = None
   943     if sparserevlog:
   922     if sparserevlog:
   944         maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
   923         maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
   970     if requirementsmod.NARROW_REQUIREMENT in requirements:
   949     if requirementsmod.NARROW_REQUIREMENT in requirements:
   971         options[b'enableellipsis'] = True
   950         options[b'enableellipsis'] = True
   972 
   951 
   973     if ui.configbool(b'experimental', b'rust.index'):
   952     if ui.configbool(b'experimental', b'rust.index'):
   974         options[b'rust.index'] = True
   953         options[b'rust.index'] = True
   975     if NODEMAP_REQUIREMENT in requirements:
   954     if requirementsmod.NODEMAP_REQUIREMENT in requirements:
   976         options[b'persistent-nodemap'] = True
   955         options[b'persistent-nodemap'] = True
   977     if ui.configbool(b'storage', b'revlog.nodemap.mmap'):
   956     if ui.configbool(b'storage', b'revlog.nodemap.mmap'):
   978         options[b'persistent-nodemap.mmap'] = True
   957         options[b'persistent-nodemap.mmap'] = True
   979     epnm = ui.config(b'storage', b'revlog.nodemap.mode')
   958     epnm = ui.config(b'storage', b'revlog.nodemap.mode')
   980     options[b'persistent-nodemap.mode'] = epnm
   959     options[b'persistent-nodemap.mode'] = epnm
  1056     #    chains), and the code was deleted in 4.6.
  1035     #    chains), and the code was deleted in 4.6.
  1057     supportedformats = {
  1036     supportedformats = {
  1058         b'revlogv1',
  1037         b'revlogv1',
  1059         b'generaldelta',
  1038         b'generaldelta',
  1060         requirementsmod.TREEMANIFEST_REQUIREMENT,
  1039         requirementsmod.TREEMANIFEST_REQUIREMENT,
  1061         COPIESSDC_REQUIREMENT,
  1040         requirementsmod.COPIESSDC_REQUIREMENT,
  1062         REVLOGV2_REQUIREMENT,
  1041         requirementsmod.REVLOGV2_REQUIREMENT,
  1063         SIDEDATA_REQUIREMENT,
  1042         requirementsmod.SIDEDATA_REQUIREMENT,
  1064         SPARSEREVLOG_REQUIREMENT,
  1043         requirementsmod.SPARSEREVLOG_REQUIREMENT,
  1065         NODEMAP_REQUIREMENT,
  1044         requirementsmod.NODEMAP_REQUIREMENT,
  1066         bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
  1045         bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
  1067     }
  1046     }
  1068     _basesupported = supportedformats | {
  1047     _basesupported = supportedformats | {
  1069         b'store',
  1048         b'store',
  1070         b'fncache',
  1049         b'fncache',
  1239         self._sparsematchercache = {}
  1218         self._sparsematchercache = {}
  1240 
  1219 
  1241         self._extrafilterid = repoview.extrafilter(ui)
  1220         self._extrafilterid = repoview.extrafilter(ui)
  1242 
  1221 
  1243         self.filecopiesmode = None
  1222         self.filecopiesmode = None
  1244         if COPIESSDC_REQUIREMENT in self.requirements:
  1223         if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements:
  1245             self.filecopiesmode = b'changeset-sidedata'
  1224             self.filecopiesmode = b'changeset-sidedata'
  1246 
  1225 
  1247     def _getvfsward(self, origfunc):
  1226     def _getvfsward(self, origfunc):
  1248         """build a ward for self.vfs"""
  1227         """build a ward for self.vfs"""
  1249         rref = weakref.ref(self)
  1228         rref = weakref.ref(self)
  3306         requirements.add(b'exp-compression-%s' % compengine)
  3285         requirements.add(b'exp-compression-%s' % compengine)
  3307 
  3286 
  3308     if scmutil.gdinitconfig(ui):
  3287     if scmutil.gdinitconfig(ui):
  3309         requirements.add(b'generaldelta')
  3288         requirements.add(b'generaldelta')
  3310         if ui.configbool(b'format', b'sparse-revlog'):
  3289         if ui.configbool(b'format', b'sparse-revlog'):
  3311             requirements.add(SPARSEREVLOG_REQUIREMENT)
  3290             requirements.add(requirementsmod.SPARSEREVLOG_REQUIREMENT)
  3312 
  3291 
  3313     # experimental config: format.exp-use-side-data
  3292     # experimental config: format.exp-use-side-data
  3314     if ui.configbool(b'format', b'exp-use-side-data'):
  3293     if ui.configbool(b'format', b'exp-use-side-data'):
  3315         requirements.add(SIDEDATA_REQUIREMENT)
  3294         requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
  3316     # experimental config: format.exp-use-copies-side-data-changeset
  3295     # experimental config: format.exp-use-copies-side-data-changeset
  3317     if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
  3296     if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
  3318         requirements.add(SIDEDATA_REQUIREMENT)
  3297         requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
  3319         requirements.add(COPIESSDC_REQUIREMENT)
  3298         requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
  3320     if ui.configbool(b'experimental', b'treemanifest'):
  3299     if ui.configbool(b'experimental', b'treemanifest'):
  3321         requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
  3300         requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
  3322 
  3301 
  3323     revlogv2 = ui.config(b'experimental', b'revlogv2')
  3302     revlogv2 = ui.config(b'experimental', b'revlogv2')
  3324     if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
  3303     if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
  3325         requirements.remove(b'revlogv1')
  3304         requirements.remove(b'revlogv1')
  3326         # generaldelta is implied by revlogv2.
  3305         # generaldelta is implied by revlogv2.
  3327         requirements.discard(b'generaldelta')
  3306         requirements.discard(b'generaldelta')
  3328         requirements.add(REVLOGV2_REQUIREMENT)
  3307         requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
  3329     # experimental config: format.internal-phase
  3308     # experimental config: format.internal-phase
  3330     if ui.configbool(b'format', b'internal-phase'):
  3309     if ui.configbool(b'format', b'internal-phase'):
  3331         requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
  3310         requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
  3332 
  3311 
  3333     if createopts.get(b'narrowfiles'):
  3312     if createopts.get(b'narrowfiles'):
  3338 
  3317 
  3339     if ui.configbool(b'format', b'bookmarks-in-store'):
  3318     if ui.configbool(b'format', b'bookmarks-in-store'):
  3340         requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
  3319         requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
  3341 
  3320 
  3342     if ui.configbool(b'format', b'use-persistent-nodemap'):
  3321     if ui.configbool(b'format', b'use-persistent-nodemap'):
  3343         requirements.add(NODEMAP_REQUIREMENT)
  3322         requirements.add(requirementsmod.NODEMAP_REQUIREMENT)
  3344 
  3323 
  3345     return requirements
  3324     return requirements
  3346 
  3325 
  3347 
  3326 
  3348 def checkrequirementscompat(ui, requirements):
  3327 def checkrequirementscompat(ui, requirements):