diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -438,6 +438,19 @@ # Then we validate that the known set is reasonable to use together. ensurerequirementscompatible(ui, requirements) + # TODO there are unhandled edge cases related to opening repositories with + # shared storage. If storage is shared, we should also test for requirements + # compatibility in the pointed-to repo. This entails loading the .hg/hgrc in + # that repo, as that repo may load extensions needed to open it. This is a + # bit complicated because we don't want the other hgrc to overwrite settings + # in this hgrc. + # + # This bug is somewhat mitigated by the fact that we copy the .hg/requires + # file when sharing repos. But if a requirement is added after the share is + # performed, thereby introducing a new requirement for the opener, we may + # will not see that and could encounter a run-time error interacting with + # that shared store since it has an unknown-to-us requirement. + # At this point, we know we should be capable of opening the repository. # Now get on with doing that. diff --git a/tests/test-share.t b/tests/test-share.t --- a/tests/test-share.t +++ b/tests/test-share.t @@ -439,6 +439,29 @@ $ rm -r thatdir +Demonstrate buggy behavior around requirements validation +See comment in localrepo.py:makelocalrepository() for more. + + $ hg init sharenewrequires + $ hg share sharenewrequires shareoldrequires + updating working directory + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ cat >> sharenewrequires/.hg/requires << EOF + > missing-requirement + > EOF + +We cannot open the repo with the unknown requirement + + $ hg -R sharenewrequires status + abort: repository requires features unknown to this Mercurial: missing-requirement! + (see https://mercurial-scm.org/wiki/MissingRequirement for more information) + [255] + +BUG: we don't get the same error when opening the shared repo pointing to it + + $ hg -R shareoldrequires status + Explicitly kill daemons to let the test exit on Windows $ killdaemons.py