diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -705,3 +705,24 @@ def delete(repo, tr, names): deactivate(repo) del marks[mark] marks.recordchange(tr) + +def rename(repo, tr, old, new, force=False, inactive=False): + """rename a bookmark from old to new + + If force is specified, then the new name can overwrite an existing + bookmark. + + If inactive is specified, then do not activate the new bookmark. + + Raises an abort error if old is not in the bookmark store. + """ + marks = repo._bookmarks + mark = checkformat(repo, new) + if old not in marks: + raise error.Abort(_("bookmark '%s' does not exist") % old) + marks.checkconflict(mark, force) + marks[mark] = marks[old] + if repo._activebookmark == old and not inactive: + activate(repo, mark) + del marks[old] + marks.recordchange(tr) diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -982,15 +982,7 @@ def bookmark(ui, repo, *names, **opts): raise error.Abort(_("new bookmark name required")) elif len(names) > 1: raise error.Abort(_("only one new bookmark name allowed")) - mark = bookmarks.checkformat(repo, names[0]) - if rename not in marks: - raise error.Abort(_("bookmark '%s' does not exist") - % rename) - marks.checkconflict(mark, force) - marks[mark] = marks[rename] - if repo._activebookmark == rename and not inactive: - bookmarks.activate(repo, mark) - del marks[rename] + bookmarks.rename(repo, tr, rename, names[0], force, inactive) elif names: tr = repo.transaction('bookmark') newact = None