Use 'with file' more.
authorZac Medico <zmedico@gentoo.org>
Thu, 17 Jan 2013 14:19:56 +0000 (06:19 -0800)
committerZac Medico <zmedico@gentoo.org>
Thu, 17 Jan 2013 14:19:56 +0000 (06:19 -0800)
This helps to minimize ResourceWarning triggered by ^C with python3.

pym/portage/dbapi/vartree.py

index be93e1fd72492c2247b17d066ab6ddb65bb45f7e..09130fb385a9e657183f995e1138a1edd74ed69f 100644 (file)
@@ -577,18 +577,16 @@ class vardbapi(dbapi):
                        # appears to be solved in Python >=3.2 at least).
                        open_kwargs["buffering"] = 0
                try:
-                       f = open(_unicode_encode(self._aux_cache_filename,
+                       with open(_unicode_encode(self._aux_cache_filename,
                                encoding=_encodings['fs'], errors='strict'),
-                               mode='rb', **open_kwargs)
-                       mypickle = pickle.Unpickler(f)
-                       try:
-                               mypickle.find_global = None
-                       except AttributeError:
-                               # TODO: If py3k, override Unpickler.find_class().
-                               pass
-                       aux_cache = mypickle.load()
-                       f.close()
-                       del f
+                               mode='rb', **open_kwargs) as f:
+                               mypickle = pickle.Unpickler(f)
+                               try:
+                                       mypickle.find_global = None
+                               except AttributeError:
+                                       # TODO: If py3k, override Unpickler.find_class().
+                                       pass
+                               aux_cache = mypickle.load()
                except (SystemExit, KeyboardInterrupt):
                        raise
                except Exception as e:
@@ -741,15 +739,12 @@ class vardbapi(dbapi):
                                results[x] = st[stat.ST_MTIME]
                                continue
                        try:
-                               myf = io.open(
+                               with io.open(
                                        _unicode_encode(os.path.join(mydir, x),
                                        encoding=_encodings['fs'], errors='strict'),
                                        mode='r', encoding=_encodings['repo.content'],
-                                       errors='replace')
-                               try:
-                                       myd = myf.read()
-                               finally:
-                                       myf.close()
+                                       errors='replace') as f:
+                                       myd = f.read()
                        except IOError:
                                if x not in self._aux_cache_keys and \
                                        self._aux_cache_keys_re.match(x) is None:
@@ -895,11 +890,17 @@ class vardbapi(dbapi):
                del myroot
                counter = -1
                try:
-                       cfile = io.open(
+                       with io.open(
                                _unicode_encode(self._counter_path,
                                encoding=_encodings['fs'], errors='strict'),
                                mode='r', encoding=_encodings['repo.content'],
-                               errors='replace')
+                               errors='replace') as f:
+                               try:
+                                       counter = long(f.readline().strip())
+                               except (OverflowError, ValueError) as e:
+                                       writemsg(_("!!! COUNTER file is corrupt: '%s'\n") %
+                                               self._counter_path, noiselevel=-1)
+                                       writemsg("!!! %s\n" % (e,), noiselevel=-1)
                except EnvironmentError as e:
                        # Silently allow ENOENT since files under
                        # /var/cache/ are allowed to disappear.
@@ -908,17 +909,6 @@ class vardbapi(dbapi):
                                        self._counter_path, noiselevel=-1)
                                writemsg("!!! %s\n" % str(e), noiselevel=-1)
                        del e
-               else:
-                       try:
-                               try:
-                                       counter = long(cfile.readline().strip())
-                               finally:
-                                       cfile.close()
-                       except (OverflowError, ValueError) as e:
-                               writemsg(_("!!! COUNTER file is corrupt: '%s'\n") % \
-                                       self._counter_path, noiselevel=-1)
-                               writemsg("!!! %s\n" % str(e), noiselevel=-1)
-                               del e
 
                if self._cached_counter == counter:
                        max_counter = counter
@@ -1591,18 +1581,18 @@ class dblink(object):
                        return self.contentscache
                pkgfiles = {}
                try:
-                       myc = io.open(_unicode_encode(contents_file,
+                       with io.open(_unicode_encode(contents_file,
                                encoding=_encodings['fs'], errors='strict'),
                                mode='r', encoding=_encodings['repo.content'],
-                               errors='replace')
+                               errors='replace') as f:
+                               mylines = f.readlines()
                except EnvironmentError as e:
                        if e.errno != errno.ENOENT:
                                raise
                        del e
                        self.contentscache = pkgfiles
                        return pkgfiles
-               mylines = myc.readlines()
-               myc.close()
+
                null_byte = "\0"
                normalize_needed = self._normalize_needed
                contents_re = self._contents_re
@@ -3532,22 +3522,18 @@ class dblink(object):
                                        pass
                                continue
 
-                       f = None
                        try:
-                               f = io.open(_unicode_encode(
+                               with io.open(_unicode_encode(
                                        os.path.join(inforoot, var_name),
                                        encoding=_encodings['fs'], errors='strict'),
                                        mode='r', encoding=_encodings['repo.content'],
-                                       errors='replace')
-                               val = f.readline().strip()
+                                       errors='replace') as f:
+                                       val = f.readline().strip()
                        except EnvironmentError as e:
                                if e.errno != errno.ENOENT:
                                        raise
                                del e
                                val = ''
-                       finally:
-                               if f is not None:
-                                       f.close()
 
                        if var_name == 'SLOT':
                                slot = val
@@ -3973,12 +3959,11 @@ class dblink(object):
                # write local package counter for recording
                if counter is None:
                        counter = self.vartree.dbapi.counter_tick(mycpv=self.mycpv)
-               f = io.open(_unicode_encode(os.path.join(self.dbtmpdir, 'COUNTER'),
+               with io.open(_unicode_encode(os.path.join(self.dbtmpdir, 'COUNTER'),
                        encoding=_encodings['fs'], errors='strict'),
                        mode='w', encoding=_encodings['repo.content'],
-                       errors='backslashreplace')
-               f.write(_unicode_decode(str(counter)))
-               f.close()
+                       errors='backslashreplace') as f:
+                       f.write(_unicode_decode(str(counter)))
 
                self.updateprotect()
 
@@ -4823,11 +4808,12 @@ class dblink(object):
                "returns contents of a file with whitespace converted to spaces"
                if not os.path.exists(self.dbdir+"/"+name):
                        return ""
-               mydata = io.open(
+               with io.open(
                        _unicode_encode(os.path.join(self.dbdir, name),
                        encoding=_encodings['fs'], errors='strict'),
                        mode='r', encoding=_encodings['repo.content'], errors='replace'
-                       ).read().split()
+                       ) as f:
+                       mydata = f.read().split()
                return " ".join(mydata)
 
        def copyfile(self,fname):
@@ -4836,10 +4822,11 @@ class dblink(object):
        def getfile(self,fname):
                if not os.path.exists(self.dbdir+"/"+fname):
                        return ""
-               return io.open(_unicode_encode(os.path.join(self.dbdir, fname),
+               with io.open(_unicode_encode(os.path.join(self.dbdir, fname),
                        encoding=_encodings['fs'], errors='strict'), 
                        mode='r', encoding=_encodings['repo.content'], errors='replace'
-                       ).read()
+                       ) as f:
+                       return f.read()
 
        def setfile(self,fname,data):
                kwargs = {}
@@ -4853,11 +4840,12 @@ class dblink(object):
        def getelements(self,ename):
                if not os.path.exists(self.dbdir+"/"+ename):
                        return []
-               mylines = io.open(_unicode_encode(
+               with io.open(_unicode_encode(
                        os.path.join(self.dbdir, ename),
                        encoding=_encodings['fs'], errors='strict'),
                        mode='r', encoding=_encodings['repo.content'], errors='replace'
-                       ).readlines()
+                       ) as f:
+                       mylines = f.readlines()
                myreturn = []
                for x in mylines:
                        for y in x[:-1].split():
@@ -4865,14 +4853,13 @@ class dblink(object):
                return myreturn
 
        def setelements(self,mylist,ename):
-               myelement = io.open(_unicode_encode(
+               with io.open(_unicode_encode(
                        os.path.join(self.dbdir, ename),
                        encoding=_encodings['fs'], errors='strict'),
                        mode='w', encoding=_encodings['repo.content'],
-                       errors='backslashreplace')
-               for x in mylist:
-                       myelement.write(_unicode_decode(x+"\n"))
-               myelement.close()
+                       errors='backslashreplace') as f:
+                       for x in mylist:
+                               f.write(_unicode_decode(x + "\n"))
 
        def isregular(self):
                "Is this a regular package (does it have a CATEGORY file?  A dblink can be virtual *and* regular)"
@@ -5140,13 +5127,11 @@ def tar_contents(contents, root, tar, protect=None, onProgress=None):
                                tar.addfile(tarinfo, f)
                                f.close()
                        else:
-                               f = open(_unicode_encode(path,
+                               with open(_unicode_encode(path,
                                        encoding=encoding,
-                                       errors='strict'), 'rb')
-                               try:
+                                       errors='strict'), 'rb') as f:
                                        tar.addfile(tarinfo, f)
-                               finally:
-                                       f.close()
+
                else:
                        tar.addfile(tarinfo)
                if onProgress: