D1756: remotenames: introduce class to encapsulate remotenames info in an extension

pulkit (Pulkit Goyal) phabricator at mercurial-scm.org
Mon Dec 25 20:50:44 UTC 2017


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

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 <raf at durin42.com>
+# Copyright 2017 Sean Farley <sean at 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(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



To: pulkit, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list