# HG changeset patch # User Bryan O'Sullivan # Date 1177441362 25200 # Node ID 9edc2d6f7c10fea4373c69fab36f40ef2e48d417 # Parent abeb3edb2b4e7d3d1d470e4d8e9015f902ed1064 dirstate: speed up write by 50%. diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -10,6 +10,7 @@ of the GNU General Public License, incor from node import * from i18n import _ import struct, os, time, bisect, stat, strutil, util, re, errno +import cStringIO class dirstate(object): format = ">cllll" @@ -336,15 +337,17 @@ class dirstate(object): def write(self): if not self.dirty: return - st = self.opener("dirstate", "w", atomictemp=True) - st.write("".join(self.pl)) - for f, e in self.map.items(): + cs = cStringIO.StringIO() + cs.write("".join(self.pl)) + for f, e in self.map.iteritems(): c = self.copied(f) if c: f = f + "\0" + c e = struct.pack(self.format, e[0], e[1], e[2], e[3], len(f)) - st.write(e + f) - st.rename() + cs.write(e) + cs.write(f) + st = self.opener("dirstate", "w", atomic=True) + st.write(cs.getvalue()) self.dirty = 0 def filterfiles(self, files):