543 ) |
543 ) |
544 |
544 |
545 raise error.RepoError(_(b'repository %s not found') % path) |
545 raise error.RepoError(_(b'repository %s not found') % path) |
546 |
546 |
547 requirements = _readrequires(hgvfs, True) |
547 requirements = _readrequires(hgvfs, True) |
|
548 shared = ( |
|
549 requirementsmod.SHARED_REQUIREMENT in requirements |
|
550 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements |
|
551 ) |
|
552 if shared: |
|
553 sharedvfs = _getsharedvfs(hgvfs, requirements) |
|
554 |
|
555 # if .hg/requires contains the sharesafe requirement, it means |
|
556 # there exists a `.hg/store/requires` too and we should read it |
|
557 # NOTE: presence of SHARESAFE_REQUIREMENT imply that store requirement |
|
558 # is present. We never write SHARESAFE_REQUIREMENT for a repo if store |
|
559 # is not present, refer checkrequirementscompat() for that |
|
560 if requirementsmod.SHARESAFE_REQUIREMENT in requirements: |
|
561 if shared: |
|
562 # This is a shared repo |
|
563 storevfs = vfsmod.vfs(sharedvfs.join(b'store')) |
|
564 else: |
|
565 storevfs = vfsmod.vfs(hgvfs.join(b'store')) |
|
566 |
|
567 requirements |= _readrequires(storevfs, False) |
548 |
568 |
549 # The .hg/hgrc file may load extensions or contain config options |
569 # The .hg/hgrc file may load extensions or contain config options |
550 # that influence repository construction. Attempt to load it and |
570 # that influence repository construction. Attempt to load it and |
551 # process any new extensions that it may have pulled in. |
571 # process any new extensions that it may have pulled in. |
552 if loadhgrc(ui, wdirvfs, hgvfs, requirements): |
572 if loadhgrc(ui, wdirvfs, hgvfs, requirements): |
585 |
605 |
586 # The "store" part of the repository holds versioned data. How it is |
606 # The "store" part of the repository holds versioned data. How it is |
587 # accessed is determined by various requirements. If `shared` or |
607 # accessed is determined by various requirements. If `shared` or |
588 # `relshared` requirements are present, this indicates current repository |
608 # `relshared` requirements are present, this indicates current repository |
589 # is a share and store exists in path mentioned in `.hg/sharedpath` |
609 # is a share and store exists in path mentioned in `.hg/sharedpath` |
590 shared = ( |
|
591 requirementsmod.SHARED_REQUIREMENT in requirements |
|
592 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements |
|
593 ) |
|
594 if shared: |
610 if shared: |
595 sharedvfs = _getsharedvfs(hgvfs, requirements) |
|
596 storebasepath = sharedvfs.base |
611 storebasepath = sharedvfs.base |
597 cachepath = sharedvfs.join(b'cache') |
612 cachepath = sharedvfs.join(b'cache') |
598 features.add(repository.REPO_FEATURE_SHARED_STORAGE) |
613 features.add(repository.REPO_FEATURE_SHARED_STORAGE) |
599 else: |
614 else: |
600 storebasepath = hgvfs.base |
615 storebasepath = hgvfs.base |
1046 requirementsmod.REVLOGV2_REQUIREMENT, |
1061 requirementsmod.REVLOGV2_REQUIREMENT, |
1047 requirementsmod.SIDEDATA_REQUIREMENT, |
1062 requirementsmod.SIDEDATA_REQUIREMENT, |
1048 requirementsmod.SPARSEREVLOG_REQUIREMENT, |
1063 requirementsmod.SPARSEREVLOG_REQUIREMENT, |
1049 requirementsmod.NODEMAP_REQUIREMENT, |
1064 requirementsmod.NODEMAP_REQUIREMENT, |
1050 bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT, |
1065 bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT, |
|
1066 requirementsmod.SHARESAFE_REQUIREMENT, |
1051 } |
1067 } |
1052 _basesupported = supportedformats | { |
1068 _basesupported = supportedformats | { |
1053 b'store', |
1069 b'store', |
1054 b'fncache', |
1070 b'fncache', |
1055 requirementsmod.SHARED_REQUIREMENT, |
1071 requirementsmod.SHARED_REQUIREMENT, |
3327 requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT) |
3343 requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT) |
3328 |
3344 |
3329 if ui.configbool(b'format', b'use-persistent-nodemap'): |
3345 if ui.configbool(b'format', b'use-persistent-nodemap'): |
3330 requirements.add(requirementsmod.NODEMAP_REQUIREMENT) |
3346 requirements.add(requirementsmod.NODEMAP_REQUIREMENT) |
3331 |
3347 |
|
3348 # if share-safe is enabled, let's create the new repository with the new |
|
3349 # requirement |
|
3350 if ui.configbool(b'format', b'exp-share-safe'): |
|
3351 requirements.add(requirementsmod.SHARESAFE_REQUIREMENT) |
|
3352 |
3332 return requirements |
3353 return requirements |
3333 |
3354 |
3334 |
3355 |
3335 def checkrequirementscompat(ui, requirements): |
3356 def checkrequirementscompat(ui, requirements): |
3336 """ Checks compatibility of repository requirements enabled and disabled. |
3357 """ Checks compatibility of repository requirements enabled and disabled. |
3359 _( |
3380 _( |
3360 b"cannot create shared repository as source was created" |
3381 b"cannot create shared repository as source was created" |
3361 b" with 'format.usestore' config disabled" |
3382 b" with 'format.usestore' config disabled" |
3362 ) |
3383 ) |
3363 ) |
3384 ) |
|
3385 |
|
3386 if requirementsmod.SHARESAFE_REQUIREMENT in requirements: |
|
3387 ui.warn( |
|
3388 _( |
|
3389 b"ignoring enabled 'format.exp-share-safe' config because " |
|
3390 b"it is incompatible with disabled 'format.usestore'" |
|
3391 b" config\n" |
|
3392 ) |
|
3393 ) |
|
3394 dropped.add(requirementsmod.SHARESAFE_REQUIREMENT) |
3364 |
3395 |
3365 return dropped |
3396 return dropped |
3366 |
3397 |
3367 |
3398 |
3368 def filterknowncreateopts(ui, createopts): |
3399 def filterknowncreateopts(ui, createopts): |
3484 b'00changelog.i', |
3515 b'00changelog.i', |
3485 b'\0\0\0\2 dummy changelog to prevent using the old repo ' |
3516 b'\0\0\0\2 dummy changelog to prevent using the old repo ' |
3486 b'layout', |
3517 b'layout', |
3487 ) |
3518 ) |
3488 |
3519 |
3489 scmutil.writerequires(hgvfs, requirements) |
3520 # Filter the requirements into working copy and store ones |
|
3521 wcreq, storereq = scmutil.filterrequirements(requirements) |
|
3522 # write working copy ones |
|
3523 scmutil.writerequires(hgvfs, wcreq) |
|
3524 # If there are store requirements and the current repository |
|
3525 # is not a shared one, write stored requirements |
|
3526 # For new shared repository, we don't need to write the store |
|
3527 # requirements as they are already present in store requires |
|
3528 if storereq and b'sharedrepo' not in createopts: |
|
3529 scmutil.writerequires(hgvfs, wcreq) |
|
3530 storevfs = vfsmod.vfs(hgvfs.join(b'store'), cacheaudited=True) |
|
3531 scmutil.writerequires(storevfs, storereq) |
3490 |
3532 |
3491 # Write out file telling readers where to find the shared store. |
3533 # Write out file telling readers where to find the shared store. |
3492 if b'sharedrepo' in createopts: |
3534 if b'sharedrepo' in createopts: |
3493 hgvfs.write(b'sharedpath', sharedpath) |
3535 hgvfs.write(b'sharedpath', sharedpath) |
3494 |
3536 |