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.
--- 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