hgext/histedit.py
changeset 24756 d71c2da01d0d
parent 24626 e767f5aba810
child 24757 7b59f16174c5
equal deleted inserted replaced
24755:cd89f4e6faf2 24756:d71c2da01d0d
   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):