--- a/mercurial/commands.py Tue Feb 26 21:20:35 2013 +0100
+++ b/mercurial/commands.py Fri Mar 15 23:39:07 2013 -0500
@@ -808,8 +808,15 @@
scmutil.checknewlabel(repo, mark, 'bookmark')
return mark
- def checkconflict(repo, mark, force=False):
+ def checkconflict(repo, mark, force=False, target=None):
if mark in marks and not force:
+ if target:
+ anc = repo.changelog.ancestors([repo[target].rev()])
+ bmctx = repo[marks[mark]]
+ if bmctx.rev() in anc:
+ ui.status(_("moving bookmark '%s' forward from %s\n") %
+ (mark, short(bmctx.node())))
+ return
raise util.Abort(_("bookmark '%s' already exists "
"(use -f to force)") % mark)
if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
@@ -852,11 +859,11 @@
if inactive and mark == repo._bookmarkcurrent:
bookmarks.setcurrent(repo, None)
return
- checkconflict(repo, mark, force)
+ tgt = cur
if rev:
- marks[mark] = scmutil.revsingle(repo, rev).node()
- else:
- marks[mark] = cur
+ tgt = scmutil.revsingle(repo, rev).node()
+ checkconflict(repo, mark, force, tgt)
+ marks[mark] = tgt
if not inactive and cur == marks[mark]:
bookmarks.setcurrent(repo, mark)
marks.write()