comparison mercurial/transaction.py @ 2084:d66278012853

Fix transaction handling during interleaved file split.
author Chris Mason <mason@suse.com>
date Mon, 17 Apr 2006 13:19:58 -0400
parents a2c69737e65e
children
comparison
equal deleted inserted replaced
2083:345107e167a0 2084:d66278012853
37 if self.entries: self.abort() 37 if self.entries: self.abort()
38 self.file.close() 38 self.file.close()
39 try: os.unlink(self.journal) 39 try: os.unlink(self.journal)
40 except: pass 40 except: pass
41 41
42 def add(self, file, offset): 42 def add(self, file, offset, data=None):
43 if file in self.map: return 43 if file in self.map: return
44 self.entries.append((file, offset)) 44 self.entries.append((file, offset, data))
45 self.map[file] = 1 45 self.map[file] = len(self.entries) - 1
46 # add enough data to the journal to do the truncate 46 # add enough data to the journal to do the truncate
47 self.file.write("%s\0%d\n" % (file, offset))
48 self.file.flush()
49
50 def find(self, file):
51 if file in self.map:
52 return self.entries[self.map[file]]
53 return None
54
55 def replace(self, file, offset, data=None):
56 if file not in self.map:
57 raise KeyError(file)
58 index = self.map[file]
59 self.entries[index] = (file, offset, data)
47 self.file.write("%s\0%d\n" % (file, offset)) 60 self.file.write("%s\0%d\n" % (file, offset))
48 self.file.flush() 61 self.file.flush()
49 62
50 def nest(self): 63 def nest(self):
51 self.count += 1 64 self.count += 1
69 def abort(self): 82 def abort(self):
70 if not self.entries: return 83 if not self.entries: return
71 84
72 self.report(_("transaction abort!\n")) 85 self.report(_("transaction abort!\n"))
73 86
74 for f, o in self.entries: 87 for f, o, ignore in self.entries:
75 try: 88 try:
76 self.opener(f, "a").truncate(o) 89 self.opener(f, "a").truncate(o)
77 except: 90 except:
78 self.report(_("failed to truncate %s\n") % f) 91 self.report(_("failed to truncate %s\n") % f)
79 92
80 self.entries = [] 93 self.entries = []
81 94
82 self.report(_("rollback completed\n")) 95 self.report(_("rollback completed\n"))
83 96
84 def rollback(opener, file): 97 def rollback(opener, file):
98 files = {}
85 for l in open(file).readlines(): 99 for l in open(file).readlines():
86 f, o = l.split('\0') 100 f, o = l.split('\0')
101 files[f] = o
102 for f in files:
103 o = files[f]
87 opener(f, "a").truncate(int(o)) 104 opener(f, "a").truncate(int(o))
88 os.unlink(file) 105 os.unlink(file)
89 106