remotenames: introduce class to encapsulate remotenames info in an extension
authorPulkit Goyal <7895pulkit@gmail.com>
Sat, 23 Dec 2017 00:19:09 +0530
changeset 36060 cabe8ef5c71e
parent 36059 62a428bf6359
child 36061 be72f6420f3c
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
hgext/remotenames.py
tests/test-help.t
--- /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