215 r = runhook(hname, cmd) or r |
215 r = runhook(hname, cmd) or r |
216 return r |
216 return r |
217 |
217 |
218 tag_disallowed = ':\r\n' |
218 tag_disallowed = ':\r\n' |
219 |
219 |
220 def tag(self, name, node, message, local, user, date): |
220 def _tag(self, name, node, message, local, user, date, parent=None): |
221 '''tag a revision with a symbolic name. |
221 use_dirstate = parent is None |
222 |
|
223 if local is True, the tag is stored in a per-repository file. |
|
224 otherwise, it is stored in the .hgtags file, and a new |
|
225 changeset is committed with the change. |
|
226 |
|
227 keyword arguments: |
|
228 |
|
229 local: whether to store tag in non-version-controlled file |
|
230 (default False) |
|
231 |
|
232 message: commit message to use if committing |
|
233 |
|
234 user: name of user to use if committing |
|
235 |
|
236 date: date tuple to use if committing''' |
|
237 |
222 |
238 for c in self.tag_disallowed: |
223 for c in self.tag_disallowed: |
239 if c in name: |
224 if c in name: |
240 raise util.Abort(_('%r cannot be used in a tag name') % c) |
225 raise util.Abort(_('%r cannot be used in a tag name') % c) |
241 |
226 |
245 # local tags are stored in the current charset |
230 # local tags are stored in the current charset |
246 self.opener('localtags', 'a').write('%s %s\n' % (hex(node), name)) |
231 self.opener('localtags', 'a').write('%s %s\n' % (hex(node), name)) |
247 self.hook('tag', node=hex(node), tag=name, local=local) |
232 self.hook('tag', node=hex(node), tag=name, local=local) |
248 return |
233 return |
249 |
234 |
|
235 # committed tags are stored in UTF-8 |
|
236 line = '%s %s\n' % (hex(node), util.fromlocal(name)) |
|
237 if use_dirstate: |
|
238 self.wfile('.hgtags', 'ab').write(line) |
|
239 else: |
|
240 ntags = self.filectx('.hgtags', parent).data() |
|
241 self.wfile('.hgtags', 'ab').write(ntags + line) |
|
242 if use_dirstate and self.dirstate.state('.hgtags') == '?': |
|
243 self.add(['.hgtags']) |
|
244 |
|
245 tagnode = self.commit(['.hgtags'], message, user, date, p1=parent) |
|
246 |
|
247 self.hook('tag', node=hex(node), tag=name, local=local) |
|
248 |
|
249 return tagnode |
|
250 |
|
251 def tag(self, name, node, message, local, user, date): |
|
252 '''tag a revision with a symbolic name. |
|
253 |
|
254 if local is True, the tag is stored in a per-repository file. |
|
255 otherwise, it is stored in the .hgtags file, and a new |
|
256 changeset is committed with the change. |
|
257 |
|
258 keyword arguments: |
|
259 |
|
260 local: whether to store tag in non-version-controlled file |
|
261 (default False) |
|
262 |
|
263 message: commit message to use if committing |
|
264 |
|
265 user: name of user to use if committing |
|
266 |
|
267 date: date tuple to use if committing''' |
|
268 |
250 for x in self.status()[:5]: |
269 for x in self.status()[:5]: |
251 if '.hgtags' in x: |
270 if '.hgtags' in x: |
252 raise util.Abort(_('working copy of .hgtags is changed ' |
271 raise util.Abort(_('working copy of .hgtags is changed ' |
253 '(please commit .hgtags manually)')) |
272 '(please commit .hgtags manually)')) |
254 |
273 |
255 # committed tags are stored in UTF-8 |
274 |
256 line = '%s %s\n' % (hex(node), util.fromlocal(name)) |
275 self._tag(name, node, message, local, user, date) |
257 self.wfile('.hgtags', 'ab').write(line) |
|
258 if self.dirstate.state('.hgtags') == '?': |
|
259 self.add(['.hgtags']) |
|
260 |
|
261 self.commit(['.hgtags'], message, user, date) |
|
262 self.hook('tag', node=hex(node), tag=name, local=local) |
|
263 |
276 |
264 def tags(self): |
277 def tags(self): |
265 '''return a mapping of tag to node''' |
278 '''return a mapping of tag to node''' |
266 if not self.tagscache: |
279 if not self.tagscache: |
267 self.tagscache = {} |
280 self.tagscache = {} |