# HG changeset patch # User Vadim Gelfer # Date 1150175390 25200 # Node ID 150cde10ea215ea37e2ac7e56e9b7550ec65438e # Parent fb942bc15ef995655c1dd734665a607435a45a14 dirstate.read: make 15% faster. time to read dirstate for my kernel repo goes from 0.22s to 0.18s. diff -r fb942bc15ef9 -r 150cde10ea21 mercurial/dirstate.py --- a/mercurial/dirstate.py Mon Jun 12 09:36:44 2006 -0700 +++ b/mercurial/dirstate.py Mon Jun 12 22:09:50 2006 -0700 @@ -155,31 +155,41 @@ if self.map is None: self.read() - def read(self): - self.map = {} - self.pl = [nullid, nullid] - try: - st = self.opener("dirstate").read() - if not st: return - except: return - + def parse(self, st): self.pl = [st[:20], st[20: 40]] + # deref fields so they will be local in loop + map = self.map + copies = self.copies + format = self.format + unpack = struct.unpack + pos = 40 - e_size = struct.calcsize(self.format) + e_size = struct.calcsize(format) + while pos < len(st): newpos = pos + e_size - e = struct.unpack(self.format, st[pos:newpos]) + e = unpack(format, st[pos:newpos]) l = e[4] pos = newpos newpos = pos + l f = st[pos:newpos] if '\0' in f: f, c = f.split('\0') - self.copies[f] = c - self.map[f] = e[:4] + copies[f] = c + map[f] = e[:4] pos = newpos + def read(self): + self.map = {} + self.pl = [nullid, nullid] + try: + st = self.opener("dirstate").read() + if st: + self.parse(st) + except IOError, err: + if err.errno != errno.ENOENT: raise + def copy(self, source, dest): self.lazyread() self.markdirty()