mercurial/revlog.py
changeset 116 e484cd5ec282
parent 115 39b438eeb25a
child 117 2ac722ad1a9d
equal deleted inserted replaced
115:39b438eeb25a 116:e484cd5ec282
   122     def __init__(self, opener, indexfile, datafile):
   122     def __init__(self, opener, indexfile, datafile):
   123         self.indexfile = indexfile
   123         self.indexfile = indexfile
   124         self.datafile = datafile
   124         self.datafile = datafile
   125         self.opener = opener
   125         self.opener = opener
   126         self.cache = None
   126         self.cache = None
   127         # read the whole index for now, handle on-demand later
   127 
   128         try:
   128         try:
   129             i = self.opener(self.indexfile).read()
   129             i = self.opener(self.indexfile).read()
   130         except IOError:
   130         except IOError:
   131             i = ""
   131             i = ""
   132         parser = lazyparser(i)
   132 
   133         self.index = lazyindex(parser)
   133         if len(i) > 10000:
   134         self.nodemap = lazymap(parser)
   134             # big index, let's parse it on demand
       
   135             parser = lazyparser(i)
       
   136             self.index = lazyindex(parser)
       
   137             self.nodemap = lazymap(parser)
       
   138         else:
       
   139             s = struct.calcsize(indexformat)
       
   140             l = len(i) / s
       
   141             self.index = [None] * l
       
   142             m = [None] * l
       
   143 
       
   144             n = 0
       
   145             for f in xrange(0, len(i), s):
       
   146                 # offset, size, base, linkrev, p1, p2, nodeid
       
   147                 e = struct.unpack(indexformat, i[f:f + s])
       
   148                 m[n] = (e[6], n)
       
   149                 self.index[n] = e
       
   150                 n += 1
       
   151 
       
   152             self.nodemap = dict(m)
       
   153             self.nodemap[nullid] = -1
       
   154             
   135 
   155 
   136     def tip(self): return self.node(len(self.index) - 1)
   156     def tip(self): return self.node(len(self.index) - 1)
   137     def count(self): return len(self.index)
   157     def count(self): return len(self.index)
   138     def node(self, rev): return (rev < 0) and nullid or self.index[rev][6]
   158     def node(self, rev): return (rev < 0) and nullid or self.index[rev][6]
   139     def rev(self, node): return self.nodemap[node]
   159     def rev(self, node): return self.nodemap[node]