comparison mercurial/transaction.py @ 162:5dcbe4d9a30c

Implement recover and undo commands This adds an interface to transaction to rollback with a given journal file and commands to rollback an existing .hg/journal or .hg/undo.
author mpm@selenic.com
date Thu, 26 May 2005 09:04:54 -0800
parents 8d55c2d72c7c
children 43b8da7420a9 688d03d6997a
comparison
equal deleted inserted replaced
161:0b4c5cb953d9 162:5dcbe4d9a30c
13 13
14 import os 14 import os
15 15
16 class transaction: 16 class transaction:
17 def __init__(self, opener, journal, after = None): 17 def __init__(self, opener, journal, after = None):
18 self.journal = None
19
20 # abort here if the journal already exists
21 if os.path.exists(journal):
22 raise "journal already exists - run hg recover"
23
18 self.opener = opener 24 self.opener = opener
19 self.after = after 25 self.after = after
20 self.entries = [] 26 self.entries = []
21 self.map = {} 27 self.map = {}
22 self.journal = journal 28 self.journal = journal
23
24 # abort here if the journal already exists
25 if os.path.exists(self.journal):
26 raise "journal already exists!"
27 29
28 self.file = open(self.journal, "w") 30 self.file = open(self.journal, "w")
29 31
30 def __del__(self): 32 def __del__(self):
31 if self.entries: self.abort() 33 if self.entries: self.abort()
61 63
62 self.entries = [] 64 self.entries = []
63 65
64 print "rollback completed" 66 print "rollback completed"
65 67
66 def recover(self): 68 def rollback(opener, file):
67 for l in open(self.journal).readlines(): 69 for l in open(file).readlines():
68 f, o = l.split('\0') 70 f, o = l.split('\0')
69 self.opener(f, "a").truncate(int(o)) 71 opener(f, "a").truncate(int(o))
70 os.unlink(self.journal) 72 os.unlink(file)
71 73