mercurial/transaction.py
changeset 23312 006e9ef05c31
parent 23311 64ab33ffba14
child 23313 991098579940
--- a/mercurial/transaction.py	Fri Oct 17 21:04:35 2014 -0700
+++ b/mercurial/transaction.py	Thu Nov 13 11:17:09 2014 +0000
@@ -45,31 +45,41 @@
 
     backupfiles = []
     for l, f, b, c in backupentries:
+        if l not in vfsmap and c:
+            report("couldn't handle %s: unknown cache location %s\n"
+                        % (b, l))
         vfs = vfsmap[l]
-        if f and b:
-            filepath = vfs.join(f)
-            backuppath = vfs.join(b)
-            try:
-                util.copyfile(backuppath, filepath)
-                backupfiles.append(b)
-            except IOError:
-                report(_("failed to recover %s\n") % f)
+        try:
+            if f and b:
+                filepath = vfs.join(f)
+                backuppath = vfs.join(b)
+                try:
+                    util.copyfile(backuppath, filepath)
+                    backupfiles.append(b)
+                except IOError:
+                    report(_("failed to recover %s\n") % f)
+            else:
+                target = f or b
+                try:
+                    vfs.unlink(target)
+                except (IOError, OSError), inst:
+                    if inst.errno != errno.ENOENT:
+                        raise
+        except (IOError, OSError, util.Abort), inst:
+            if not c:
                 raise
-        else:
-            target = f or b
-            try:
-                vfs.unlink(target)
-            except (IOError, OSError), inst:
-                if inst.errno != errno.ENOENT:
-                    raise
 
     opener.unlink(journal)
     backuppath = "%s.backupfiles" % journal
     if opener.exists(backuppath):
         opener.unlink(backuppath)
-    for f in backupfiles:
-        if opener.exists(f):
-            opener.unlink(f)
+    try:
+        for f in backupfiles:
+            if opener.exists(f):
+                opener.unlink(f)
+    except (IOError, OSError, util.Abort), inst:
+        # only pure backup file remains, it is sage to ignore any error
+        pass
 
 class transaction(object):
     def __init__(self, report, opener, vfsmap, journal, after=None,
@@ -365,10 +375,21 @@
         self.file.close()
         self._backupsfile.close()
         # cleanup temporary files
-        for l, f, b, _c in self._backupentries:
+        for l, f, b, c in self._backupentries:
+            if l not in self._vfsmap and c:
+                self.report("couldn't remote %s: unknown cache location %s\n"
+                            % (b, l))
+                continue
             vfs = self._vfsmap[l]
             if not f and b and vfs.exists(b):
-                vfs.unlink(b)
+                try:
+                    vfs.unlink(b)
+                except (IOError, OSError, util.Abort), inst:
+                    if not c:
+                        raise
+                    # Abort may be raise by read only opener
+                    self.report("couldn't remote %s: %s\n"
+                                % (vfs.join(b), inst))
         self.entries = []
         if self.after:
             self.after()
@@ -376,10 +397,21 @@
             self.opener.unlink(self.journal)
         if self.opener.isfile(self._backupjournal):
             self.opener.unlink(self._backupjournal)
-            for _l, _f, b, _c in self._backupentries:
+            for _l, _f, b, c in self._backupentries:
+                if l not in self._vfsmap and c:
+                    self.report("couldn't remote %s: unknown cache location"
+                                "%s\n" % (b, l))
+                    continue
                 vfs = self._vfsmap[l]
                 if b and vfs.exists(b):
-                    vfs.unlink(b)
+                    try:
+                        vfs.unlink(b)
+                    except (IOError, OSError, util.Abort), inst:
+                        if not c:
+                            raise
+                        # Abort may be raise by read only opener
+                        self.report("couldn't remote %s: %s\n"
+                                    % (vfs.join(b), inst))
         self._backupentries = []
         self.journal = None
         # run post close action