bookmarks: move basic io to core
authorMatt Mackall <mpm@selenic.com>
Thu, 10 Feb 2011 13:46:27 -0600
changeset 13350 a7376b92caaa
parent 13349 0d3f35394af4
child 13351 6c5368cd2df9
bookmarks: move basic io to core
hgext/bookmarks.py
mercurial/bookmarks.py
--- a/hgext/bookmarks.py	Thu Feb 10 13:46:27 2011 -0600
+++ b/hgext/bookmarks.py	Thu Feb 10 13:46:27 2011 -0600
@@ -32,70 +32,9 @@
 from mercurial.node import nullid, nullrev, bin, hex, short
 from mercurial import util, commands, repair, extensions, pushkey, hg, url
 from mercurial import revset, encoding
+from mercurial import bookmarks
 import os
 
-def write(repo):
-    '''Write bookmarks
-
-    Write the given bookmark => hash dictionary to the .hg/bookmarks file
-    in a format equal to those of localtags.
-
-    We also store a backup of the previous state in undo.bookmarks that
-    can be copied back on rollback.
-    '''
-    refs = repo._bookmarks
-
-    try:
-        bms = repo.opener('bookmarks').read()
-    except IOError:
-        bms = ''
-    repo.opener('undo.bookmarks', 'w').write(bms)
-
-    if repo._bookmarkcurrent not in refs:
-        setcurrent(repo, None)
-    wlock = repo.wlock()
-    try:
-        file = repo.opener('bookmarks', 'w', atomictemp=True)
-        for refspec, node in refs.iteritems():
-            file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec)))
-        file.rename()
-
-        # touch 00changelog.i so hgweb reloads bookmarks (no lock needed)
-        try:
-            os.utime(repo.sjoin('00changelog.i'), None)
-        except OSError:
-            pass
-
-    finally:
-        wlock.release()
-
-def setcurrent(repo, mark):
-    '''Set the name of the bookmark that we are currently on
-
-    Set the name of the bookmark that we are on (hg update <bookmark>).
-    The name is recorded in .hg/bookmarks.current
-    '''
-    current = repo._bookmarkcurrent
-    if current == mark:
-        return
-
-    refs = repo._bookmarks
-
-    # do not update if we do update to a rev equal to the current bookmark
-    if (mark and mark not in refs and
-        current and refs[current] == repo.changectx('.').node()):
-        return
-    if mark not in refs:
-        mark = ''
-    wlock = repo.wlock()
-    try:
-        file = repo.opener('bookmarks.current', 'w', atomictemp=True)
-        file.write(mark)
-        file.rename()
-    finally:
-        wlock.release()
-    repo._bookmarkcurrent = mark
-
 def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None):
     '''track a line of development with movable markers
 
@@ -127,8 +66,8 @@
         marks[mark] = marks[rename]
         del marks[rename]
         if repo._bookmarkcurrent == rename:
-            setcurrent(repo, mark)
-        write(repo)
+            bookmarks.setcurrent(repo, mark)
+        bookmarks.write(repo)
         return
 
     if delete:
@@ -137,9 +76,9 @@
         if mark not in marks:
             raise util.Abort(_("a bookmark of this name does not exist"))
         if mark == repo._bookmarkcurrent:
-            setcurrent(repo, None)
+            bookmarks.setcurrent(repo, None)
         del marks[mark]
-        write(repo)
+        bookmarks.write(repo)
         return
 
     if mark is not None:
@@ -159,8 +98,8 @@
             marks[mark] = repo.lookup(rev)
         else:
             marks[mark] = repo.changectx('.').node()
-        setcurrent(repo, mark)
-        write(repo)
+        bookmarks.setcurrent(repo, mark)
+        bookmarks.write(repo)
         return
 
     if mark is None:
@@ -218,7 +157,7 @@
     if len(update) > 0:
         for m in update:
             marks[m] = repo.changectx('.').node()
-        write(repo)
+        bookmarks.write(repo)
 
 def reposetup(ui, repo):
     if not repo.local():
@@ -290,7 +229,7 @@
                         marks[mark] = node
                         update = True
             if update:
-                write(self)
+                bookmarks.write(self)
 
         def commitctx(self, ctx, error=False):
             """Add a revision to the repository and
@@ -331,7 +270,7 @@
                             self.ui.warn(_("not updating divergent"
                                            " bookmark %s\n") % k)
             if changed:
-                write(repo)
+                bookmarks.write(repo)
 
             return result
 
@@ -405,7 +344,7 @@
             if new not in repo:
                 return False
             marks[key] = repo[new].node()
-        write(repo)
+        bookmarks.write(repo)
         return True
     finally:
         w.release()
@@ -432,7 +371,7 @@
             # explicit pull overrides local bookmark if any
             ui.status(_("importing bookmark %s\n") % b)
             repo._bookmarks[b] = repo[rb[b]].node()
-        write(repo)
+        bookmarks.write(repo)
 
     return result
 
@@ -542,7 +481,7 @@
     rev = opts['rev']
     if not rev and len(args) > 0:
         rev = args[0]
-    setcurrent(repo, rev)
+    bookmarks.setcurrent(repo, rev)
     return res
 
 def bmrevset(repo, subset, x):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/bookmarks.py	Thu Feb 10 13:46:27 2011 -0600
@@ -0,0 +1,73 @@
+# Mercurial bookmark support code
+#
+# Copyright 2008 David Soria Parra <dsp@php.net>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.i18n import _
+from mercurial.node import nullid, nullrev, bin, hex, short
+from mercurial import encoding
+import os
+
+def write(repo):
+    '''Write bookmarks
+
+    Write the given bookmark => hash dictionary to the .hg/bookmarks file
+    in a format equal to those of localtags.
+
+    We also store a backup of the previous state in undo.bookmarks that
+    can be copied back on rollback.
+    '''
+    refs = repo._bookmarks
+
+    try:
+        bms = repo.opener('bookmarks').read()
+    except IOError:
+        bms = ''
+    repo.opener('undo.bookmarks', 'w').write(bms)
+
+    if repo._bookmarkcurrent not in refs:
+        setcurrent(repo, None)
+    wlock = repo.wlock()
+    try:
+        file = repo.opener('bookmarks', 'w', atomictemp=True)
+        for refspec, node in refs.iteritems():
+            file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec)))
+        file.rename()
+
+        # touch 00changelog.i so hgweb reloads bookmarks (no lock needed)
+        try:
+            os.utime(repo.sjoin('00changelog.i'), None)
+        except OSError:
+            pass
+
+    finally:
+        wlock.release()
+
+def setcurrent(repo, mark):
+    '''Set the name of the bookmark that we are currently on
+
+    Set the name of the bookmark that we are on (hg update <bookmark>).
+    The name is recorded in .hg/bookmarks.current
+    '''
+    current = repo._bookmarkcurrent
+    if current == mark:
+        return
+
+    refs = repo._bookmarks
+
+    # do not update if we do update to a rev equal to the current bookmark
+    if (mark and mark not in refs and
+        current and refs[current] == repo.changectx('.').node()):
+        return
+    if mark not in refs:
+        mark = ''
+    wlock = repo.wlock()
+    try:
+        file = repo.opener('bookmarks.current', 'w', atomictemp=True)
+        file.write(mark)
+        file.rename()
+    finally:
+        wlock.release()
+    repo._bookmarkcurrent = mark