comparison mercurial/commands.py @ 15877:afd459933d5f

tag: lock before tagging
author Mads Kiilerich <mads@kiilerich.com>
date Fri, 13 Jan 2012 01:19:07 +0100
parents 7eca9db689d6
children aad565319fa3
comparison
equal deleted inserted replaced
15876:2de1244361aa 15877:afd459933d5f
5499 Since tag names have priority over branch names during revision 5499 Since tag names have priority over branch names during revision
5500 lookup, using an existing branch name as a tag name is discouraged. 5500 lookup, using an existing branch name as a tag name is discouraged.
5501 5501
5502 Returns 0 on success. 5502 Returns 0 on success.
5503 """ 5503 """
5504 5504 wlock = lock = None
5505 rev_ = "." 5505 try:
5506 names = [t.strip() for t in (name1,) + names] 5506 wlock = repo.wlock()
5507 if len(names) != len(set(names)): 5507 lock = repo.lock()
5508 raise util.Abort(_('tag names must be unique')) 5508 rev_ = "."
5509 for n in names: 5509 names = [t.strip() for t in (name1,) + names]
5510 if n in ['tip', '.', 'null']: 5510 if len(names) != len(set(names)):
5511 raise util.Abort(_("the name '%s' is reserved") % n) 5511 raise util.Abort(_('tag names must be unique'))
5512 if not n:
5513 raise util.Abort(_('tag names cannot consist entirely of whitespace'))
5514 if opts.get('rev') and opts.get('remove'):
5515 raise util.Abort(_("--rev and --remove are incompatible"))
5516 if opts.get('rev'):
5517 rev_ = opts['rev']
5518 message = opts.get('message')
5519 if opts.get('remove'):
5520 expectedtype = opts.get('local') and 'local' or 'global'
5521 for n in names: 5512 for n in names:
5522 if not repo.tagtype(n): 5513 if n in ['tip', '.', 'null']:
5523 raise util.Abort(_("tag '%s' does not exist") % n) 5514 raise util.Abort(_("the name '%s' is reserved") % n)
5524 if repo.tagtype(n) != expectedtype: 5515 if not n:
5525 if expectedtype == 'global': 5516 raise util.Abort(_('tag names cannot consist entirely of '
5526 raise util.Abort(_("tag '%s' is not a global tag") % n) 5517 'whitespace'))
5527 else: 5518 if opts.get('rev') and opts.get('remove'):
5528 raise util.Abort(_("tag '%s' is not a local tag") % n) 5519 raise util.Abort(_("--rev and --remove are incompatible"))
5529 rev_ = nullid 5520 if opts.get('rev'):
5521 rev_ = opts['rev']
5522 message = opts.get('message')
5523 if opts.get('remove'):
5524 expectedtype = opts.get('local') and 'local' or 'global'
5525 for n in names:
5526 if not repo.tagtype(n):
5527 raise util.Abort(_("tag '%s' does not exist") % n)
5528 if repo.tagtype(n) != expectedtype:
5529 if expectedtype == 'global':
5530 raise util.Abort(_("tag '%s' is not a global tag") % n)
5531 else:
5532 raise util.Abort(_("tag '%s' is not a local tag") % n)
5533 rev_ = nullid
5534 if not message:
5535 # we don't translate commit messages
5536 message = 'Removed tag %s' % ', '.join(names)
5537 elif not opts.get('force'):
5538 for n in names:
5539 if n in repo.tags():
5540 raise util.Abort(_("tag '%s' already exists "
5541 "(use -f to force)") % n)
5542 if not opts.get('local'):
5543 p1, p2 = repo.dirstate.parents()
5544 if p2 != nullid:
5545 raise util.Abort(_('uncommitted merge'))
5546 bheads = repo.branchheads()
5547 if not opts.get('force') and bheads and p1 not in bheads:
5548 raise util.Abort(_('not at a branch head (use -f to force)'))
5549 r = scmutil.revsingle(repo, rev_).node()
5550
5530 if not message: 5551 if not message:
5531 # we don't translate commit messages 5552 # we don't translate commit messages
5532 message = 'Removed tag %s' % ', '.join(names) 5553 message = ('Added tag %s for changeset %s' %
5533 elif not opts.get('force'): 5554 (', '.join(names), short(r)))
5534 for n in names: 5555
5535 if n in repo.tags(): 5556 date = opts.get('date')
5536 raise util.Abort(_("tag '%s' already exists " 5557 if date:
5537 "(use -f to force)") % n) 5558 date = util.parsedate(date)
5538 if not opts.get('local'): 5559
5539 p1, p2 = repo.dirstate.parents() 5560 if opts.get('edit'):
5540 if p2 != nullid: 5561 message = ui.edit(message, ui.username())
5541 raise util.Abort(_('uncommitted merge')) 5562
5542 bheads = repo.branchheads() 5563 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
5543 if not opts.get('force') and bheads and p1 not in bheads: 5564 finally:
5544 raise util.Abort(_('not at a branch head (use -f to force)')) 5565 release(lock, wlock)
5545 r = scmutil.revsingle(repo, rev_).node()
5546
5547 if not message:
5548 # we don't translate commit messages
5549 message = ('Added tag %s for changeset %s' %
5550 (', '.join(names), short(r)))
5551
5552 date = opts.get('date')
5553 if date:
5554 date = util.parsedate(date)
5555
5556 if opts.get('edit'):
5557 message = ui.edit(message, ui.username())
5558
5559 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
5560 5566
5561 @command('tags', [], '') 5567 @command('tags', [], '')
5562 def tags(ui, repo): 5568 def tags(ui, repo):
5563 """list repository tags 5569 """list repository tags
5564 5570