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.
This commit is contained in:
Kevin Bullock 2013-03-15 23:39:07 -05:00
parent 8d01e97626
commit f416be4da5
2 changed files with 21 additions and 8 deletions

View File

@ -808,8 +808,15 @@ def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False,
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 @@ def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False,
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()

View File

@ -239,8 +239,8 @@ bookmark with reserved name
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 @@ incompatible options
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