# HG changeset patch # User Patrick Mezard # Date 1308335582 -7200 # Node ID 7ddf9a607b75517e803939c8778896338e1b3ebb # Parent e21fd445c297dfff9c709380e09be58f23108a36 patch: make filestore store data in memory and fallback to fs diff -r e21fd445c297 -r 7ddf9a607b75 mercurial/patch.py --- a/mercurial/patch.py Thu Jun 16 12:52:37 2011 -0300 +++ b/mercurial/patch.py Fri Jun 17 20:33:02 2011 +0200 @@ -487,23 +487,34 @@ return sorted(self.changed) class filestore(object): - def __init__(self): + def __init__(self, maxsize=None): self.opener = None self.files = {} self.created = 0 + self.maxsize = maxsize + if self.maxsize is None: + self.maxsize = 4*(2**20) + self.size = 0 + self.data = {} def setfile(self, fname, data, mode, copied=None): - if self.opener is None: - root = tempfile.mkdtemp(prefix='hg-patch-') - self.opener = scmutil.opener(root) - # Avoid filename issues with these simple names - fn = str(self.created) - self.opener.write(fn, data) - self.created += 1 - self.files[fname] = (fn, mode, copied) + if self.maxsize < 0 or (len(data) + self.size) <= self.maxsize: + self.data[fname] = (data, mode, copied) + self.size += len(data) + else: + if self.opener is None: + root = tempfile.mkdtemp(prefix='hg-patch-') + self.opener = scmutil.opener(root) + # Avoid filename issues with these simple names + fn = str(self.created) + self.opener.write(fn, data) + self.created += 1 + self.files[fname] = (fn, mode, copied) def getfile(self, fname): - if fname not in self.files: + if fname in self.data: + return self.data[fname] + if not self.opener or fname not in self.files: raise IOError() fn, mode, copied = self.files[fname] return self.opener.read(fn), mode, copied