218 except IOError, err: |
218 except IOError, err: |
219 if err.errno != errno.ENOENT: |
219 if err.errno != errno.ENOENT: |
220 raise |
220 raise |
221 raise util.Abort(_('no histedit in progress')) |
221 raise util.Abort(_('no histedit in progress')) |
222 |
222 |
223 parentctxnode, rules, keep, topmost, replacements = pickle.load(fp) |
223 try: |
|
224 data = pickle.load(fp) |
|
225 parentctxnode, rules, keep, topmost, replacements = data |
|
226 except pickle.UnpicklingError: |
|
227 data = self._load() |
|
228 parentctxnode, rules, keep, topmost, replacements = data |
224 |
229 |
225 self.parentctxnode = parentctxnode |
230 self.parentctxnode = parentctxnode |
226 self.rules = rules |
231 self.rules = rules |
227 self.keep = keep |
232 self.keep = keep |
228 self.topmost = topmost |
233 self.topmost = topmost |
229 self.replacements = replacements |
234 self.replacements = replacements |
230 |
235 |
231 def write(self): |
236 def write(self): |
232 fp = self.repo.vfs('histedit-state', 'w') |
237 fp = self.repo.vfs('histedit-state', 'w') |
233 pickle.dump((self.parentctxnode, self.rules, self.keep, |
238 fp.write('v1\n') |
234 self.topmost, self.replacements), fp) |
239 fp.write('%s\n' % node.hex(self.parentctxnode)) |
|
240 fp.write('%s\n' % node.hex(self.topmost)) |
|
241 fp.write('%s\n' % self.keep) |
|
242 fp.write('%d\n' % len(self.rules)) |
|
243 for rule in self.rules: |
|
244 fp.write('%s%s\n' % (rule[1], rule[0])) |
|
245 fp.write('%d\n' % len(self.replacements)) |
|
246 for replacement in self.replacements: |
|
247 fp.write('%s%s\n' % (node.hex(replacement[0]), ''.join(node.hex(r) |
|
248 for r in replacement[1]))) |
235 fp.close() |
249 fp.close() |
|
250 |
|
251 def _load(self): |
|
252 fp = self.repo.vfs('histedit-state', 'r') |
|
253 lines = [l[:-1] for l in fp.readlines()] |
|
254 |
|
255 index = 0 |
|
256 lines[index] # version number |
|
257 index += 1 |
|
258 |
|
259 parentctxnode = node.bin(lines[index]) |
|
260 index += 1 |
|
261 |
|
262 topmost = node.bin(lines[index]) |
|
263 index += 1 |
|
264 |
|
265 keep = lines[index] == 'True' |
|
266 index += 1 |
|
267 |
|
268 # Rules |
|
269 rules = [] |
|
270 rulelen = int(lines[index]) |
|
271 index += 1 |
|
272 for i in xrange(rulelen): |
|
273 rule = lines[index] |
|
274 rulehash = rule[:40] |
|
275 ruleaction = rule[40:] |
|
276 rules.append((ruleaction, rulehash)) |
|
277 index += 1 |
|
278 |
|
279 # Replacements |
|
280 replacements = [] |
|
281 replacementlen = int(lines[index]) |
|
282 index += 1 |
|
283 for i in xrange(replacementlen): |
|
284 replacement = lines[index] |
|
285 original = node.bin(replacement[:40]) |
|
286 succ = [node.bin(replacement[i:i + 40]) for i in |
|
287 range(40, len(replacement), 40)] |
|
288 replacements.append((original, succ)) |
|
289 index += 1 |
|
290 |
|
291 fp.close() |
|
292 |
|
293 return parentctxnode, rules, keep, topmost, replacements |
236 |
294 |
237 def clear(self): |
295 def clear(self): |
238 self.repo.vfs.unlink('histedit-state') |
296 self.repo.vfs.unlink('histedit-state') |
239 |
297 |
240 def commitfuncfor(repo, src): |
298 def commitfuncfor(repo, src): |