hgext/remotenames.py
author Pulkit Goyal <7895pulkit@gmail.com>
Sat, 23 Dec 2017 00:19:09 +0530
changeset 36060 cabe8ef5c71e
child 36061 be72f6420f3c
permissions -rw-r--r--
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

# 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