Mercurial > hg > mercurial-crew-with-dirclash
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 | fe1689273f84 |
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 |