# HG changeset patch # User Anton Shestakov # Date 1627469107 -10800 # Node ID 2cd00052ae4d04e8b06de393536647b1b231ed8f # Parent e69c82bf3a0122ac032834f2bb8b092fcc82e8db obsolete: disable other evolution config options if createmarkers is off We used to raise an abort in this case, but recent changes to local clone command (377d8fc20e34) resulted in destrepo both caring about experimental.evolution config options and not initializing extensions. So imagine if you had evolve and allowdivergence enabled in your ~/.hgrc. Local clone stopped working after 377d8fc20e34 because evolve sets experimental.evolution=all, but only on srcrepo, for destrepo the extension is not initialized. It's possible to make local cloning work by initializing extensions for destrepo in some cases, but in other cases (e.g. allowdivergence in ~/.hgrc, evolve extension in original-repo/.hg/hgrc) it would still fail. In a discussion with Pierre-Yves David it was decided to simply force other evolution options to be false if createmarkers is not enabled. Differential Revision: https://phab.mercurial-scm.org/D11223 diff -r e69c82bf3a01 -r 2cd00052ae4d mercurial/obsolete.py --- a/mercurial/obsolete.py Wed Jul 28 13:47:21 2021 +0300 +++ b/mercurial/obsolete.py Wed Jul 28 13:45:07 2021 +0300 @@ -144,20 +144,16 @@ """Returns dicts showing state of obsolescence features.""" createmarkersvalue = _getoptionvalue(repo, createmarkersopt) - unstablevalue = _getoptionvalue(repo, allowunstableopt) - divergencevalue = _getoptionvalue(repo, allowdivergenceopt) - exchangevalue = _getoptionvalue(repo, exchangeopt) - - # createmarkers must be enabled if other options are enabled - if ( - unstablevalue or divergencevalue or exchangevalue - ) and not createmarkersvalue: - raise error.Abort( - _( - b"'createmarkers' obsolete option must be enabled " - b"if other obsolete options are enabled" - ) - ) + if createmarkersvalue: + unstablevalue = _getoptionvalue(repo, allowunstableopt) + divergencevalue = _getoptionvalue(repo, allowdivergenceopt) + exchangevalue = _getoptionvalue(repo, exchangeopt) + else: + # if we cannot create obsolescence markers, we shouldn't exchange them + # or perform operations that lead to instability or divergence + unstablevalue = False + divergencevalue = False + exchangevalue = False return { createmarkersopt: createmarkersvalue, diff -r e69c82bf3a01 -r 2cd00052ae4d tests/test-clone.t --- a/tests/test-clone.t Wed Jul 28 13:47:21 2021 +0300 +++ b/tests/test-clone.t Wed Jul 28 13:45:07 2021 +0300 @@ -580,6 +580,24 @@ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved $ rm -r ua +Local clones don't get confused by unusual experimental.evolution options + + $ hg clone \ + > --config experimental.evolution=allowunstable,allowdivergence,exchange \ + > a ua + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ rm -r ua + + $ hg clone \ + > --config experimental.evolution.createmarkers=no \ + > --config experimental.evolution.allowunstable=yes \ + > --config experimental.evolution.allowdivergence=yes \ + > --config experimental.evolution.exchange=yes \ + > a ua + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ rm -r ua Test clone with special '@' bookmark: $ cd a