Mercurial > hg
comparison hgext/remotenames.py @ 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 | |
children | be72f6420f3c |
comparison
equal
deleted
inserted
replaced
36059:62a428bf6359 | 36060:cabe8ef5c71e |
---|---|
1 # remotenames.py - extension to display remotenames | |
2 # | |
3 # Copyright 2017 Augie Fackler <raf@durin42.com> | |
4 # Copyright 2017 Sean Farley <sean@farley.io> | |
5 # | |
6 # This software may be used and distributed according to the terms of the | |
7 # GNU General Public License version 2 or any later version. | |
8 | |
9 """ showing remotebookmarks and remotebranches in UI """ | |
10 | |
11 from __future__ import absolute_import | |
12 | |
13 from mercurial import ( | |
14 logexchange, | |
15 ) | |
16 | |
17 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for | |
18 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should | |
19 # be specifying the version(s) of Mercurial they are tested with, or | |
20 # leave the attribute unspecified. | |
21 testedwith = 'ships-with-hg-core' | |
22 | |
23 class remotenames(dict): | |
24 """ | |
25 This class encapsulates all the remotenames state. It also contains | |
26 methods to access that state in convenient ways. | |
27 """ | |
28 | |
29 def __init__(self, repo, *args): | |
30 dict.__init__(self, *args) | |
31 self._repo = repo | |
32 self['bookmarks'] = {} | |
33 self['branches'] = {} | |
34 self.loadnames() | |
35 self._loadednames = True | |
36 | |
37 def loadnames(self): | |
38 """ loads the remotenames information from the remotenames file """ | |
39 for rtype in ('bookmarks', 'branches'): | |
40 for node, rpath, name in logexchange.readremotenamefile(self._repo, | |
41 rtype): | |
42 rname = rpath + '/' + name | |
43 self[rtype][rname] = [node] | |
44 | |
45 def clearnames(self): | |
46 """ Clear all remote names state """ | |
47 self['bookmarks'] = {} | |
48 self['branches'] = {} | |
49 self._invalidatecache() | |
50 self._loadednames = False | |
51 | |
52 def _invalidatecache(self): | |
53 self._nodetobmarks = None | |
54 self._nodetobranch = None | |
55 | |
56 def bmarktonodes(self): | |
57 return self['bookmarks'] | |
58 | |
59 def nodetobmarks(self): | |
60 if not self._nodetobmarks: | |
61 bmarktonodes = self.bmarktonodes() | |
62 self._nodetobmarks = {} | |
63 for name, node in bmarktonodes.iteritems(): | |
64 self._nodetobmarks.setdefault(node[0], []).append(name) | |
65 return self._nodetobmarks | |
66 | |
67 def branchtonodes(self): | |
68 return self['branches'] | |
69 | |
70 def nodetobranch(self): | |
71 if not self._nodetobranch: | |
72 branchtonodes = self.branchtonodes() | |
73 self._nodetobranch = {} | |
74 for name, nodes in branchtonodes.iteritems(): | |
75 for node in nodes: | |
76 self._nodetobranch.setdefault(node, []).append(name) | |
77 return self._nodetobranch |