diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -532,6 +532,9 @@ coreconfigitem('experimental', 'rebase.multidest', default=False, ) +coreconfigitem('experimental', 'remotenames', + default=False, +) coreconfigitem('experimental', 'revlogv2', default=None, ) 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/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 +# Copyright 2017 Sean Farley +# +# 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/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)