--- a/mercurial/transaction.py Sat Apr 08 20:10:46 2006 -0400
+++ b/mercurial/transaction.py Mon Apr 17 13:19:58 2006 -0400
@@ -39,14 +39,27 @@
try: os.unlink(self.journal)
except: pass
- def add(self, file, offset):
+ def add(self, file, offset, data=None):
if file in self.map: return
- self.entries.append((file, offset))
- self.map[file] = 1
+ self.entries.append((file, offset, data))
+ self.map[file] = len(self.entries) - 1
# add enough data to the journal to do the truncate
self.file.write("%s\0%d\n" % (file, offset))
self.file.flush()
+ def find(self, file):
+ if file in self.map:
+ return self.entries[self.map[file]]
+ return None
+
+ def replace(self, file, offset, data=None):
+ if file not in self.map:
+ raise KeyError(file)
+ index = self.map[file]
+ self.entries[index] = (file, offset, data)
+ self.file.write("%s\0%d\n" % (file, offset))
+ self.file.flush()
+
def nest(self):
self.count += 1
return self
@@ -71,7 +84,7 @@
self.report(_("transaction abort!\n"))
- for f, o in self.entries:
+ for f, o, ignore in self.entries:
try:
self.opener(f, "a").truncate(o)
except:
@@ -82,8 +95,12 @@
self.report(_("rollback completed\n"))
def rollback(opener, file):
+ files = {}
for l in open(file).readlines():
f, o = l.split('\0')
+ files[f] = o
+ for f in files:
+ o = files[f]
opener(f, "a").truncate(int(o))
os.unlink(file)