##// END OF EJS Templates
bookmarks: hide dict behind bmstore class...
Yuya Nishihara -
r37866:8256962e default
parent child Browse files
Show More
@@ -43,7 +43,7 def _getbkfile(repo):
43 fp, pending = txnutil.trypending(repo.root, repo.vfs, 'bookmarks')
43 fp, pending = txnutil.trypending(repo.root, repo.vfs, 'bookmarks')
44 return fp
44 return fp
45
45
46 class bmstore(dict):
46 class bmstore(object):
47 """Storage for bookmarks.
47 """Storage for bookmarks.
48
48
49 This object should do all bookmark-related reads and writes, so
49 This object should do all bookmark-related reads and writes, so
@@ -58,13 +58,12 class bmstore(dict):
58 """
58 """
59
59
60 def __init__(self, repo):
60 def __init__(self, repo):
61 dict.__init__(self)
62 self._repo = repo
61 self._repo = repo
62 self._refmap = refmap = {} # refspec: node
63 self._clean = True
63 self._clean = True
64 self._aclean = True
64 self._aclean = True
65 nm = repo.changelog.nodemap
65 nm = repo.changelog.nodemap
66 tonode = bin # force local lookup
66 tonode = bin # force local lookup
67 setitem = dict.__setitem__
68 try:
67 try:
69 with _getbkfile(repo) as bkfile:
68 with _getbkfile(repo) as bkfile:
70 for line in bkfile:
69 for line in bkfile:
@@ -76,7 +75,7 class bmstore(dict):
76 node = tonode(sha)
75 node = tonode(sha)
77 if node in nm:
76 if node in nm:
78 refspec = encoding.tolocal(refspec)
77 refspec = encoding.tolocal(refspec)
79 setitem(self, refspec, node)
78 refmap[refspec] = node
80 except (TypeError, ValueError):
79 except (TypeError, ValueError):
81 # TypeError:
80 # TypeError:
82 # - bin(...)
81 # - bin(...)
@@ -96,38 +95,59 class bmstore(dict):
96
95
97 @active.setter
96 @active.setter
98 def active(self, mark):
97 def active(self, mark):
99 if mark is not None and mark not in self:
98 if mark is not None and mark not in self._refmap:
100 raise AssertionError('bookmark %s does not exist!' % mark)
99 raise AssertionError('bookmark %s does not exist!' % mark)
101
100
102 self._active = mark
101 self._active = mark
103 self._aclean = False
102 self._aclean = False
104
103
105 def __setitem__(self, *args, **kwargs):
104 def __len__(self):
106 raise error.ProgrammingError("use 'bookmarks.applychanges' instead")
105 return len(self._refmap)
106
107 def __iter__(self):
108 return iter(self._refmap)
109
110 def iteritems(self):
111 return self._refmap.iteritems()
112
113 def items(self):
114 return self._refmap.items()
115
116 # TODO: maybe rename to allnames()?
117 def keys(self):
118 return self._refmap.keys()
119
120 # TODO: maybe rename to allnodes()? but nodes would have to be deduplicated
121 def values(self):
122 return self._refmap.values()
123
124 def __contains__(self, mark):
125 return mark in self._refmap
126
127 def __getitem__(self, mark):
128 return self._refmap[mark]
129
130 def get(self, mark, default=None):
131 return self._refmap.get(mark, default)
107
132
108 def _set(self, key, value):
133 def _set(self, key, value):
109 self._clean = False
134 self._clean = False
110 return dict.__setitem__(self, key, value)
135 self._refmap[key] = value
111
112 def __delitem__(self, key):
113 raise error.ProgrammingError("use 'bookmarks.applychanges' instead")
114
136
115 def _del(self, key):
137 def _del(self, key):
116 self._clean = False
138 self._clean = False
117 return dict.__delitem__(self, key)
139 del self._refmap[key]
118
119 def update(self, *others):
120 raise error.ProgrammingError("use 'bookmarks.applychanges' instead")
121
140
122 def changectx(self, mark):
141 def changectx(self, mark):
123 return self._repo[self[mark]]
142 node = self._refmap[mark]
143 return self._repo[node]
124
144
125 def applychanges(self, repo, tr, changes):
145 def applychanges(self, repo, tr, changes):
126 """Apply a list of changes to bookmarks
146 """Apply a list of changes to bookmarks
127 """
147 """
128 bmchanges = tr.changes.get('bookmarks')
148 bmchanges = tr.changes.get('bookmarks')
129 for name, node in changes:
149 for name, node in changes:
130 old = self.get(name)
150 old = self._refmap.get(name)
131 if node is None:
151 if node is None:
132 self._del(name)
152 self._del(name)
133 else:
153 else:
@@ -151,7 +171,7 class bmstore(dict):
151 def _writerepo(self, repo):
171 def _writerepo(self, repo):
152 """Factored out for extensibility"""
172 """Factored out for extensibility"""
153 rbm = repo._bookmarks
173 rbm = repo._bookmarks
154 if rbm.active not in self:
174 if rbm.active not in self._refmap:
155 rbm.active = None
175 rbm.active = None
156 rbm._writeactive()
176 rbm._writeactive()
157
177
@@ -182,7 +202,7 class bmstore(dict):
182 self._aclean = True
202 self._aclean = True
183
203
184 def _write(self, fp):
204 def _write(self, fp):
185 for name, node in sorted(self.iteritems()):
205 for name, node in sorted(self._refmap.iteritems()):
186 fp.write("%s %s\n" % (hex(node), encoding.fromlocal(name)))
206 fp.write("%s %s\n" % (hex(node), encoding.fromlocal(name)))
187 self._clean = True
207 self._clean = True
188 self._repo.invalidatevolatilesets()
208 self._repo.invalidatevolatilesets()
@@ -208,15 +228,15 class bmstore(dict):
208 If divergent bookmark are to be deleted, they will be returned as list.
228 If divergent bookmark are to be deleted, they will be returned as list.
209 """
229 """
210 cur = self._repo['.'].node()
230 cur = self._repo['.'].node()
211 if mark in self and not force:
231 if mark in self._refmap and not force:
212 if target:
232 if target:
213 if self[mark] == target and target == cur:
233 if self._refmap[mark] == target and target == cur:
214 # re-activating a bookmark
234 # re-activating a bookmark
215 return []
235 return []
216 rev = self._repo[target].rev()
236 rev = self._repo[target].rev()
217 anc = self._repo.changelog.ancestors([rev])
237 anc = self._repo.changelog.ancestors([rev])
218 bmctx = self.changectx(mark)
238 bmctx = self.changectx(mark)
219 divs = [self[b] for b in self
239 divs = [self._refmap[b] for b in self._refmap
220 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
240 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
221
241
222 # allow resolving a single divergent bookmark even if moving
242 # allow resolving a single divergent bookmark even if moving
General Comments 0
You need to be logged in to leave comments. Login now