[PATCH 4 of 7] opener: add read & write utility methods

Dan Villiom Podlaski Christiansen danchr at gmail.com
Tue Dec 7 10:26:42 CST 2010


# HG changeset patch
# User Dan Villiom Podlaski Christiansen <danchr at gmail.com>
# Date 1291739155 -3600
# Node ID aead2861ecf9cb60f16b2a02bb8e5d217744c124
# Parent  f0719f33fe4730bf728b326ab341b1b578a5054f
opener: add read & write utility methods

The two new methods are useful for quickly opening a file for reading
or writing. Unlike 'opener(...).read()', they ensure they the file is
immediately closed without relying on CPython reference counting.

Similar methods are added to custom openers.

diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -75,6 +75,7 @@ def build_opener(ui, authinfo):
                 raise IOError('Permission denied')
             f = "/".join((p, urllib.quote(path)))
             return httprangereader(f, urlopener)
+        o.read = lambda *args, **kwargs: o(*args, **kwargs).read()
         return o
 
     opener.options = {'nonlazy': 1}
diff --git a/mercurial/store.py b/mercurial/store.py
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -176,6 +176,8 @@ class basicstore(object):
         op = opener(self.path)
         op.createmode = self.createmode
         self.opener = lambda f, *args, **kw: op(encodedir(f), *args, **kw)
+        self.opener.read = (lambda f, *args, **kw:
+                            op(encodedir(f), *args, **kw).read())
 
     def join(self, f):
         return self.pathjoiner(self.path, encodedir(f))
@@ -221,6 +223,8 @@ class encodedstore(basicstore):
         op = opener(self.path)
         op.createmode = self.createmode
         self.opener = lambda f, *args, **kw: op(encodefilename(f), *args, **kw)
+        self.opener.read = (lambda f, *args, **kw:
+                            op(encodefilename(f), *args, **kw).read())
 
     def datafiles(self):
         for a, b, size in self._walk('data', True):
diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -880,6 +880,20 @@ class opener(object):
             return
         os.chmod(name, self.createmode & 0666)
 
+    def read(self, *args, **kwargs):
+        fp = self(*args, **kwargs)
+        try:
+            return fp.read()
+        finally:
+            fp.close()
+
+    def write(self, data, *args, **kwargs):
+        fp = self(*args, **kwargs)
+        try:
+            return fp.write(data)
+        finally:
+            fp.close()
+
     def __call__(self, path, mode="r", text=False, atomictemp=False):
         self.auditor(path)
         f = os.path.join(self.base, path)


More information about the Mercurial-devel mailing list