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): |