Mercurial > hg
changeset 18773:56dd55da2f7d
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.
author | Kevin Bullock <kbullock@ringworld.org> |
---|---|
date | Fri, 15 Mar 2013 23:39:07 -0500 |
parents | 0bba1ff2ac7b |
children | b616c9b8001d |
files | mercurial/commands.py tests/test-bookmarks.t |
diffstat | 2 files changed, 21 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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