D1547: remotenames: move function to pull remotenames from the remoterepo to core

pulkit (Pulkit Goyal) phabricator at mercurial-scm.org
Wed Nov 29 21:57:57 UTC 2017


pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This patch is the first patch of the series moving functionality from
  hgremotenames extension to core.
  
  There are lot of functionality in the extension which in the end enables us to
  store branch heads and bookmarks location on a server from which we are pulling
  or cloning from. This will help us in creating a better bookmark workflow where
  we can show user that a certain server has this bookmarks at this node. It will
  also introduce namespaces related to remote bookmarks and remote branches.
  
  This patch moves the functionality to pull branches and bookmarks from a
  server from which we are pulling to core behind config option
  `experimental.remotenames`.
  
  This patch adds a test which helps us to analyse whether things are working or
  not. We are currently writing things to ui, we will write information to files
  in upcoming patches.
  
  Previously reviewed as https://phab.mercurial-scm.org/D937.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1547

AFFECTED FILES
  mercurial/configitems.py
  mercurial/exchange.py
  mercurial/remotenames.py
  tests/test-remotenames.t

CHANGE DETAILS

diff --git a/tests/test-remotenames.t b/tests/test-remotenames.t
new file mode 100644
--- /dev/null
+++ b/tests/test-remotenames.t
@@ -0,0 +1,73 @@
+Testing the functionality to pull remotenames
+=============================================
+
+  $ cat >> $HGRCPATH << EOF
+  > [alias]
+  > glog = log -G -T '{rev}:{node|short}  {desc}'
+  > EOF
+
+Making a server repo
+--------------------
+
+  $ hg init server
+  $ cd server
+  $ for ch in {a..h}; do echo "foo" >> $ch; hg ci -Aqm "Added "$ch; done
+  $ hg glog
+  @  7:ec2426147f0e  Added h
+  |
+  o  6:87d6d6676308  Added g
+  |
+  o  5:825660c69f0c  Added f
+  |
+  o  4:aa98ab95a928  Added e
+  |
+  o  3:62615734edd5  Added d
+  |
+  o  2:28ad74487de9  Added c
+  |
+  o  1:29becc82797a  Added b
+  |
+  o  0:18d04c59bb5d  Added a
+  
+  $ hg bookmark -r 3 foo
+  $ hg bookmark -r 6 bar
+  $ hg up 4
+  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+  $ hg branch wat
+  marked working directory as branch wat
+  (branches are permanent and global, did you want a bookmark?)
+  $ echo foo >> bar
+  $ hg ci -Aqm "added bar"
+
+Making a client repo
+--------------------
+
+  $ cd ..
+  $ hg init client
+  $ cd client
+  $ cat >> .hg/hgrc << EOF
+  > [experimental]
+  > remotenames = True
+  > EOF
+
+  $ hg pull ../server/
+  pulling from ../server/
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 9 changesets with 9 changes to 9 files (+1 heads)
+  adding remote bookmark bar
+  adding remote bookmark foo
+  new changesets 18d04c59bb5d:3e1487808078
+  
+  Remotenames info
+  path: file:$TESTTMP/server
+  Bookmarks:
+  foo: 62615734edd52f06b6fb9c2beb429e4fe30d57b8
+  bar: 87d6d66763085b629e6d7ed56778c79827273022
+  Branches:
+  wat: ['3e1487808078543b0af6d10dadf5d46943578db0']
+  default: ['ec2426147f0e39dbc9cef599b066be6035ce691d']
+  
+  (run 'hg heads' to see heads)
diff --git a/mercurial/remotenames.py b/mercurial/remotenames.py
new file mode 100644
--- /dev/null
+++ b/mercurial/remotenames.py
@@ -0,0 +1,43 @@
+# remotenames.py
+#
+# Copyright 2017 Augie Fackler <augie at google.com>
+# Copyright 2017 Sean Farley <sean at farley.io>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+from .node import hex
+
+def pullremotenames(localrepo, remoterepo):
+    """
+    pulls bookmarks and branches information of the remote repo during a
+    pull or clone operation.
+    localrepo is our local repository
+    remoterepo is the peer instance
+    """
+    remotepath = remoterepo.url()
+    bookmarks = remoterepo.listkeys('bookmarks')
+    # on a push, we don't want to keep obsolete heads since
+    # they won't show up as heads on the next pull, so we
+    # remove them here otherwise we would require the user
+    # to issue a pull to refresh the storage
+    bmap = {}
+    repo = localrepo.unfiltered()
+    for branch, nodes in remoterepo.branchmap().iteritems():
+        bmap[branch] = []
+        for node in nodes:
+            if node in repo and not repo[node].obsolete():
+                bmap[branch].append(hex(node))
+
+    # writing things to ui till the time we import the saving functionality
+    ui = localrepo.ui
+    ui.write("\nRemotenames info\npath: %s\n" % remotepath)
+    ui.write("Bookmarks:\n")
+    for bm, node in bookmarks.iteritems():
+        ui.write("%s: %s\n" % (bm, node))
+    ui.write("Branches:\n")
+    for branch, node in bmap.iteritems():
+        ui.write("%s: %s\n" % (branch, node))
+    ui.write("\n")
diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -27,6 +27,7 @@
     phases,
     pushkey,
     pycompat,
+    remotenames,
     scmutil,
     sslutil,
     streamclone,
@@ -1304,6 +1305,10 @@
     finally:
         lockmod.release(pullop.trmanager, lock, wlock)
 
+    # storing remotenames
+    if repo.ui.configbool('experimental', 'remotenames'):
+        remotenames.pullremotenames(repo, remote)
+
     return pullop
 
 # list of steps to perform discovery before pull
diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -439,6 +439,9 @@
 coreconfigitem('experimental', 'rebase.multidest',
     default=False,
 )
+coreconfigitem('experimental', 'remotenames',
+    default=False,
+)
 coreconfigitem('experimental', 'revlogv2',
     default=None,
 )



To: pulkit, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list