diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -119,22 +119,43 @@ class localrepository(repo.repository): self.hook('pretag', throw=True, node=hex(node), tag=name, local=local) + def writetag(fp, name, munge, prevtags): + if prevtags and prevtags[-1] != '\n': + fp.write('\n') + fp.write('%s %s\n' % (hex(node), munge and munge(name) or name)) + fp.close() + self.hook('tag', node=hex(node), tag=name, local=local) + + prevtags = '' if local: + try: + fp = self.opener('localtags', 'r+') + except IOError, err: + fp = self.opener('localtags', 'a') + else: + prevtags = fp.read() + # local tags are stored in the current charset - self.opener('localtags', 'a').write('%s %s\n' % (hex(node), name)) - self.hook('tag', node=hex(node), tag=name, local=local) + writetag(fp, name, None, prevtags) return + if use_dirstate: + try: + fp = self.wfile('.hgtags', 'rb+') + except IOError, err: + fp = self.wfile('.hgtags', 'ab') + else: + prevtags = fp.read() + else: + try: + prevtags = self.filectx('.hgtags', parent).data() + except revlog.LookupError: + pass + fp = self.wfile('.hgtags', 'wb') + # committed tags are stored in UTF-8 - line = '%s %s\n' % (hex(node), util.fromlocal(name)) - if use_dirstate: - self.wfile('.hgtags', 'ab').write(line) - else: - try: - ntags = self.filectx('.hgtags', parent).data() - except revlog.LookupError: - ntags = '' - self.wfile('.hgtags', 'wb').write(ntags + line) + writetag(fp, name, util.fromlocal, prevtags) + if use_dirstate and self.dirstate.state('.hgtags') == '?': self.add(['.hgtags'])