mercurial/revlog.py
changeset 26 9cf83bf9ad38
parent 14 e0e5c1b9febd
child 36 da28286bf6b7
equal deleted inserted replaced
25:daa724b27300 26:9cf83bf9ad38
    37         try:
    37         try:
    38             n = 0
    38             n = 0
    39             i = self.opener(self.indexfile).read()
    39             i = self.opener(self.indexfile).read()
    40             s = struct.calcsize(indexformat)
    40             s = struct.calcsize(indexformat)
    41             for f in range(0, len(i), s):
    41             for f in range(0, len(i), s):
    42                 # offset, size, base, linkrev, p1, p2, nodeid, changeset
    42                 # offset, size, base, linkrev, p1, p2, nodeid
    43                 e = struct.unpack(indexformat, i[f:f + s])
    43                 e = struct.unpack(indexformat, i[f:f + s])
    44                 self.nodemap[e[6]] = n
    44                 self.nodemap[e[6]] = n
    45                 self.index.append(e)
    45                 self.index.append(e)
    46                 n += 1
    46                 n += 1
    47         except IOError: pass
    47         except IOError: pass
    48 
    48 
    49     def tip(self): return self.node(len(self.index) - 1)
    49     def tip(self): return self.node(len(self.index) - 1)
    50     def count(self): return len(self.index)
    50     def count(self): return len(self.index)
    51     def node(self, rev): return rev < 0 and nullid or self.index[rev][6]
    51     def node(self, rev): return (rev < 0) and nullid or self.index[rev][6]
    52     def rev(self, node): return self.nodemap[node]
    52     def rev(self, node): return self.nodemap[node]
    53     def linkrev(self, node): return self.index[self.nodemap[node]][3]
    53     def linkrev(self, node): return self.index[self.nodemap[node]][3]
    54     def parents(self, node):
    54     def parents(self, node):
    55         if node == nullid: return (nullid, nullid)
    55         if node == nullid: return (nullid, nullid)
    56         return self.index[self.nodemap[node]][4:6]
    56         return self.index[self.nodemap[node]][4:6]
   101             b = decompress(data[last:last + s])
   101             b = decompress(data[last:last + s])
   102             text = self.patch(text, b)
   102             text = self.patch(text, b)
   103             last = last + s
   103             last = last + s
   104 
   104 
   105         (p1, p2) = self.parents(node)
   105         (p1, p2) = self.parents(node)
   106         if self.node(rev) != hash(text, p1, p2):
   106         if node != hash(text, p1, p2):
   107             raise "Consistency check failed on %s:%d" % (self.datafile, rev)
   107             raise "integrity check failed on %s:%d" % (self.datafile, rev)
   108 
   108 
   109         self.cache = (node, rev, text)
   109         self.cache = (node, rev, text)
   110         return text  
   110         return text  
   111 
   111 
   112     def addrevision(self, text, transaction, link, p1=None, p2=None):
   112     def addrevision(self, text, transaction, link, p1=None, p2=None):
   121 
   121 
   122         if n:
   122         if n:
   123             start = self.start(self.base(t))
   123             start = self.start(self.base(t))
   124             end = self.end(t)
   124             end = self.end(t)
   125             prev = self.revision(self.tip())
   125             prev = self.revision(self.tip())
   126             if 0:
       
   127                 dd = self.diff(prev, text)
       
   128                 tt = self.patch(prev, dd)
       
   129                 if tt != text:
       
   130                     print prev
       
   131                     print text
       
   132                     print tt
       
   133                     raise "diff+patch failed"
       
   134             data = compress(self.diff(prev, text))
   126             data = compress(self.diff(prev, text))
   135 
   127 
   136         # full versions are inserted when the needed deltas
   128         # full versions are inserted when the needed deltas
   137         # become comparable to the uncompressed text
   129         # become comparable to the uncompressed text
   138         if not n or (end + len(data) - start) > len(text) * 2:
   130         if not n or (end + len(data) - start) > len(text) * 2:
   149         
   141         
   150         self.index.append(e)
   142         self.index.append(e)
   151         self.nodemap[node] = n
   143         self.nodemap[node] = n
   152         entry = struct.pack(indexformat, *e)
   144         entry = struct.pack(indexformat, *e)
   153 
   145 
   154         transaction.add(self.datafile, e[0] - 1)
   146         transaction.add(self.datafile, e[0])
   155         self.opener(self.datafile, "a").write(data)
   147         self.opener(self.datafile, "a").write(data)
   156         transaction.add(self.indexfile, (n + 1) * len(entry) - 1)
   148         transaction.add(self.indexfile, (n + 1) * len(entry))
   157         self.opener(self.indexfile, "a").write(entry)
   149         self.opener(self.indexfile, "a").write(entry)
   158 
   150 
   159         self.cache = (node, n, text)
   151         self.cache = (node, n, text)
   160         return node
   152         return node
   161 
   153