Looks good to me. Some comments inline, but I'd be fine with this being
accepted.
On 8/22/16 3:17 AM, Stanislau Hlebik wrote:
# HG changeset patch
# User Stanislau Hlebik
# 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:
Catching 'Exception' is a bit of an anti-pattern (I think it will stop
ctrl+c from working here too?), but in this case we really don't want
the pull to interfere, so I guess it's fine for now.
+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)
What if both rev and node are None? That can't happen at FB, but
upstream supports "hg update" with no args.
+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/master1: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/master1: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/master1: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