# HG changeset patch # User Pulkit Goyal <7895pulkit@gmail.com> # Date 1513968549 -19800 # Node ID cabe8ef5c71ece01dccde76aca7901987cb024d6 # Parent 62a428bf63590f74024c6cc6c40b4178be086cc4 remotenames: introduce class to encapsulate remotenames info in an extension This patch adds a new extension remotenames in which features from hgremotenames extension (https://bb/seanfarley/hgremotenames) will be added incrementally. This patch introduces a basic class to encapsulate the remotenames information. Differential Revision: https://phab.mercurial-scm.org/D1756 diff -r 62a428bf6359 -r cabe8ef5c71e hgext/remotenames.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext/remotenames.py Sat Dec 23 00:19:09 2017 +0530 @@ -0,0 +1,77 @@ +# remotenames.py - extension to display remotenames +# +# 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. + +""" showing remotebookmarks and remotebranches in UI """ + +from __future__ import absolute_import + +from mercurial import ( + logexchange, +) + +# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for +# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should +# be specifying the version(s) of Mercurial they are tested with, or +# leave the attribute unspecified. +testedwith = 'ships-with-hg-core' + +class remotenames(dict): + """ + This class encapsulates all the remotenames state. It also contains + methods to access that state in convenient ways. + """ + + def __init__(self, repo, *args): + dict.__init__(self, *args) + self._repo = repo + self['bookmarks'] = {} + self['branches'] = {} + self.loadnames() + self._loadednames = True + + def loadnames(self): + """ loads the remotenames information from the remotenames file """ + for rtype in ('bookmarks', 'branches'): + for node, rpath, name in logexchange.readremotenamefile(self._repo, + rtype): + rname = rpath + '/' + name + self[rtype][rname] = [node] + + def clearnames(self): + """ Clear all remote names state """ + self['bookmarks'] = {} + self['branches'] = {} + self._invalidatecache() + self._loadednames = False + + def _invalidatecache(self): + self._nodetobmarks = None + self._nodetobranch = None + + def bmarktonodes(self): + return self['bookmarks'] + + def nodetobmarks(self): + if not self._nodetobmarks: + bmarktonodes = self.bmarktonodes() + self._nodetobmarks = {} + for name, node in bmarktonodes.iteritems(): + self._nodetobmarks.setdefault(node[0], []).append(name) + return self._nodetobmarks + + def branchtonodes(self): + return self['branches'] + + def nodetobranch(self): + if not self._nodetobranch: + branchtonodes = self.branchtonodes() + self._nodetobranch = {} + for name, nodes in branchtonodes.iteritems(): + for node in nodes: + self._nodetobranch.setdefault(node, []).append(name) + return self._nodetobranch diff -r 62a428bf6359 -r cabe8ef5c71e tests/test-help.t --- a/tests/test-help.t Sat Dec 23 20:27:41 2017 +0530 +++ b/tests/test-help.t Sat Dec 23 00:19:09 2017 +0530 @@ -274,6 +274,7 @@ purge command to delete untracked files from the working directory relink recreates hardlinks between repository clones + remotenames showing remotebookmarks and remotebranches in UI schemes extend schemes with shortcuts to repository swarms share share a common history between several working directories shelve save and restore changes to the working directory