changeset 9693:c40a1ee20aa5

transaction: always remove empty journal on abort When transactions without entries were aborted, the journal (of size 0) was not unlinked, which prevents subsequent operations until hg recover is run on the repository. We also make sure the journal is unlinked when committing, even if the provided hook doesn't do so.
author Sune Foldager <cryo@cyanite.org>
date Mon, 02 Nov 2009 10:19:14 +0100
parents 807633f1e3c2
children 8269fe2d48f6
files mercurial/transaction.py tests/test-journal-exists tests/test-journal-exists.out
diffstat 3 files changed, 17 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/transaction.py	Mon Nov 02 10:18:43 2009 +0100
+++ b/mercurial/transaction.py	Mon Nov 02 10:19:14 2009 +0100
@@ -59,8 +59,7 @@
 
     def __del__(self):
         if self.journal:
-            if self.entries: self._abort()
-            self.file.close()
+            self._abort()
 
     @active
     def startgroup(self):
@@ -126,7 +125,7 @@
         self.entries = []
         if self.after:
             self.after()
-        else:
+        if os.path.isfile(self.journal):
             os.unlink(self.journal)
         self.journal = None
 
@@ -141,7 +140,10 @@
         self.count = 0
         self.file.close()
 
-        if not self.entries: return
+        if not self.entries:
+            if self.journal:
+                os.unlink(self.journal)
+            return
 
         self.report(_("transaction abort!\n"))
 
--- a/tests/test-journal-exists	Mon Nov 02 10:18:43 2009 +0100
+++ b/tests/test-journal-exists	Mon Nov 02 10:19:14 2009 +0100
@@ -3,6 +3,7 @@
 hg init
 echo a > a
 hg ci -Am0
+hg -q clone . foo
 
 touch .hg/store/journal
 
@@ -10,3 +11,10 @@
 hg ci -Am0
 
 hg recover
+
+echo % check that zero-size journals are correctly aborted
+hg bundle -qa repo.hg
+chmod -w foo/.hg/store/00changelog.i
+hg -R foo unbundle repo.hg 2>&1 | sed 's/\(abort: Permission denied\).*/\1/'
+if test -f foo/.hg/store/journal; then echo 'journal exists :-('; fi
+exit 0
--- a/tests/test-journal-exists.out	Mon Nov 02 10:18:43 2009 +0100
+++ b/tests/test-journal-exists.out	Mon Nov 02 10:19:14 2009 +0100
@@ -6,3 +6,6 @@
 crosschecking files in changesets and manifests
 checking files
 1 files, 1 changesets, 1 total revisions
+% check that zero-size journals are correctly aborted
+adding changesets
+abort: Permission denied