From patchwork Mon Dec 25 20:50:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D1756: remotenames: introduce class to encapsulate remotenames info in an extension From: phabricator X-Patchwork-Id: 26435 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Mon, 25 Dec 2017 20:50:44 +0000 pulkit created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY 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. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D1756 AFFECTED FILES hgext/remotenames.py tests/test-help.t CHANGE DETAILS To: pulkit, #hg-reviewers Cc: mercurial-devel diff --git a/tests/test-help.t b/tests/test-help.t --- a/tests/test-help.t +++ b/tests/test-help.t @@ -273,6 +273,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 diff --git a/hgext/remotenames.py b/hgext/remotenames.py new file mode 100644 --- /dev/null +++ b/hgext/remotenames.py @@ -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(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[node] = [name] + return self._nodetobranch