mercurial/transaction.py
changeset 22663 4c6198737ad8
parent 22662 c4d63f6740b8
child 23063 cd86a6707159
--- a/mercurial/transaction.py	Wed Oct 01 21:40:44 2014 -0500
+++ b/mercurial/transaction.py	Sun Sep 28 00:36:42 2014 -0700
@@ -144,7 +144,7 @@
         self.file.flush()
 
     @active
-    def addbackup(self, file, hardlink=True):
+    def addbackup(self, file, hardlink=True, vfs=None):
         """Adds a backup of the file to the transaction
 
         Calling addbackup() creates a hardlink backup of the specified file
@@ -158,8 +158,10 @@
         if file in self.map or file in self.backupmap:
             return
         backupfile = "%s.backup.%s" % (self.journal, file)
-        if self.opener.exists(file):
-            filepath = self.opener.join(file)
+        if vfs is None:
+            vfs = self.opener
+        if vfs.exists(file):
+            filepath = vfs.join(file)
             backuppath = self.opener.join(backupfile)
             util.copyfiles(filepath, backuppath, hardlink=hardlink)
         else:
@@ -176,7 +178,7 @@
         self.backupsfile.flush()
 
     @active
-    def addfilegenerator(self, genid, filenames, genfunc, order=0):
+    def addfilegenerator(self, genid, filenames, genfunc, order=0, vfs=None):
         """add a function to generates some files at transaction commit
 
         The `genfunc` argument is a function capable of generating proper
@@ -195,7 +197,10 @@
         The `order` argument may be used to control the order in which multiple
         generator will be executed.
         """
-        self._filegenerators[genid] = (order, filenames, genfunc)
+        # For now, we are unable to do proper backup and restore of custom vfs
+        # but for bookmarks that are handled outside this mechanism.
+        assert vfs is None or filenames == ('bookmarks',)
+        self._filegenerators[genid] = (order, filenames, genfunc, vfs)
 
     @active
     def find(self, file):
@@ -239,16 +244,19 @@
     def close(self):
         '''commit the transaction'''
         # write files registered for generation
-        for order, filenames, genfunc in sorted(self._filegenerators.values()):
+        for entry in sorted(self._filegenerators.values()):
+            order, filenames, genfunc, vfs = entry
+            if vfs is None:
+                vfs = self.opener
             files = []
             try:
                 for name in filenames:
                     # Some files are already backed up when creating the
                     # localrepo. Until this is properly fixed we disable the
                     # backup for them.
-                    if name not in ('phaseroots',):
+                    if name not in ('phaseroots', 'bookmarks'):
                         self.addbackup(name)
-                    files.append(self.opener(name, 'w', atomictemp=True))
+                    files.append(vfs(name, 'w', atomictemp=True))
                 genfunc(*files)
             finally:
                 for f in files: