mercurial/transaction.py
changeset 2084 d66278012853
parent 1806 a2c69737e65e
child 2470 fe1689273f84
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