Mercurial > hg
changeset 36060:cabe8ef5c71e
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
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Sat, 23 Dec 2017 00:19:09 +0530 |
parents | 62a428bf6359 |
children | be72f6420f3c |
files | hgext/remotenames.py tests/test-help.t |
diffstat | 2 files changed, 78 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /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 <raf@durin42.com> +# Copyright 2017 Sean Farley <sean@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. + +""" 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
--- 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