Patchwork [5,of,9,bm-refactor] bookmarks: factor out adding a list of bookmarks from commands

login
register
mail settings
Submitter Sean Farley
Date June 21, 2017, 12:29 a.m.
Message ID <33c058ef48902109bce8.1498004968@1.0.0.127.in-addr.arpa>
Download mbox | patch
Permalink /patch/21558/
State Accepted
Headers show

Comments

Sean Farley - June 21, 2017, 12:29 a.m.
# HG changeset patch
# User Sean Farley <sean@farley.io>
# Date 1497997120 25200
#      Tue Jun 20 15:18:40 2017 -0700
# Branch bm-refactor
# Node ID 33c058ef48902109bce8c199ba17b5afea58b8a0
# Parent  c14bfdac2be657612b693fca8ec7dea2f3c47182
bookmarks: factor out adding a list of bookmarks from commands

While we're here, let's use fancy context managers. I believe this
should still work since our locks are re-entrant.

Patch

diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
index 8ba4f75..76f01e1 100644
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -728,5 +728,38 @@  def rename(repo, old, new, force=False, 
         marks[mark] = marks[old]
         if repo._activebookmark == old and not inactive:
             activate(repo, mark)
         del marks[old]
         marks.recordchange(tr)
+
+def addbookmarks(repo, names, rev=None, force=False, inactive=False):
+    """add a list of bookmarks
+
+    If force is specified, then the new name can overwrite an existing
+    bookmark.
+
+    If inactive is specified, then do not activate any bookmark. Otherwise, the
+    first bookmark is activated.
+
+    Raises an abort error if old is not in the bookmark store.
+    """
+    with repo.wlock(), repo.lock(), repo.transaction('bookmark') as tr:
+        marks = repo._bookmarks
+        cur = repo.changectx('.').node()
+        newact = None
+        for mark in names:
+            mark = checkformat(repo, mark)
+            if newact is None:
+                newact = mark
+            if inactive and mark == repo._activebookmark:
+                deactivate(repo)
+                return
+            tgt = cur
+            if rev:
+                tgt = scmutil.revsingle(repo, rev).node()
+            marks.checkconflict(mark, force, tgt)
+            marks[mark] = tgt
+        if not inactive and cur == marks[newact] and not rev:
+            activate(repo, newact)
+        elif cur != tgt and newact == repo._activebookmark:
+            deactivate(repo)
+        marks.recordchange(tr)
diff --git a/mercurial/commands.py b/mercurial/commands.py
index 8867bc5..e87c74e 100644
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -980,28 +980,11 @@  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"))
                 bookmarks.rename(repo, rename, names[0], force, inactive)
             elif names:
-                tr = repo.transaction('bookmark')
-                newact = None
-                for mark in names:
-                    mark = bookmarks.checkformat(repo, mark)
-                    if newact is None:
-                        newact = mark
-                    if inactive and mark == repo._activebookmark:
-                        bookmarks.deactivate(repo)
-                        return
-                    tgt = cur
-                    if rev:
-                        tgt = scmutil.revsingle(repo, rev).node()
-                    marks.checkconflict(mark, force, tgt)
-                    marks[mark] = tgt
-                if not inactive and cur == marks[newact] and not rev:
-                    bookmarks.activate(repo, newact)
-                elif cur != tgt and newact == repo._activebookmark:
-                    bookmarks.deactivate(repo)
+                bookmarks.addbookmarks(repo, names, rev, force, inactive)
             elif inactive:
                 if len(marks) == 0:
                     ui.status(_("no bookmarks set\n"))
                 elif not repo._activebookmark:
                     ui.status(_("no active bookmark\n"))