# HG changeset patch # User Sune Foldager # Date 1257153554 -3600 # Node ID c40a1ee20aa51378c66b931b9d51dd2459274d6e # Parent 807633f1e3c23b10db5278611105ee48b9d2b721 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. diff -r 807633f1e3c2 -r c40a1ee20aa5 mercurial/transaction.py --- 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")) diff -r 807633f1e3c2 -r c40a1ee20aa5 tests/test-journal-exists --- 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 diff -r 807633f1e3c2 -r c40a1ee20aa5 tests/test-journal-exists.out --- 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