revset: add remote() predicate to lookup remote revisions
authorMatt Mackall <mpm@selenic.com>
Thu, 19 Jan 2012 14:31:05 -0600
changeset 15936 878bc4a62a73
parent 15935 6c97eb445341
child 15937 7ed056f1e97d
child 16054 605ed03b0cbe
revset: add remote() predicate to lookup remote revisions
mercurial/revset.py
--- a/mercurial/revset.py	Thu Jan 19 14:07:48 2012 -0600
+++ b/mercurial/revset.py	Thu Jan 19 14:31:05 2012 -0600
@@ -742,6 +742,41 @@
     getargs(x, 0, 0, _("public takes no arguments"))
     return [r for r in subset if repo._phaserev[r] == phases.public]
 
+def remote(repo, subset, x):
+    """``remote([id], [path])``
+    Local revision that corresponds to the given identifier in a
+    remote repository, if present. Here, the '.' identifier is a
+    synonym for the current local branch.
+    """
+
+    import hg # avoid start-up nasties
+    # i18n: "remote" is a keyword
+    l = getargs(x, 0, 2, _("outgoing takes one or two arguments"))
+
+    q = '.'
+    if len(l) > 0:
+    # i18n: "remote" is a keyword
+        q = getstring(l[0], _("remote requires a string id"))
+    if q == '.':
+        q = repo['.'].branch()
+
+    dest = ''
+    if len(l) > 1:
+        # i18n: "remote" is a keyword
+        dest = getstring(l[1], _("remote requires a repository path"))
+    dest = repo.ui.expandpath(dest or 'default')
+    dest, branches = hg.parseurl(dest)
+    revs, checkout = hg.addbranchrevs(repo, repo, branches, [])
+    if revs:
+        revs = [repo.lookup(rev) for rev in revs]
+    other = hg.peer(repo, {}, dest)
+    n = other.lookup(q)
+    if n in repo:
+        r = repo[n].rev()
+    if r in subset:
+        return [r]
+    return []
+
 def removes(repo, subset, x):
     """``removes(pattern)``
     Changesets which remove files matching pattern.
@@ -916,6 +951,7 @@
     "parents": parents,
     "present": present,
     "public": public,
+    "remote": remote,
     "removes": removes,
     "rev": rev,
     "reverse": reverse,