mercurial/patch.py
changeset 14658 7ddf9a607b75
parent 14611 adbf5e7df96d
child 14695 e4d3370fa234
--- 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