Patchwork class/lib: Fix up various file access methods

login
register
mail settings
Submitter Richard Purdie
Date May 9, 2013, 4:05 p.m.
Message ID <1368115558.27116.102.camel@ted>
Download mbox | patch
Permalink /patch/49649/
State Accepted
Commit a43e0a8ecd0441131e929daf998c3cd454d9c8f3
Headers show

Comments

Richard Purdie - May 9, 2013, 4:05 p.m.
There are various bits of cruft that have built up around our file accesses. This patch
cleans some of them up, specifically:

 * Remove pointless "from __builtin__ import file"
 * Use open(), not file()
 * Wrap file usage in a with container to ensure files are closed
 * Add missing .close() calls in some cases

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
Martin Jansa - May 9, 2013, 4:19 p.m.
On Thu, May 09, 2013 at 05:05:58PM +0100, Richard Purdie wrote:
> There are various bits of cruft that have built up around our file accesses. This patch
> cleans some of them up, specifically:
> 
>  * Remove pointless "from __builtin__ import file"
>  * Use open(), not file()
>  * Wrap file usage in a with container to ensure files are closed
>  * Add missing .close() calls in some cases
> 
> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
> ---
> diff --git a/meta/classes/imagetest-qemu.bbclass b/meta/classes/imagetest-qemu.bbclass
> index 63ba087..c30d1cb 100644
> --- a/meta/classes/imagetest-qemu.bbclass
> +++ b/meta/classes/imagetest-qemu.bbclass
> @@ -146,6 +146,7 @@ def qemuimagetest_main(d):
>                         if not os.path.isfile(fulltestcase):
>                              raise bb.build.FuncFailed("Testcase %s not found" % fulltestcase)
>                         list.append((item, casefile, fulltestcase))
> +                    f.close()

indentation looks wrong and the same a line above "raise.."

>          final_list = check_list(list)
>          return final_list
>  
> diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass
> index 809aa45..4d2392e 100644
> --- a/meta/classes/insane.bbclass
> +++ b/meta/classes/insane.bbclass
> @@ -518,9 +518,10 @@ def package_qa_check_buildpaths(path, name, d, elf, messages):
>          return
>  
>      tmpdir = d.getVar('TMPDIR', True)
> -    file_content = open(path).read()
> -    if tmpdir in file_content:
> -        messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d))
> +    with open(path) as f:
> +        file_content = f.read()
> +        if tmpdir in file_content:
> +            messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d))
>  
>  
>  QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"
> @@ -634,15 +635,17 @@ def package_qa_check_staged(path,d):
>          for file in files:
>              path = os.path.join(root,file)
>              if file.endswith(".la"):
> -                file_content = open(path).read()
> -                if workdir in file_content:
> -                    error_msg = "%s failed sanity test (workdir) in path %s" % (file,root)
> -                    sane = package_qa_handle_error("la", error_msg, d)
> +                with open(path) as f:
> +                    file_content = f.read()
> +                    if workdir in file_content:
> +                        error_msg = "%s failed sanity test (workdir) in path %s" % (file,root)
> +                        sane = package_qa_handle_error("la", error_msg, d)
>              elif file.endswith(".pc"):
> -                file_content = open(path).read()
> -                if pkgconfigcheck in file_content:
> -                    error_msg = "%s failed sanity test (tmpdir) in path %s" % (file,root)
> -                    sane = package_qa_handle_error("pkgconfig", error_msg, d)
> +                with open(path) as f:
> +                    file_content = f.read()
> +                    if pkgconfigcheck in file_content:
> +                        error_msg = "%s failed sanity test (tmpdir) in path %s" % (file,root)
> +                        sane = package_qa_handle_error("pkgconfig", error_msg, d)
>  
>      return sane
>  
> diff --git a/meta/classes/libc-package.bbclass b/meta/classes/libc-package.bbclass
> index 3a13154..74e2078 100644
> --- a/meta/classes/libc-package.bbclass
> +++ b/meta/classes/libc-package.bbclass
> @@ -146,7 +146,7 @@ python package_do_split_gconvs () {
>  
>      def calc_gconv_deps(fn, pkg, file_regex, output_pattern, group):
>          deps = []
> -        f = open(fn, "r")
> +        f = open(fn, "rb")
>          c_re = re.compile('^copy "(.*)"')
>          i_re = re.compile('^include "(\w+)".*')
>          for l in f.readlines():
> @@ -167,7 +167,7 @@ python package_do_split_gconvs () {
>  
>      def calc_charmap_deps(fn, pkg, file_regex, output_pattern, group):
>          deps = []
> -        f = open(fn, "r")
> +        f = open(fn, "rb")
>          c_re = re.compile('^copy "(.*)"')
>          i_re = re.compile('^include "(\w+)".*')
>          for l in f.readlines():
> @@ -187,7 +187,7 @@ python package_do_split_gconvs () {
>  
>      def calc_locale_deps(fn, pkg, file_regex, output_pattern, group):
>          deps = []
> -        f = open(fn, "r")
> +        f = open(fn, "rb")
>          c_re = re.compile('^copy "(.*)"')
>          i_re = re.compile('^include "(\w+)".*')
>          for l in f.readlines():
> diff --git a/meta/classes/metadata_scm.bbclass b/meta/classes/metadata_scm.bbclass
> index e9b207c..8d3988a 100644
> --- a/meta/classes/metadata_scm.bbclass
> +++ b/meta/classes/metadata_scm.bbclass
> @@ -32,10 +32,11 @@ def base_get_scmbasepath(d):
>  def base_get_metadata_monotone_branch(path, d):
>      monotone_branch = "<unknown>"
>      try:
> -        monotone_branch = file( "%s/_MTN/options" % path ).read().strip()
> -        if monotone_branch.startswith( "database" ):
> -            monotone_branch_words = monotone_branch.split()
> -            monotone_branch = monotone_branch_words[ monotone_branch_words.index( "branch" )+1][1:-1]
> +        with open("%s/_MTN/options" % path) as f:
> +            monotone_branch = f.read().strip()
> +            if monotone_branch.startswith( "database" ):
> +                monotone_branch_words = monotone_branch.split()
> +                monotone_branch = monotone_branch_words[ monotone_branch_words.index( "branch" )+1][1:-1]
>      except:
>          pass
>      return monotone_branch
> @@ -43,10 +44,11 @@ def base_get_metadata_monotone_branch(path, d):
>  def base_get_metadata_monotone_revision(path, d):
>      monotone_revision = "<unknown>"
>      try:
> -        monotone_revision = file( "%s/_MTN/revision" % path ).read().strip()
> -        if monotone_revision.startswith( "format_version" ):
> -            monotone_revision_words = monotone_revision.split()
> -            monotone_revision = monotone_revision_words[ monotone_revision_words.index( "old_revision" )+1][1:-1]
> +        with open("%s/_MTN/revision" % path) as f:
> +            monotone_revision = f.read().strip()
> +            if monotone_revision.startswith( "format_version" ):
> +                monotone_revision_words = monotone_revision.split()
> +                monotone_revision = monotone_revision_words[ monotone_revision_words.index( "old_revision" )+1][1:-1]
>      except IOError:
>          pass
>      return monotone_revision
> @@ -54,7 +56,8 @@ def base_get_metadata_monotone_revision(path, d):
>  def base_get_metadata_svn_revision(path, d):
>      revision = "<unknown>"
>      try:
> -        revision = file( "%s/.svn/entries" % path ).readlines()[3].strip()
> +        with open("%s/.svn/entries" % path) as f:
> +            revision = f.readlines()[3].strip()
>      except IOError:
>          pass
>      return revision
> diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
> index 7d0684c..36b3ae5 100644
> --- a/meta/classes/package.bbclass
> +++ b/meta/classes/package.bbclass
> @@ -1096,7 +1096,8 @@ python emit_pkgdata() {
>  
>      def get_directory_size(dir):
>          if os.listdir(dir):
> -            size = int(os.popen('du -sk %s' % dir).readlines()[0].split('\t')[0])
> +            with os.popen('du -sk %s' % dir) as f:
> +                size = int(f.readlines()[0].split('\t')[0])
>          else:
>              size = 0
>          return size
> @@ -1203,7 +1204,7 @@ python emit_pkgdata() {
>          g = glob('*')
>          if g or allow_empty == "1":
>              packagedfile = pkgdatadir + '/runtime/%s.packaged' % pkg
> -            file(packagedfile, 'w').close()
> +            open(packagedfile, 'w').close()
>  
>      if bb.data.inherits_class('kernel', d) or bb.data.inherits_class('module-base', d):
>          write_extra_runtime_pkgs(variants, packages, pkgdatadir)
> @@ -1633,7 +1634,7 @@ def read_libdep_files(d):
>          for extension in ".shlibdeps", ".pcdeps", ".clilibdeps":
>              depsfile = d.expand("${PKGDEST}/" + pkg + extension)
>              if os.access(depsfile, os.R_OK):
> -                fd = file(depsfile)
> +                fd = open(depsfile)
>                  lines = fd.readlines()
>                  fd.close()
>                  for l in lines:
> diff --git a/meta/classes/package_deb.bbclass b/meta/classes/package_deb.bbclass
> index 853b5ea..313758f 100644
> --- a/meta/classes/package_deb.bbclass
> +++ b/meta/classes/package_deb.bbclass
> @@ -227,7 +227,7 @@ python do_package_deb () {
>          bb.mkdirhier(controldir)
>          os.chmod(controldir, 0755)
>          try:
> -            ctrlfile = file(os.path.join(controldir, 'control'), 'wb')
> +            ctrlfile = open(os.path.join(controldir, 'control'), 'w')
>              # import codecs
>              # ctrlfile = codecs.open("someFile", "w", "utf-8")
>          except OSError:
> @@ -355,7 +355,7 @@ python do_package_deb () {
>              if not scriptvar:
>                  continue
>              try:
> -                scriptfile = file(os.path.join(controldir, script), 'w')
> +                scriptfile = open(os.path.join(controldir, script), 'w')
>              except OSError:
>                  bb.utils.unlockfile(lf)
>                  raise bb.build.FuncFailed("unable to open %s script file for writing." % script)
> @@ -367,7 +367,7 @@ python do_package_deb () {
>          conffiles_str = localdata.getVar("CONFFILES", True)
>          if conffiles_str:
>              try:
> -                conffiles = file(os.path.join(controldir, 'conffiles'), 'w')
> +                conffiles = open(os.path.join(controldir, 'conffiles'), 'w')
>              except OSError:
>                  bb.utils.unlockfile(lf)
>                  raise bb.build.FuncFailed("unable to open conffiles for writing.")
> diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass
> index 5873f71..f6797ad 100644
> --- a/meta/classes/package_ipk.bbclass
> +++ b/meta/classes/package_ipk.bbclass
> @@ -268,7 +268,7 @@ python do_package_ipk () {
>          controldir = os.path.join(root, 'CONTROL')
>          bb.mkdirhier(controldir)
>          try:
> -            ctrlfile = file(os.path.join(controldir, 'control'), 'w')
> +            ctrlfile = open(os.path.join(controldir, 'control'), 'w')
>          except OSError:
>              bb.utils.unlockfile(lf)
>              raise bb.build.FuncFailed("unable to open control file for writing.")
> @@ -369,7 +369,7 @@ python do_package_ipk () {
>              if not scriptvar:
>                  continue
>              try:
> -                scriptfile = file(os.path.join(controldir, script), 'w')
> +                scriptfile = open(os.path.join(controldir, script), 'w')
>              except OSError:
>                  bb.utils.unlockfile(lf)
>                  raise bb.build.FuncFailed("unable to open %s script file for writing." % script)
> @@ -380,7 +380,7 @@ python do_package_ipk () {
>          conffiles_str = localdata.getVar("CONFFILES", True)
>          if conffiles_str:
>              try:
> -                conffiles = file(os.path.join(controldir, 'conffiles'), 'w')
> +                conffiles = open(os.path.join(controldir, 'conffiles'), 'w')
>              except OSError:
>                  bb.utils.unlockfile(lf)
>                  raise bb.build.FuncFailed("unable to open conffiles for writing.")
> diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
> index 58739da..d9892b3 100644
> --- a/meta/classes/package_rpm.bbclass
> +++ b/meta/classes/package_rpm.bbclass
> @@ -504,8 +504,7 @@ def write_rpm_perfiledata(srcname, d):
>      outdepends = workdir + "/" + srcname + ".requires"
>  
>      try:
> -        from __builtin__ import file
> -        dependsfile = file(outdepends, 'w')
> +        dependsfile = open(outdepends, 'w')
>      except OSError:
>          raise bb.build.FuncFailed("unable to open spec file for writing.")
>  
> @@ -518,8 +517,7 @@ def write_rpm_perfiledata(srcname, d):
>      outprovides = workdir + "/" + srcname + ".provides"
>  
>      try:
> -        from __builtin__ import file
> -        providesfile = file(outprovides, 'w')
> +        providesfile = open(outprovides, 'w')
>      except OSError:
>          raise bb.build.FuncFailed("unable to open spec file for writing.")
>  
> @@ -1005,8 +1003,7 @@ python write_specfile () {
>  
>      # Write the SPEC file
>      try:
> -        from __builtin__ import file
> -        specfile = file(outspecfile, 'w')
> +        specfile = open(outspecfile, 'w')
>      except OSError:
>          raise bb.build.FuncFailed("unable to open spec file for writing.")
>  
> diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass
> index e8a0c5f..0fd9ce6 100644
> --- a/meta/classes/sanity.bbclass
> +++ b/meta/classes/sanity.bbclass
> @@ -561,14 +561,14 @@ def check_sanity(sanity_data):
>      last_sstate_dir = ""
>      sanityverfile = 'conf/sanity_info'
>      if os.path.exists(sanityverfile):
> -        f = open(sanityverfile, 'r')
> -        for line in f:
> -            if line.startswith('SANITY_VERSION'):
> -                last_sanity_version = int(line.split()[1])
> -            if line.startswith('TMPDIR'):
> -                last_tmpdir = line.split()[1]
> -            if line.startswith('SSTATE_DIR'):
> -                last_sstate_dir = line.split()[1]
> +        with open(sanityverfile, 'r') as f:
> +            for line in f:
> +                if line.startswith('SANITY_VERSION'):
> +                    last_sanity_version = int(line.split()[1])
> +                if line.startswith('TMPDIR'):
> +                    last_tmpdir = line.split()[1]
> +                if line.startswith('SSTATE_DIR'):
> +                    last_sstate_dir = line.split()[1]
>      
>      sanity_version = int(sanity_data.getVar('SANITY_VERSION', True) or 1)
>      network_error = False
> @@ -584,25 +584,24 @@ def check_sanity(sanity_data):
>          if last_sstate_dir != sstate_dir:
>              messages = messages + check_sanity_sstate_dir_change(sstate_dir, sanity_data)
>      if os.path.exists("conf") and not messages:
> -        f = open(sanityverfile, 'w')
> -        f.write("SANITY_VERSION %s\n" % sanity_version) 
> -        f.write("TMPDIR %s\n" % tmpdir) 
> -        f.write("SSTATE_DIR %s\n" % sstate_dir) 
> +        with open(sanityverfile, 'w') as f:
> +            f.write("SANITY_VERSION %s\n" % sanity_version) 
> +            f.write("TMPDIR %s\n" % tmpdir) 
> +            f.write("SSTATE_DIR %s\n" % sstate_dir) 
>  
>      #
>      # Check that TMPDIR hasn't changed location since the last time we were run
>      #
>      checkfile = os.path.join(tmpdir, "saved_tmpdir")
>      if os.path.exists(checkfile):
> -        f = open(checkfile, "r")
> -        saved_tmpdir = f.read().strip()
> -        if (saved_tmpdir != tmpdir):
> -            messages = messages + "Error, TMPDIR has changed location. You need to either move it back to %s or rebuild\n" % saved_tmpdir
> +        with open(checkfile, "r") as f:
> +            saved_tmpdir = f.read().strip()
> +            if (saved_tmpdir != tmpdir):
> +                messages = messages + "Error, TMPDIR has changed location. You need to either move it back to %s or rebuild\n" % saved_tmpdir
>      else:
>          bb.utils.mkdirhier(tmpdir)
> -        f = open(checkfile, "w")
> -        f.write(tmpdir)
> -    f.close()
> +        with open(checkfile, "w") as f:
> +            f.write(tmpdir)
>  
>      #
>      # Check the 'ABI' of TMPDIR
> @@ -610,33 +609,32 @@ def check_sanity(sanity_data):
>      current_abi = sanity_data.getVar('OELAYOUT_ABI', True)
>      abifile = sanity_data.getVar('SANITY_ABIFILE', True)
>      if os.path.exists(abifile):
> -        f = open(abifile, "r")
> -        abi = f.read().strip()
> +        with open(abifile, "r") as f:
> +            abi = f.read().strip()
>          if not abi.isdigit():
> -            f = open(abifile, "w")
> -            f.write(current_abi)
> +            with open(abifile, "w") as f:
> +                f.write(current_abi)
>          elif abi == "2" and current_abi == "3":
>              bb.note("Converting staging from layout version 2 to layout version 3")
>              subprocess.call(sanity_data.expand("mv ${TMPDIR}/staging ${TMPDIR}/sysroots"), shell=True)
>              subprocess.call(sanity_data.expand("ln -s sysroots ${TMPDIR}/staging"), shell=True)
>              subprocess.call(sanity_data.expand("cd ${TMPDIR}/stamps; for i in */*do_populate_staging; do new=`echo $i | sed -e 's/do_populate_staging/do_populate_sysroot/'`; mv $i $new; done"), shell=True)
> -            f = open(abifile, "w")
> -            f.write(current_abi)
> +            with open(abifile, "w") as f:
> +                f.write(current_abi)
>          elif abi == "3" and current_abi == "4":
>              bb.note("Converting staging layout from version 3 to layout version 4")
>              if os.path.exists(sanity_data.expand("${STAGING_DIR_NATIVE}${bindir_native}/${MULTIMACH_HOST_SYS}")):
>                  subprocess.call(sanity_data.expand("mv ${STAGING_DIR_NATIVE}${bindir_native}/${MULTIMACH_HOST_SYS} ${STAGING_BINDIR_CROSS}"), shell=True)
>                  subprocess.call(sanity_data.expand("ln -s ${STAGING_BINDIR_CROSS} ${STAGING_DIR_NATIVE}${bindir_native}/${MULTIMACH_HOST_SYS}"), shell=True)
> -
> -            f = open(abifile, "w")
> -            f.write(current_abi)
> +            with open(abifile, "w") as f:
> +                f.write(current_abi)
>          elif abi == "4":
>              messages = messages + "Staging layout has changed. The cross directory has been deprecated and cross packages are now built under the native sysroot.\nThis requires a rebuild.\n"
>          elif abi == "5" and current_abi == "6":
>              bb.note("Converting staging layout from version 5 to layout version 6")
>              subprocess.call(sanity_data.expand("mv ${TMPDIR}/pstagelogs ${SSTATE_MANIFESTS}"), shell=True)
> -            f = open(abifile, "w")
> -            f.write(current_abi)
> +            with open(abifile, "w") as f:
> +                f.write(current_abi)
>          elif abi == "7" and current_abi == "8":
>              messages = messages + "Your configuration is using stamp files including the sstate hash but your build directory was built with stamp files that do not include this.\nTo continue, either rebuild or switch back to the OEBasic signature handler with BB_SIGNATURE_HANDLER = 'OEBasic'.\n"
>          elif (abi != current_abi and current_abi == "9"):
> @@ -645,9 +643,8 @@ def check_sanity(sanity_data):
>              # Code to convert from one ABI to another could go here if possible.
>              messages = messages + "Error, TMPDIR has changed its layout version number (%s to %s) and you need to either rebuild, revert or adjust it at your own risk.\n" % (abi, current_abi)
>      else:
> -        f = open(abifile, "w")
> -        f.write(current_abi)
> -    f.close()
> +        with open(abifile, "w") as f:
> +            f.write(current_abi)
>  
>      oeroot = sanity_data.getVar('COREBASE')
>      if oeroot.find ('+') != -1:
> diff --git a/meta/lib/oe/packagedata.py b/meta/lib/oe/packagedata.py
> index 62fd718..14c38bd 100644
> --- a/meta/lib/oe/packagedata.py
> +++ b/meta/lib/oe/packagedata.py
> @@ -12,7 +12,7 @@ def read_pkgdatafile(fn):
>  
>      if os.access(fn, os.R_OK):
>          import re
> -        f = file(fn, 'r')
> +        f = open(fn, 'r')
>          lines = f.readlines()
>          f.close()
>          r = re.compile("([^:]+):\s*(.*)")
> diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py
> index ec8260d..0a2092b 100644
> --- a/meta/lib/oe/utils.py
> +++ b/meta/lib/oe/utils.py
> @@ -7,11 +7,13 @@ except ImportError:
>  
>  def read_file(filename):
>      try:
> -        f = file( filename, "r" )
> +        f = open( filename, "r" )
>      except IOError as reason:
>          return "" # WARNING: can't raise an error now because of the new RDEPENDS handling. This is a bit ugly. :M:
>      else:
> -        return f.read().strip()
> +        data = f.read().strip()
> +        f.close()
> +        return data
>      return None
>  
>  def ifelse(condition, iftrue = True, iffalse = False):
> diff --git a/meta/recipes-core/busybox/busybox.inc b/meta/recipes-core/busybox/busybox.inc
> index 59e0141..00c88ab 100644
> --- a/meta/recipes-core/busybox/busybox.inc
> +++ b/meta/recipes-core/busybox/busybox.inc
> @@ -262,6 +262,7 @@ python do_package_prepend () {
>  
>          d.appendVar('ALTERNATIVE_%s' % (pn), ' ' + alt_name)
>          d.setVarFlag('ALTERNATIVE_LINK_NAME', alt_name, alt_link_name)
> +    f.close()
>  }
>  
>  pkg_postinst_${PN} () {
> 
> 
> 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
Richard Purdie - May 9, 2013, 4:43 p.m.
On Thu, 2013-05-09 at 18:19 +0200, Martin Jansa wrote:
> On Thu, May 09, 2013 at 05:05:58PM +0100, Richard Purdie wrote:
> > There are various bits of cruft that have built up around our file accesses. This patch
> > cleans some of them up, specifically:
> > 
> >  * Remove pointless "from __builtin__ import file"
> >  * Use open(), not file()
> >  * Wrap file usage in a with container to ensure files are closed
> >  * Add missing .close() calls in some cases
> > 
> > Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
> > ---
> > diff --git a/meta/classes/imagetest-qemu.bbclass b/meta/classes/imagetest-qemu.bbclass
> > index 63ba087..c30d1cb 100644
> > --- a/meta/classes/imagetest-qemu.bbclass
> > +++ b/meta/classes/imagetest-qemu.bbclass
> > @@ -146,6 +146,7 @@ def qemuimagetest_main(d):
> >                         if not os.path.isfile(fulltestcase):
> >                              raise bb.build.FuncFailed("Testcase %s not found" % fulltestcase)
> >                         list.append((item, casefile, fulltestcase))
> > +                    f.close()
> 
> indentation looks wrong and the same a line above "raise.."

Its an existing issue with the file, this patch is correct but I've sent
out a separate patch fixing it.

Cheers,

Richard

Patch

diff --git a/meta/classes/imagetest-qemu.bbclass b/meta/classes/imagetest-qemu.bbclass
index 63ba087..c30d1cb 100644
--- a/meta/classes/imagetest-qemu.bbclass
+++ b/meta/classes/imagetest-qemu.bbclass
@@ -146,6 +146,7 @@  def qemuimagetest_main(d):
                        if not os.path.isfile(fulltestcase):
                             raise bb.build.FuncFailed("Testcase %s not found" % fulltestcase)
                        list.append((item, casefile, fulltestcase))
+                    f.close()
         final_list = check_list(list)
         return final_list
 
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass
index 809aa45..4d2392e 100644
--- a/meta/classes/insane.bbclass
+++ b/meta/classes/insane.bbclass
@@ -518,9 +518,10 @@  def package_qa_check_buildpaths(path, name, d, elf, messages):
         return
 
     tmpdir = d.getVar('TMPDIR', True)
-    file_content = open(path).read()
-    if tmpdir in file_content:
-        messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d))
+    with open(path) as f:
+        file_content = f.read()
+        if tmpdir in file_content:
+            messages.append("File %s in package contained reference to tmpdir" % package_qa_clean_path(path,d))
 
 
 QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"
@@ -634,15 +635,17 @@  def package_qa_check_staged(path,d):
         for file in files:
             path = os.path.join(root,file)
             if file.endswith(".la"):
-                file_content = open(path).read()
-                if workdir in file_content:
-                    error_msg = "%s failed sanity test (workdir) in path %s" % (file,root)
-                    sane = package_qa_handle_error("la", error_msg, d)
+                with open(path) as f:
+                    file_content = f.read()
+                    if workdir in file_content:
+                        error_msg = "%s failed sanity test (workdir) in path %s" % (file,root)
+                        sane = package_qa_handle_error("la", error_msg, d)
             elif file.endswith(".pc"):
-                file_content = open(path).read()
-                if pkgconfigcheck in file_content:
-                    error_msg = "%s failed sanity test (tmpdir) in path %s" % (file,root)
-                    sane = package_qa_handle_error("pkgconfig", error_msg, d)
+                with open(path) as f:
+                    file_content = f.read()
+                    if pkgconfigcheck in file_content:
+                        error_msg = "%s failed sanity test (tmpdir) in path %s" % (file,root)
+                        sane = package_qa_handle_error("pkgconfig", error_msg, d)
 
     return sane
 
diff --git a/meta/classes/libc-package.bbclass b/meta/classes/libc-package.bbclass
index 3a13154..74e2078 100644
--- a/meta/classes/libc-package.bbclass
+++ b/meta/classes/libc-package.bbclass
@@ -146,7 +146,7 @@  python package_do_split_gconvs () {
 
     def calc_gconv_deps(fn, pkg, file_regex, output_pattern, group):
         deps = []
-        f = open(fn, "r")
+        f = open(fn, "rb")
         c_re = re.compile('^copy "(.*)"')
         i_re = re.compile('^include "(\w+)".*')
         for l in f.readlines():
@@ -167,7 +167,7 @@  python package_do_split_gconvs () {
 
     def calc_charmap_deps(fn, pkg, file_regex, output_pattern, group):
         deps = []
-        f = open(fn, "r")
+        f = open(fn, "rb")
         c_re = re.compile('^copy "(.*)"')
         i_re = re.compile('^include "(\w+)".*')
         for l in f.readlines():
@@ -187,7 +187,7 @@  python package_do_split_gconvs () {
 
     def calc_locale_deps(fn, pkg, file_regex, output_pattern, group):
         deps = []
-        f = open(fn, "r")
+        f = open(fn, "rb")
         c_re = re.compile('^copy "(.*)"')
         i_re = re.compile('^include "(\w+)".*')
         for l in f.readlines():
diff --git a/meta/classes/metadata_scm.bbclass b/meta/classes/metadata_scm.bbclass
index e9b207c..8d3988a 100644
--- a/meta/classes/metadata_scm.bbclass
+++ b/meta/classes/metadata_scm.bbclass
@@ -32,10 +32,11 @@  def base_get_scmbasepath(d):
 def base_get_metadata_monotone_branch(path, d):
     monotone_branch = "<unknown>"
     try:
-        monotone_branch = file( "%s/_MTN/options" % path ).read().strip()
-        if monotone_branch.startswith( "database" ):
-            monotone_branch_words = monotone_branch.split()
-            monotone_branch = monotone_branch_words[ monotone_branch_words.index( "branch" )+1][1:-1]
+        with open("%s/_MTN/options" % path) as f:
+            monotone_branch = f.read().strip()
+            if monotone_branch.startswith( "database" ):
+                monotone_branch_words = monotone_branch.split()
+                monotone_branch = monotone_branch_words[ monotone_branch_words.index( "branch" )+1][1:-1]
     except:
         pass
     return monotone_branch
@@ -43,10 +44,11 @@  def base_get_metadata_monotone_branch(path, d):
 def base_get_metadata_monotone_revision(path, d):
     monotone_revision = "<unknown>"
     try:
-        monotone_revision = file( "%s/_MTN/revision" % path ).read().strip()
-        if monotone_revision.startswith( "format_version" ):
-            monotone_revision_words = monotone_revision.split()
-            monotone_revision = monotone_revision_words[ monotone_revision_words.index( "old_revision" )+1][1:-1]
+        with open("%s/_MTN/revision" % path) as f:
+            monotone_revision = f.read().strip()
+            if monotone_revision.startswith( "format_version" ):
+                monotone_revision_words = monotone_revision.split()
+                monotone_revision = monotone_revision_words[ monotone_revision_words.index( "old_revision" )+1][1:-1]
     except IOError:
         pass
     return monotone_revision
@@ -54,7 +56,8 @@  def base_get_metadata_monotone_revision(path, d):
 def base_get_metadata_svn_revision(path, d):
     revision = "<unknown>"
     try:
-        revision = file( "%s/.svn/entries" % path ).readlines()[3].strip()
+        with open("%s/.svn/entries" % path) as f:
+            revision = f.readlines()[3].strip()
     except IOError:
         pass
     return revision
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 7d0684c..36b3ae5 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1096,7 +1096,8 @@  python emit_pkgdata() {
 
     def get_directory_size(dir):
         if os.listdir(dir):
-            size = int(os.popen('du -sk %s' % dir).readlines()[0].split('\t')[0])
+            with os.popen('du -sk %s' % dir) as f:
+                size = int(f.readlines()[0].split('\t')[0])
         else:
             size = 0
         return size
@@ -1203,7 +1204,7 @@  python emit_pkgdata() {
         g = glob('*')
         if g or allow_empty == "1":
             packagedfile = pkgdatadir + '/runtime/%s.packaged' % pkg
-            file(packagedfile, 'w').close()
+            open(packagedfile, 'w').close()
 
     if bb.data.inherits_class('kernel', d) or bb.data.inherits_class('module-base', d):
         write_extra_runtime_pkgs(variants, packages, pkgdatadir)
@@ -1633,7 +1634,7 @@  def read_libdep_files(d):
         for extension in ".shlibdeps", ".pcdeps", ".clilibdeps":
             depsfile = d.expand("${PKGDEST}/" + pkg + extension)
             if os.access(depsfile, os.R_OK):
-                fd = file(depsfile)
+                fd = open(depsfile)
                 lines = fd.readlines()
                 fd.close()
                 for l in lines:
diff --git a/meta/classes/package_deb.bbclass b/meta/classes/package_deb.bbclass
index 853b5ea..313758f 100644
--- a/meta/classes/package_deb.bbclass
+++ b/meta/classes/package_deb.bbclass
@@ -227,7 +227,7 @@  python do_package_deb () {
         bb.mkdirhier(controldir)
         os.chmod(controldir, 0755)
         try:
-            ctrlfile = file(os.path.join(controldir, 'control'), 'wb')
+            ctrlfile = open(os.path.join(controldir, 'control'), 'w')
             # import codecs
             # ctrlfile = codecs.open("someFile", "w", "utf-8")
         except OSError:
@@ -355,7 +355,7 @@  python do_package_deb () {
             if not scriptvar:
                 continue
             try:
-                scriptfile = file(os.path.join(controldir, script), 'w')
+                scriptfile = open(os.path.join(controldir, script), 'w')
             except OSError:
                 bb.utils.unlockfile(lf)
                 raise bb.build.FuncFailed("unable to open %s script file for writing." % script)
@@ -367,7 +367,7 @@  python do_package_deb () {
         conffiles_str = localdata.getVar("CONFFILES", True)
         if conffiles_str:
             try:
-                conffiles = file(os.path.join(controldir, 'conffiles'), 'w')
+                conffiles = open(os.path.join(controldir, 'conffiles'), 'w')
             except OSError:
                 bb.utils.unlockfile(lf)
                 raise bb.build.FuncFailed("unable to open conffiles for writing.")
diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass
index 5873f71..f6797ad 100644
--- a/meta/classes/package_ipk.bbclass
+++ b/meta/classes/package_ipk.bbclass
@@ -268,7 +268,7 @@  python do_package_ipk () {
         controldir = os.path.join(root, 'CONTROL')
         bb.mkdirhier(controldir)
         try:
-            ctrlfile = file(os.path.join(controldir, 'control'), 'w')
+            ctrlfile = open(os.path.join(controldir, 'control'), 'w')
         except OSError:
             bb.utils.unlockfile(lf)
             raise bb.build.FuncFailed("unable to open control file for writing.")
@@ -369,7 +369,7 @@  python do_package_ipk () {
             if not scriptvar:
                 continue
             try:
-                scriptfile = file(os.path.join(controldir, script), 'w')
+                scriptfile = open(os.path.join(controldir, script), 'w')
             except OSError:
                 bb.utils.unlockfile(lf)
                 raise bb.build.FuncFailed("unable to open %s script file for writing." % script)
@@ -380,7 +380,7 @@  python do_package_ipk () {
         conffiles_str = localdata.getVar("CONFFILES", True)
         if conffiles_str:
             try:
-                conffiles = file(os.path.join(controldir, 'conffiles'), 'w')
+                conffiles = open(os.path.join(controldir, 'conffiles'), 'w')
             except OSError:
                 bb.utils.unlockfile(lf)
                 raise bb.build.FuncFailed("unable to open conffiles for writing.")
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index 58739da..d9892b3 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -504,8 +504,7 @@  def write_rpm_perfiledata(srcname, d):
     outdepends = workdir + "/" + srcname + ".requires"
 
     try:
-        from __builtin__ import file
-        dependsfile = file(outdepends, 'w')
+        dependsfile = open(outdepends, 'w')
     except OSError:
         raise bb.build.FuncFailed("unable to open spec file for writing.")
 
@@ -518,8 +517,7 @@  def write_rpm_perfiledata(srcname, d):
     outprovides = workdir + "/" + srcname + ".provides"
 
     try:
-        from __builtin__ import file
-        providesfile = file(outprovides, 'w')
+        providesfile = open(outprovides, 'w')
     except OSError:
         raise bb.build.FuncFailed("unable to open spec file for writing.")
 
@@ -1005,8 +1003,7 @@  python write_specfile () {
 
     # Write the SPEC file
     try:
-        from __builtin__ import file
-        specfile = file(outspecfile, 'w')
+        specfile = open(outspecfile, 'w')
     except OSError:
         raise bb.build.FuncFailed("unable to open spec file for writing.")
 
diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass
index e8a0c5f..0fd9ce6 100644
--- a/meta/classes/sanity.bbclass
+++ b/meta/classes/sanity.bbclass
@@ -561,14 +561,14 @@  def check_sanity(sanity_data):
     last_sstate_dir = ""
     sanityverfile = 'conf/sanity_info'
     if os.path.exists(sanityverfile):
-        f = open(sanityverfile, 'r')
-        for line in f:
-            if line.startswith('SANITY_VERSION'):
-                last_sanity_version = int(line.split()[1])
-            if line.startswith('TMPDIR'):
-                last_tmpdir = line.split()[1]
-            if line.startswith('SSTATE_DIR'):
-                last_sstate_dir = line.split()[1]
+        with open(sanityverfile, 'r') as f:
+            for line in f:
+                if line.startswith('SANITY_VERSION'):
+                    last_sanity_version = int(line.split()[1])
+                if line.startswith('TMPDIR'):
+                    last_tmpdir = line.split()[1]
+                if line.startswith('SSTATE_DIR'):
+                    last_sstate_dir = line.split()[1]
     
     sanity_version = int(sanity_data.getVar('SANITY_VERSION', True) or 1)
     network_error = False
@@ -584,25 +584,24 @@  def check_sanity(sanity_data):
         if last_sstate_dir != sstate_dir:
             messages = messages + check_sanity_sstate_dir_change(sstate_dir, sanity_data)
     if os.path.exists("conf") and not messages:
-        f = open(sanityverfile, 'w')
-        f.write("SANITY_VERSION %s\n" % sanity_version) 
-        f.write("TMPDIR %s\n" % tmpdir) 
-        f.write("SSTATE_DIR %s\n" % sstate_dir) 
+        with open(sanityverfile, 'w') as f:
+            f.write("SANITY_VERSION %s\n" % sanity_version) 
+            f.write("TMPDIR %s\n" % tmpdir) 
+            f.write("SSTATE_DIR %s\n" % sstate_dir) 
 
     #
     # Check that TMPDIR hasn't changed location since the last time we were run
     #
     checkfile = os.path.join(tmpdir, "saved_tmpdir")
     if os.path.exists(checkfile):
-        f = open(checkfile, "r")
-        saved_tmpdir = f.read().strip()
-        if (saved_tmpdir != tmpdir):
-            messages = messages + "Error, TMPDIR has changed location. You need to either move it back to %s or rebuild\n" % saved_tmpdir
+        with open(checkfile, "r") as f:
+            saved_tmpdir = f.read().strip()
+            if (saved_tmpdir != tmpdir):
+                messages = messages + "Error, TMPDIR has changed location. You need to either move it back to %s or rebuild\n" % saved_tmpdir
     else:
         bb.utils.mkdirhier(tmpdir)
-        f = open(checkfile, "w")
-        f.write(tmpdir)
-    f.close()
+        with open(checkfile, "w") as f:
+            f.write(tmpdir)
 
     #
     # Check the 'ABI' of TMPDIR
@@ -610,33 +609,32 @@  def check_sanity(sanity_data):
     current_abi = sanity_data.getVar('OELAYOUT_ABI', True)
     abifile = sanity_data.getVar('SANITY_ABIFILE', True)
     if os.path.exists(abifile):
-        f = open(abifile, "r")
-        abi = f.read().strip()
+        with open(abifile, "r") as f:
+            abi = f.read().strip()
         if not abi.isdigit():
-            f = open(abifile, "w")
-            f.write(current_abi)
+            with open(abifile, "w") as f:
+                f.write(current_abi)
         elif abi == "2" and current_abi == "3":
             bb.note("Converting staging from layout version 2 to layout version 3")
             subprocess.call(sanity_data.expand("mv ${TMPDIR}/staging ${TMPDIR}/sysroots"), shell=True)
             subprocess.call(sanity_data.expand("ln -s sysroots ${TMPDIR}/staging"), shell=True)
             subprocess.call(sanity_data.expand("cd ${TMPDIR}/stamps; for i in */*do_populate_staging; do new=`echo $i | sed -e 's/do_populate_staging/do_populate_sysroot/'`; mv $i $new; done"), shell=True)
-            f = open(abifile, "w")
-            f.write(current_abi)
+            with open(abifile, "w") as f:
+                f.write(current_abi)
         elif abi == "3" and current_abi == "4":
             bb.note("Converting staging layout from version 3 to layout version 4")
             if os.path.exists(sanity_data.expand("${STAGING_DIR_NATIVE}${bindir_native}/${MULTIMACH_HOST_SYS}")):
                 subprocess.call(sanity_data.expand("mv ${STAGING_DIR_NATIVE}${bindir_native}/${MULTIMACH_HOST_SYS} ${STAGING_BINDIR_CROSS}"), shell=True)
                 subprocess.call(sanity_data.expand("ln -s ${STAGING_BINDIR_CROSS} ${STAGING_DIR_NATIVE}${bindir_native}/${MULTIMACH_HOST_SYS}"), shell=True)
-
-            f = open(abifile, "w")
-            f.write(current_abi)
+            with open(abifile, "w") as f:
+                f.write(current_abi)
         elif abi == "4":
             messages = messages + "Staging layout has changed. The cross directory has been deprecated and cross packages are now built under the native sysroot.\nThis requires a rebuild.\n"
         elif abi == "5" and current_abi == "6":
             bb.note("Converting staging layout from version 5 to layout version 6")
             subprocess.call(sanity_data.expand("mv ${TMPDIR}/pstagelogs ${SSTATE_MANIFESTS}"), shell=True)
-            f = open(abifile, "w")
-            f.write(current_abi)
+            with open(abifile, "w") as f:
+                f.write(current_abi)
         elif abi == "7" and current_abi == "8":
             messages = messages + "Your configuration is using stamp files including the sstate hash but your build directory was built with stamp files that do not include this.\nTo continue, either rebuild or switch back to the OEBasic signature handler with BB_SIGNATURE_HANDLER = 'OEBasic'.\n"
         elif (abi != current_abi and current_abi == "9"):
@@ -645,9 +643,8 @@  def check_sanity(sanity_data):
             # Code to convert from one ABI to another could go here if possible.
             messages = messages + "Error, TMPDIR has changed its layout version number (%s to %s) and you need to either rebuild, revert or adjust it at your own risk.\n" % (abi, current_abi)
     else:
-        f = open(abifile, "w")
-        f.write(current_abi)
-    f.close()
+        with open(abifile, "w") as f:
+            f.write(current_abi)
 
     oeroot = sanity_data.getVar('COREBASE')
     if oeroot.find ('+') != -1:
diff --git a/meta/lib/oe/packagedata.py b/meta/lib/oe/packagedata.py
index 62fd718..14c38bd 100644
--- a/meta/lib/oe/packagedata.py
+++ b/meta/lib/oe/packagedata.py
@@ -12,7 +12,7 @@  def read_pkgdatafile(fn):
 
     if os.access(fn, os.R_OK):
         import re
-        f = file(fn, 'r')
+        f = open(fn, 'r')
         lines = f.readlines()
         f.close()
         r = re.compile("([^:]+):\s*(.*)")
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py
index ec8260d..0a2092b 100644
--- a/meta/lib/oe/utils.py
+++ b/meta/lib/oe/utils.py
@@ -7,11 +7,13 @@  except ImportError:
 
 def read_file(filename):
     try:
-        f = file( filename, "r" )
+        f = open( filename, "r" )
     except IOError as reason:
         return "" # WARNING: can't raise an error now because of the new RDEPENDS handling. This is a bit ugly. :M:
     else:
-        return f.read().strip()
+        data = f.read().strip()
+        f.close()
+        return data
     return None
 
 def ifelse(condition, iftrue = True, iffalse = False):
diff --git a/meta/recipes-core/busybox/busybox.inc b/meta/recipes-core/busybox/busybox.inc
index 59e0141..00c88ab 100644
--- a/meta/recipes-core/busybox/busybox.inc
+++ b/meta/recipes-core/busybox/busybox.inc
@@ -262,6 +262,7 @@  python do_package_prepend () {
 
         d.appendVar('ALTERNATIVE_%s' % (pn), ' ' + alt_name)
         d.setVarFlag('ALTERNATIVE_LINK_NAME', alt_name, alt_link_name)
+    f.close()
 }
 
 pkg_postinst_${PN} () {