changeset 48242:4d2ab365699e

bookmarks: move the `mirror` option to the `paths` section A new `bookmarks` section with a `mirror` option have been added. That option has never been released yet. This new options is limited since it affect all paths without distinction. In case where a repository is interacting with multiple peers, being able to control behavior on a path basis can be quite valuable. In addition, having more variant of behavior would be interesting, especially a mode where no bookmark exchanged is tried at all. Such new mode (implemented later) make a lot of sense for configuration on a path-basis. Configuration of the default behavior is still possible through the usage of generic path configuration. The "old" config, becomes: [bookmarks] mirror=True becomes: [path] *:bookmarks.mode=mirror Differential Revision: https://phab.mercurial-scm.org/D11675
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 15 Oct 2021 03:49:05 +0200
parents 7d1e60244561
children 76c071bba40d
files mercurial/bookmarks.py mercurial/configitems.py mercurial/exchange.py mercurial/helptext/config.txt mercurial/utils/urlutil.py relnotes/next tests/test-bookmarks-pushpull.t tests/test-help.t
diffstat 8 files changed, 52 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bookmarks.py	Fri Oct 15 03:28:28 2021 +0200
+++ b/mercurial/bookmarks.py	Fri Oct 15 03:49:05 2021 +0200
@@ -772,9 +772,11 @@
     return changed
 
 
-def updatefromremote(ui, repo, remotemarks, path, trfunc, explicit=()):
+def updatefromremote(
+    ui, repo, remotemarks, path, trfunc, explicit=(), mode=None
+):
     ui.debug(b"checking for updated bookmarks\n")
-    if ui.configbool(b'bookmarks', b'mirror'):
+    if mode == b'mirror':
         changed = mirroring_remote(ui, repo, remotemarks)
     else:
         changed = merging_from_remote(ui, repo, remotemarks, path, explicit)
--- a/mercurial/configitems.py	Fri Oct 15 03:28:28 2021 +0200
+++ b/mercurial/configitems.py	Fri Oct 15 03:49:05 2021 +0200
@@ -207,11 +207,6 @@
     b'pushing',
     default=list,
 )
-coreconfigitem(
-    b'bookmarks',
-    b'mirror',
-    default=False,
-)
 # bundle.mainreporoot: internal hack for bundlerepo
 coreconfigitem(
     b'bundle',
--- a/mercurial/exchange.py	Fri Oct 15 03:28:28 2021 +0200
+++ b/mercurial/exchange.py	Fri Oct 15 03:49:05 2021 +0200
@@ -2028,6 +2028,9 @@
     pullop.stepsdone.add(b'bookmarks')
     repo = pullop.repo
     remotebookmarks = pullop.remotebookmarks
+    bookmarks_mode = None
+    if pullop.remote_path is not None:
+        bookmarks_mode = pullop.remote_path.bookmarks_mode
     bookmod.updatefromremote(
         repo.ui,
         repo,
@@ -2035,6 +2038,7 @@
         pullop.remote.url(),
         pullop.gettransaction,
         explicit=pullop.explicitbookmarks,
+        mode=bookmarks_mode,
     )
 
 
--- a/mercurial/helptext/config.txt	Fri Oct 15 03:28:28 2021 +0200
+++ b/mercurial/helptext/config.txt	Fri Oct 15 03:49:05 2021 +0200
@@ -418,16 +418,6 @@
 If no suitable authentication entry is found, the user is prompted
 for credentials as usual if required by the remote.
 
-``bookmarks``
--------------
-
-Controls some aspect of bookmarks.
-
-``mirror``
-    When pulling, instead of merging local bookmarks and remote bookmarks,
-    replace local bookmarks by remote bookmarks. This is useful to replicate
-    a repository, or as an optimization. (default: False)
-
 ``cmdserver``
 -------------
 
@@ -1758,6 +1748,15 @@
    Revsets specifying bookmarks will not result in the bookmark being
    pushed.
 
+``bookmarks.mode``
+  How bookmark will be dealt during the exchange. It support the following value
+
+  - ``default``: the default behavior, local and remote bookmarks are "merged"
+    on push/pull.
+
+  - ``mirror``: when pulling, replace local bookmarks by remote bookmarks. This
+    is useful to replicate a repository, or as an optimization.
+
 The following special named paths exist:
 
 ``default``
--- a/mercurial/utils/urlutil.py	Fri Oct 15 03:28:28 2021 +0200
+++ b/mercurial/utils/urlutil.py	Fri Oct 15 03:49:05 2021 +0200
@@ -766,6 +766,27 @@
     return value
 
 
+SUPPORTED_BOOKMARKS_MODES = {
+    b'default',
+    b'mirror',
+}
+
+
+@pathsuboption(b'bookmarks.mode', b'bookmarks_mode')
+def bookmarks_mode_option(ui, path, value):
+    if value not in SUPPORTED_BOOKMARKS_MODES:
+        path_name = path.name
+        if path_name is None:
+            # this is an "anonymous" path, config comes from the global one
+            path_name = b'*'
+        msg = _(b'(paths.%s:bookmarks.mode has unknown value: "%s")\n')
+        msg %= (path_name, value)
+        ui.warn(msg)
+    if value == b'default':
+        value = None
+    return value
+
+
 @pathsuboption(b'multi-urls', b'multi_urls')
 def multiurls_pathoption(ui, path, value):
     res = stringutil.parsebool(value)
--- a/relnotes/next	Fri Oct 15 03:28:28 2021 +0200
+++ b/relnotes/next	Fri Oct 15 03:49:05 2021 +0200
@@ -1,6 +1,10 @@
 == New Features ==
   * `debugrebuildfncache` now has an option to rebuild only the index files
 
+  * a new `bookmarks.mode` path option have been introduced to control the
+    bookmark update strategy during exchange with a peer. See hg help paths for
+    details.
+
 
 == Default Format Change ==
 
--- a/tests/test-bookmarks-pushpull.t	Fri Oct 15 03:28:28 2021 +0200
+++ b/tests/test-bookmarks-pushpull.t	Fri Oct 15 03:49:05 2021 +0200
@@ -503,7 +503,7 @@
    * foobar                    1:9b140be10808
   $ cp .hg/bookmarks .hg/bookmarks.bak
   $ hg book -d X
-  $ hg pull ../a --config bookmarks.mirror=true
+  $ hg pull ../a --config 'paths.*:bookmarks.mode=mirror'
   pulling from ../a
   searching for changes
   no changes found
--- a/tests/test-help.t	Fri Oct 15 03:28:28 2021 +0200
+++ b/tests/test-help.t	Fri Oct 15 03:49:05 2021 +0200
@@ -1900,6 +1900,15 @@
          Revsets specifying bookmarks will not result in the bookmark being
          pushed.
   
+      "bookmarks.mode"
+        How bookmark will be dealt during the exchange. It support the following
+        value
+  
+        - "default": the default behavior, local and remote bookmarks are
+          "merged" on push/pull.
+        - "mirror": when pulling, replace local bookmarks by remote bookmarks.
+          This is useful to replicate a repository, or as an optimization.
+  
       The following special named paths exist:
   
       "default"