bookmarks: allow moving a bookmark forward to a descendant
Allow 'hg bookmark MARK', with an existing bookmark MARK, to move the
bookmark forward to the current or specified revision, if the target
revision is a descendant of the revision the bookmark currently points
to. Prints a status message including the revision the bookmark was
formerly at:
$ hg bookmark Z
moving bookmark 'Z' forward from
663762316562
Test coverage is added.
--- 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()
--- a/tests/test-bookmarks.t Tue Feb 26 21:20:35 2013 +0100
+++ b/tests/test-bookmarks.t Fri Mar 15 23:39:07 2013 -0500
@@ -239,8 +239,8 @@
bookmark with existing name
- $ hg bookmark Z
- abort: bookmark 'Z' already exists (use -f to force)
+ $ hg bookmark X2
+ abort: bookmark 'X2' already exists (use -f to force)
[255]
$ hg bookmark -m Y Z
@@ -279,7 +279,13 @@
force bookmark with existing name
- $ hg bookmark -f Z
+ $ hg bookmark -f X2
+ $ hg bookmark -fr1 X2
+
+forward bookmark to descendant without --force
+
+ $ hg bookmark Z
+ moving bookmark 'Z' forward from 663762316562
list bookmarks