# HG changeset patch # User Matt Mackall # Date 2011-05-08 21:16:41 # Node ID a55a0045704cc5d915253b8f7fbed4046d3e6daf # Parent 6332c02b3d687db5cf634f09ebb64714f53c42cf # Parent 89e7d35e0ef09ed3d9c9f6bbd2803c9c8639fcca merge with stable diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -71,14 +71,6 @@ def write(repo): ''' refs = repo._bookmarks - try: - bms = repo.opener.read('bookmarks') - except IOError, inst: - if inst.errno != errno.ENOENT: - raise - bms = '' - repo.opener.write('undo.bookmarks', bms) - if repo._bookmarkcurrent not in refs: setcurrent(repo, None) for mark in refs.keys(): diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -674,6 +674,17 @@ class localrepository(repo.repository): raise error.RepoError( _("abandoned transaction found - run hg recover")) + journalfiles = self._writejournal(desc) + renames = [(x, undoname(x)) for x in journalfiles] + + tr = transaction.transaction(self.ui.warn, self.sopener, + self.sjoin("journal"), + aftertrans(renames), + self.store.createmode) + self._transref = weakref.ref(tr) + return tr + + def _writejournal(self, desc): # save dirstate for rollback try: ds = self.opener.read("dirstate") @@ -685,16 +696,15 @@ class localrepository(repo.repository): self.opener.write("journal.desc", "%d\n%s\n" % (len(self), desc)) - renames = [(self.sjoin("journal"), self.sjoin("undo")), - (self.join("journal.dirstate"), self.join("undo.dirstate")), - (self.join("journal.branch"), self.join("undo.branch")), - (self.join("journal.desc"), self.join("undo.desc"))] - tr = transaction.transaction(self.ui.warn, self.sopener, - self.sjoin("journal"), - aftertrans(renames), - self.store.createmode) - self._transref = weakref.ref(tr) - return tr + bkname = self.join('bookmarks') + if os.path.exists(bkname): + util.copyfile(bkname, self.join('journal.bookmarks')) + else: + self.opener('journal.bookmarks', 'w').write('') + + return (self.sjoin('journal'), self.join('journal.dirstate'), + self.join('journal.branch'), self.join('journal.desc'), + self.join('journal.bookmarks')) def recover(self): lock = self.lock() @@ -1950,6 +1960,11 @@ def aftertrans(files): util.rename(src, dest) return a +def undoname(fn): + base, name = os.path.split(fn) + assert name.startswith('journal') + return os.path.join(base, name.replace('journal', 'undo', 1)) + def instance(ui, path, create): return localrepository(ui, util.localpath(path), create) diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t --- a/tests/test-bookmarks.t +++ b/tests/test-bookmarks.t @@ -235,6 +235,7 @@ the bookmark extension should be ignored Y 2:db815d6d32e6 * Z 2:db815d6d32e6 x y 2:db815d6d32e6 + test summary $ hg summary @@ -249,6 +250,22 @@ test id $ hg id db815d6d32e6 tip Y/Z/x y +test rollback + + $ echo foo > f1 + $ hg ci -Amr + adding f1 + $ hg bookmark -f Y -r 1 + $ hg bookmark -f Z -r 1 + $ hg rollback + repository tip rolled back to revision 2 (undo commit) + working directory now based on revision 2 + $ hg bookmarks + X2 1:925d80f479bb + Y 2:db815d6d32e6 + * Z 2:db815d6d32e6 + x y 2:db815d6d32e6 + test clone $ hg bookmarks diff --git a/tests/test-fncache.t b/tests/test-fncache.t --- a/tests/test-fncache.t +++ b/tests/test-fncache.t @@ -76,6 +76,7 @@ Non store repo: .hg/last-message.txt .hg/requires .hg/undo + .hg/undo.bookmarks .hg/undo.branch .hg/undo.desc .hg/undo.dirstate @@ -102,6 +103,7 @@ Non fncache repo: .hg/store/data/tst.d.hg .hg/store/data/tst.d.hg/_foo.i .hg/store/undo + .hg/undo.bookmarks .hg/undo.branch .hg/undo.desc .hg/undo.dirstate diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks.t --- a/tests/test-hardlinks.t +++ b/tests/test-hardlinks.t @@ -194,6 +194,7 @@ r4 has hardlinks in the working dir (not 2 r4/.hg/store/data/f1.i 2 r4/.hg/store/fncache 2 r4/.hg/store/undo + 2 r4/.hg/undo.bookmarks 2 r4/.hg/undo.branch 2 r4/.hg/undo.desc 2 r4/.hg/undo.dirstate @@ -222,6 +223,7 @@ Update back to revision 11 in r4 should 2 r4/.hg/store/data/f1.i 2 r4/.hg/store/fncache 2 r4/.hg/store/undo + 2 r4/.hg/undo.bookmarks 2 r4/.hg/undo.branch 2 r4/.hg/undo.desc 2 r4/.hg/undo.dirstate diff --git a/tests/test-hup.t b/tests/test-hup.t --- a/tests/test-hup.t +++ b/tests/test-hup.t @@ -17,4 +17,4 @@ Test hangup signal in the middle of tran rollback completed killed! $ echo .hg/* .hg/store/* - .hg/00changelog.i .hg/journal.branch .hg/journal.desc .hg/journal.dirstate .hg/requires .hg/store .hg/store/00changelog.i .hg/store/00changelog.i.a + .hg/00changelog.i .hg/journal.bookmarks .hg/journal.branch .hg/journal.desc .hg/journal.dirstate .hg/requires .hg/store .hg/store/00changelog.i .hg/store/00changelog.i.a diff --git a/tests/test-inherit-mode.t b/tests/test-inherit-mode.t --- a/tests/test-inherit-mode.t +++ b/tests/test-inherit-mode.t @@ -77,6 +77,7 @@ new directories are setgid 00660 ./.hg/store/data/foo.i 00660 ./.hg/store/fncache 00660 ./.hg/store/undo + 00660 ./.hg/undo.bookmarks 00660 ./.hg/undo.branch 00660 ./.hg/undo.desc 00660 ./.hg/undo.dirstate @@ -117,6 +118,7 @@ group can still write everything 00660 ../push/.hg/store/data/foo.i 00660 ../push/.hg/store/fncache 00660 ../push/.hg/store/undo + 00660 ../push/.hg/undo.bookmarks 00660 ../push/.hg/undo.branch 00660 ../push/.hg/undo.desc 00660 ../push/.hg/undo.dirstate