# HG changeset patch # User Matt Mackall # Date 1192081612 18000 # Node ID 17a4b20eda7bcbb5cc7947a54d933549627bba60 # Parent e038738714fd34802cde3b4bcaae9ca0f2b4f0e3 chunkiter: handle large reads more efficiently - for large reads, don't attempt to read more than necessary - if we've gathered the exact number of bytes needed, avoid a string copy diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1408,7 +1408,7 @@ class chunkbuffer(object): Returns less than L bytes if the iterator runs dry.""" if l > len(self.buf) and self.iter: # Clamp to a multiple of self.targetsize - targetsize = self.targetsize * ((l // self.targetsize) + 1) + targetsize = max(l, self.targetsize) collector = cStringIO.StringIO() collector.write(self.buf) collected = len(self.buf) @@ -1420,7 +1420,10 @@ class chunkbuffer(object): if collected < targetsize: self.iter = False self.buf = collector.getvalue() - s, self.buf = self.buf[:l], buffer(self.buf, l) + if len(self.buf) == l: + s, self.buf = self.buf, '' + else: + s, self.buf = self.buf[:l], buffer(self.buf, l) return s def filechunkiter(f, size=65536, limit=None):