##// END OF EJS Templates
transaction: add atomic groups to transaction logic...
Henrik Stuart -
r8363:c8e81f55 default
parent child Browse files
Show More
@@ -125,10 +125,12 b' def strip(ui, repo, node, backup="all"):'
125 tr = repo.transaction()
125 tr = repo.transaction()
126 offset = len(tr.entries)
126 offset = len(tr.entries)
127
127
128 tr.startgroup()
128 cl.strip(striprev, tr)
129 cl.strip(striprev, tr)
129 mfst.strip(striprev, tr)
130 mfst.strip(striprev, tr)
130 for f in fs:
131 for f in fs:
131 f.strip(striprev, tr)
132 f.strip(striprev, tr)
133 tr.endgroup()
132
134
133 try:
135 try:
134 for i in xrange(offset, len(tr.entries)):
136 for i in xrange(offset, len(tr.entries)):
@@ -51,6 +51,7 b' class transaction(object):'
51 self.entries = []
51 self.entries = []
52 self.map = {}
52 self.map = {}
53 self.journal = journal
53 self.journal = journal
54 self._queue = []
54
55
55 self.file = open(self.journal, "w")
56 self.file = open(self.journal, "w")
56 if createmode is not None:
57 if createmode is not None:
@@ -62,8 +63,25 b' class transaction(object):'
62 self.file.close()
63 self.file.close()
63
64
64 @active
65 @active
66 def startgroup(self):
67 self._queue.append([])
68
69 @active
70 def endgroup(self):
71 q = self._queue.pop()
72 d = ''.join(['%s\0%d\n' % (x[0], x[1]) for x in q])
73 self.entries.extend(q)
74 self.file.write(d)
75 self.file.flush()
76
77 @active
65 def add(self, file, offset, data=None):
78 def add(self, file, offset, data=None):
66 if file in self.map: return
79 if file in self.map: return
80
81 if self._queue:
82 self._queue[-1].append((file, offset, data))
83 return
84
67 self.entries.append((file, offset, data))
85 self.entries.append((file, offset, data))
68 self.map[file] = len(self.entries) - 1
86 self.map[file] = len(self.entries) - 1
69 # add enough data to the journal to do the truncate
87 # add enough data to the journal to do the truncate
@@ -78,6 +96,11 b' class transaction(object):'
78
96
79 @active
97 @active
80 def replace(self, file, offset, data=None):
98 def replace(self, file, offset, data=None):
99 '''
100 replace can only replace already committed entries
101 that are not pending in the queue
102 '''
103
81 if file not in self.map:
104 if file not in self.map:
82 raise KeyError(file)
105 raise KeyError(file)
83 index = self.map[file]
106 index = self.map[file]
General Comments 0
You need to be logged in to leave comments. Login now