replace os.popen with subprocess.Popen

Replace os.popen with subprocess.Popen since the older function would
fail (more or less) silently if the executed program cannot be found

There is a bb.process.run() which will invoke the Popen to run command,
use it for simplify the code.

For the:
p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot))
...
for file in p4file:
    list = file.split()

in bitbake/lib/bb/fetch2/perforce.py, it should be an error in the past,
since it didn't use readline() to read the pipe, but directly used the
split() for the pipe. Use the bb.process.run would fix the problem since
bb.process.run will return strings.

More info:
http://docs.python.org/library/subprocess.html#subprocess-replacements

[YOCTO #2075]

(Bitbake rev: 8d6700255a6d4dda403c89b171a6d4a1883e5aae)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Robert Yang 2012-05-20 20:36:06 +08:00 committed by Richard Purdie
parent 10a0f9ed92
commit 094742bed2
4 changed files with 15 additions and 12 deletions

View File

@ -91,8 +91,8 @@ class Perforce(FetchMethod):
p4cmd = data.getVar('FETCHCOMMAND_p4', d, True) p4cmd = data.getVar('FETCHCOMMAND_p4', d, True)
logger.debug(1, "Running %s%s changes -m 1 %s", p4cmd, p4opt, depot) logger.debug(1, "Running %s%s changes -m 1 %s", p4cmd, p4opt, depot)
p4file = os.popen("%s%s changes -m 1 %s" % (p4cmd, p4opt, depot)) p4file, errors = bb.process.run("%s%s changes -m 1 %s" % (p4cmd, p4opt, depot))
cset = p4file.readline().strip() cset = p4file.strip()
logger.debug(1, "READ %s", cset) logger.debug(1, "READ %s", cset)
if not cset: if not cset:
return -1 return -1
@ -155,8 +155,8 @@ class Perforce(FetchMethod):
logger.debug(2, "Fetch: creating temporary directory") logger.debug(2, "Fetch: creating temporary directory")
bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata)) bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
data.setVar('TMPBASE', data.expand('${WORKDIR}/oep4.XXXXXX', localdata), localdata) data.setVar('TMPBASE', data.expand('${WORKDIR}/oep4.XXXXXX', localdata), localdata)
tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, True) or "false") tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD', localdata, True) or "false")
tmpfile = tmppipe.readline().strip() tmpfile = tmpfile.strip()
if not tmpfile: if not tmpfile:
raise FetchError("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.", loc) raise FetchError("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.", loc)
@ -169,7 +169,8 @@ class Perforce(FetchMethod):
os.chdir(tmpfile) os.chdir(tmpfile)
logger.info("Fetch " + loc) logger.info("Fetch " + loc)
logger.info("%s%s files %s", p4cmd, p4opt, depot) logger.info("%s%s files %s", p4cmd, p4opt, depot)
p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot)) p4file, errors = bb.process.run("%s%s files %s" % (p4cmd, p4opt, depot))
p4file = p4file.strip()
if not p4file: if not p4file:
raise FetchError("Fetch: unable to get the P4 files from %s" % depot, loc) raise FetchError("Fetch: unable to get the P4 files from %s" % depot, loc)

View File

@ -77,8 +77,8 @@ class Svk(FetchMethod):
logger.debug(2, "Fetch: creating temporary directory") logger.debug(2, "Fetch: creating temporary directory")
bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata)) bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata) data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata)
tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, True) or "false") tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD', localdata, True) or "false")
tmpfile = tmppipe.readline().strip() tmpfile = tmpfile.strip()
if not tmpfile: if not tmpfile:
logger.error() logger.error()
raise FetchError("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.", loc) raise FetchError("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.", loc)

View File

@ -23,6 +23,7 @@
import gtk import gtk
import pango import pango
import gobject import gobject
import bb.process
from bb.ui.crumbs.progressbar import HobProgressBar from bb.ui.crumbs.progressbar import HobProgressBar
from bb.ui.crumbs.hobwidget import hic, HobNotebook, HobAltButton, HobWarpCellRendererText, HobButton from bb.ui.crumbs.hobwidget import hic, HobNotebook, HobAltButton, HobWarpCellRendererText, HobButton
from bb.ui.crumbs.runningbuild import RunningBuildTreeView from bb.ui.crumbs.runningbuild import RunningBuildTreeView
@ -97,9 +98,9 @@ class BuildConfigurationTreeView(gtk.TreeView):
for path in src_config_info.layers: for path in src_config_info.layers:
import os, os.path import os, os.path
if os.path.exists(path): if os.path.exists(path):
f = os.popen('cd %s; git branch 2>&1 | grep "^* " | tr -d "* "' % path) f, errors = bb.process.run('cd %s; git branch 2>&1 | grep "^* " | tr -d "* "' % path)
if f: if f:
branch = f.readline().lstrip('\n').rstrip('\n') branch = f.strip('\n')
vars.append(self.set_vars("Branch:", branch)) vars.append(self.set_vars("Branch:", branch))
f.close() f.close()
break break

View File

@ -25,12 +25,12 @@ import gobject
import hashlib import hashlib
import os import os
import re import re
import subprocess
import shlex import shlex
from bb.ui.crumbs.hobcolor import HobColors from bb.ui.crumbs.hobcolor import HobColors
from bb.ui.crumbs.hobwidget import hcc, hic, HobViewTable, HobInfoButton, HobButton, HobAltButton, HobIconChecker from bb.ui.crumbs.hobwidget import hcc, hic, HobViewTable, HobInfoButton, HobButton, HobAltButton, HobIconChecker
from bb.ui.crumbs.progressbar import HobProgressBar from bb.ui.crumbs.progressbar import HobProgressBar
import bb.ui.crumbs.utils import bb.ui.crumbs.utils
import bb.process
""" """
The following are convenience classes for implementing GNOME HIG compliant The following are convenience classes for implementing GNOME HIG compliant
@ -799,7 +799,8 @@ class DeployImageDialog (CrumbsDialog):
self.progress_bar.hide() self.progress_bar.hide()
def popen_read(self, cmd): def popen_read(self, cmd):
return os.popen("%s 2>/dev/null" % cmd).read().strip() tmpout, errors = bb.process.run("%s" % cmd)
return tmpout.strip()
def find_all_usb_devices(self): def find_all_usb_devices(self):
usb_devs = [ os.readlink(u) usb_devs = [ os.readlink(u)
@ -828,7 +829,7 @@ class DeployImageDialog (CrumbsDialog):
cmdline = bb.ui.crumbs.utils.which_terminal() cmdline = bb.ui.crumbs.utils.which_terminal()
if cmdline: if cmdline:
cmdline += "\"sudo dd if=" + self.image_path + " of=" + combo_item + "\"" cmdline += "\"sudo dd if=" + self.image_path + " of=" + combo_item + "\""
subprocess.Popen(args=shlex.split(cmdline)) bb.process.run(shlex.split(cmdline))
def update_progress_bar(self, title, fraction, status=None): def update_progress_bar(self, title, fraction, status=None):
self.progress_bar.update(fraction) self.progress_bar.update(fraction)