[PATCH 2 of 2 V3 remotenames-ext] remotenames: selectivepull, update to the unknown bookmark tries to pull it

Stanislau Hlebik stash at fb.com
Mon Aug 22 06:17:16 EDT 2016


# HG changeset patch
# User Stanislau Hlebik <stash at fb.com>
# Date 1471860690 25200
#      Mon Aug 22 03:11:30 2016 -0700
# Node ID 7dae93347fd658a558284e55d27060e980f324f0
# Parent  866049ffa049dc598af834a035f27a06684d264d
remotenames: selectivepull, update to the unknown bookmark tries to pull it

Part of Selective Pull project (see https://www.mercurial-scm.org/wiki/SelectivePullPlan for details).
If Selective Pull is enabled, then we want to be able to check out
revision even if it's not present locally, but present on remote server.
If rev or node is not present locally, new request is issued to find
it remotely. If it is present remotely then it's pulled.

Test Plan:
Run remotenames tests

diff --git a/remotenames.py b/remotenames.py
--- a/remotenames.py
+++ b/remotenames.py
@@ -17,6 +17,7 @@
 import re
 import errno
 import shutil
+import sys
 import UserDict
 
 from mercurial import bookmarks
@@ -76,6 +77,27 @@
 def _isselectivepull(ui):
     return ui.configbool('remotenames', 'selectivepull', False)
 
+def _trypullremotebookmark(mayberemotebookmark, repo, ui):
+    ui.warn(_('`%s` not found: assuming it is a remote bookmark '
+              'and trying to pull it\n') % mayberemotebookmark)
+    sourcerenames = dict((v, k) for k, v in _getrenames(ui).iteritems())
+    remote, bookmarkname = splitremotename(mayberemotebookmark)
+    paths = dict((path, url) for path, url in ui.configitems('paths'))
+    if remote in sourcerenames:
+        source = sourcerenames[remote]
+    elif remote in paths:
+        source = remote
+    else:
+        source = 'default'
+        bookmarkname = mayberemotebookmark
+
+    try:
+        commands.pull(ui, repo, source=source, bookmark=[bookmarkname])
+    except Exception:
+        ui.warn(_('pull failed: %s\n') % sys.exc_info()[2])
+    else:
+        ui.warn(_('`%s` found remotely\n') % mayberemotebookmark)
+
 def expull(orig, repo, remote, *args, **kwargs):
     remotebookmarks = remote.listkeys('bookmarks')
     if _isselectivepull(repo.ui):
@@ -217,6 +239,17 @@
     return bookmarks
 
 def updatecmd(orig, ui, repo, node=None, rev=None, **kwargs):
+    if rev and node:
+        raise error.Abort(_("please specify just one revision"))
+
+    if _isselectivepull(repo.ui) and not kwargs.get('date'):
+        # Make sure that rev or node is present in the repo.
+        # Otherwise pull it from remote
+        try:
+            scmutil.revsingle(repo, rev or node)
+        except (error.RepoLookupError, error.Abort):
+            _trypullremotebookmark(rev or node, repo, ui)
+
     book = kwargs.get('bookmark')
     if book:
         del kwargs['bookmark']
diff --git a/tests/test-selective-pull.t b/tests/test-selective-pull.t
--- a/tests/test-selective-pull.t
+++ b/tests/test-selective-pull.t
@@ -156,3 +156,46 @@
   $ hg bookmarks --remote
      default/master            1:0238718db2b1
      secondremote/master       1:0238718db2b1
+
+Update to the remote bookmark
+  $ hg update thirdbook
+  `thirdbook` not found: assuming it is a remote bookmark and trying to pull it
+  pulling from ssh://user@dummy/remoterepo
+  no changes found
+  `thirdbook` found remotely
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg book --verbose
+  no bookmarks set
+  $ hg book --remote
+     default/master            1:0238718db2b1
+     default/thirdbook         0:1449e7934ec1
+     secondremote/master       1:0238718db2b1
+
+Trying to update to unknown bookmark
+  $ hg update unknownbook
+  `unknownbook` not found: assuming it is a remote bookmark and trying to pull it
+  pulling from ssh://user@dummy/remoterepo
+  abort: remote bookmark unknownbook not found!
+  [255]
+
+Update to the remote bookmark from secondremote
+  $ hg update secondremote/secondbook
+  `secondremote/secondbook` not found: assuming it is a remote bookmark and trying to pull it
+  pulling from ssh://user@dummy/secondremoterepo
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  (run 'hg update' to get a working copy)
+  `secondremote/secondbook` found remotely
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg book --remote
+     default/master            1:0238718db2b1
+     default/thirdbook         0:1449e7934ec1
+     secondremote/master       1:0238718db2b1
+     secondremote/secondbook   4:0022441e80e5
+
+Update make sure revsets work
+  $ hg up '.^'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved


More information about the Mercurial-devel mailing list