Mercurial > public > mercurial-scm > hg-stable
diff mercurial/dirstate.py @ 7093:16bafcebd3d1
dirstate: C parsing extension
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sun, 12 Oct 2008 15:21:08 -0500 |
parents | 852f39691a0a |
children | 6dab29f6df37 |
line wrap: on
line diff
--- a/mercurial/dirstate.py Sun Oct 12 15:21:08 2008 -0500 +++ b/mercurial/dirstate.py Sun Oct 12 15:21:08 2008 -0500 @@ -10,7 +10,7 @@ from node import nullid from i18n import _ import struct, os, stat, util, errno, ignore -import cStringIO, osutil, sys +import cStringIO, osutil, sys, parsers _unknown = ('?', 0, 0, 0) _format = ">cllll" @@ -190,8 +190,6 @@ def _read(self): self._map = {} self._copymap = {} - if not self._dirtypl: - self._pl = [nullid, nullid] try: st = self._opener("dirstate").read() except IOError, err: @@ -200,27 +198,9 @@ if not st: return + p = parsers.parse_dirstate(self._map, self._copymap, st); if not self._dirtypl: - self._pl = [st[:20], st[20: 40]] - - # deref fields so they will be local in loop - dmap = self._map - copymap = self._copymap - unpack = struct.unpack - e_size = struct.calcsize(_format) - pos1 = 40 - l = len(st) - - # the inner loop - while pos1 < l: - pos2 = pos1 + e_size - e = unpack(">cllll", st[pos1:pos2]) # a literal here is faster - pos1 = pos2 + e[4] - f = st[pos2:pos1] - if '\0' in f: - f, c = f.split('\0') - copymap[f] = c - dmap[f] = e # we hold onto e[4] because making a subtuple is slow + self._pl = p def invalidate(self): for a in "_map _copymap _foldmap _branch _pl _dirs _ignore".split(): @@ -274,7 +254,7 @@ self._dirty = True self._addpath(f) s = os.lstat(self._join(f)) - self._map[f] = ('n', s.st_mode, s.st_size, s.st_mtime, 0) + self._map[f] = ('n', s.st_mode, s.st_size, s.st_mtime) if f in self._copymap: del self._copymap[f] @@ -297,7 +277,7 @@ return self._dirty = True self._addpath(f) - self._map[f] = ('n', 0, -1, -1, 0) + self._map[f] = ('n', 0, -1, -1) if f in self._copymap: del self._copymap[f] @@ -305,7 +285,7 @@ 'mark a file normal, but dirty' self._dirty = True self._addpath(f) - self._map[f] = ('n', 0, -2, -1, 0) + self._map[f] = ('n', 0, -2, -1) if f in self._copymap: del self._copymap[f] @@ -313,7 +293,7 @@ 'mark a file added' self._dirty = True self._addpath(f, True) - self._map[f] = ('a', 0, -1, -1, 0) + self._map[f] = ('a', 0, -1, -1) if f in self._copymap: del self._copymap[f] @@ -328,7 +308,7 @@ size = -1 elif entry[0] == 'n' and entry[2] == -2: size = -2 - self._map[f] = ('r', 0, size, 0, 0) + self._map[f] = ('r', 0, size, 0) if size == 0 and f in self._copymap: del self._copymap[f] @@ -337,7 +317,7 @@ self._dirty = True s = os.lstat(self._join(f)) self._addpath(f) - self._map[f] = ('m', s.st_mode, s.st_size, s.st_mtime, 0) + self._map[f] = ('m', s.st_mode, s.st_size, s.st_mtime) if f in self._copymap: del self._copymap[f] @@ -373,9 +353,9 @@ self.clear() for f in files: if 'x' in files.flags(f): - self._map[f] = ('n', 0777, -1, 0, 0) + self._map[f] = ('n', 0777, -1, 0) else: - self._map[f] = ('n', 0666, -1, 0, 0) + self._map[f] = ('n', 0666, -1, 0) self._pl = (parent, nullid) self._dirty = True @@ -401,7 +381,7 @@ if f in copymap: f = "%s\0%s" % (f, copymap[f]) if e[3] > limit and e[0] == 'n': - e = (e[0], 0, -1, -1, 0) + e = (e[0], 0, -1, -1) e = pack(_format, e[0], e[1], e[2], e[3], len(f)) write(e) write(f) @@ -577,7 +557,7 @@ uadd(fn) continue - state, mode, size, time, foo = dmap[fn] + state, mode, size, time = dmap[fn] if not st and state in "nma": dadd(fn)