diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -558,6 +558,16 @@ # is present. We never write SHARESAFE_REQUIREMENT for a repo if store # is not present, refer checkrequirementscompat() for that if requirementsmod.SHARESAFE_REQUIREMENT in requirements: + + if ( + shared + and requirementsmod.SHARESAFE_REQUIREMENT + not in _readrequires(sharedvfs, True) + ): + raise error.Abort( + _(b"share source does not support exp-sharesafe requirement") + ) + if shared: # This is a shared repo storevfs = vfsmod.vfs(sharedvfs.join(b'store')) diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py --- a/mercurial/upgrade.py +++ b/mercurial/upgrade.py @@ -80,6 +80,7 @@ requirements.SIDEDATA_REQUIREMENT, requirements.COPIESSDC_REQUIREMENT, requirements.NODEMAP_REQUIREMENT, + requirements.SHARESAFE_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -1470,3 +1471,11 @@ b' New shares will be created in safe mode.\n' ) ) + if sharedsafe.name in removedreqs: + ui.warn( + _( + b'repository downgraded to not use share safe mode, ' + b'existing shares will not work and needs to' + b' be reshared.\n' + ) + ) diff --git a/tests/test-share-safe.t b/tests/test-share-safe.t --- a/tests/test-share-safe.t +++ b/tests/test-share-safe.t @@ -377,4 +377,79 @@ | o f3ba8b99bb6f897c87bbc1c07b75c6ddf43a4f77: added foo + + +Create a safe share from upgrade one + + $ cd .. + $ hg share non-share-safe ss-share + updating working directory + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ss-share + $ hg log -GT "{node}: {desc}\n" + @ f63db81e6dde1d9c78814167f77fb1fb49283f4f: added bar + | + o f3ba8b99bb6f897c87bbc1c07b75c6ddf43a4f77: added foo + + $ cd ../non-share-safe + +Test that downgrading works too + + $ cat >> $HGRCPATH < [extensions] + > share = + > [format] + > exp-share-safe = False + > EOF + + $ hg debugupgraderepo -q + requirements + preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store + removed: exp-sharesafe + + $ hg debugupgraderepo -q --run + upgrade will perform the following actions: + + requirements + preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store + removed: exp-sharesafe + + repository downgraded to not use share safe mode, existing shares will not work and needs to be reshared. + + $ hg debugrequirements + dotencode + fncache + generaldelta + revlogv1 + sparserevlog + store + + $ cat .hg/requires + dotencode + fncache + generaldelta + revlogv1 + sparserevlog + store + + $ test -f .hg/store/requires + [1] + + $ hg log -GT "{node}: {desc}\n" + @ f63db81e6dde1d9c78814167f77fb1fb49283f4f: added bar + | + o f3ba8b99bb6f897c87bbc1c07b75c6ddf43a4f77: added foo + + +Make sure existing shares still works + + $ hg log -GT "{node}: {desc}\n" -R ../nss-share + @ f63db81e6dde1d9c78814167f77fb1fb49283f4f: added bar + | + o f3ba8b99bb6f897c87bbc1c07b75c6ddf43a4f77: added foo + $ hg unshare -R ../nss-share + + $ hg log -GT "{node}: {desc}\n" -R ../ss-share + abort: share source does not support exp-sharesafe requirement + [255]