[OE-core] [PATCH 3/3] package_manager.py: Add extract() method for RPM package manager
Joshua G Lock
joshua.g.lock at linux.intel.com
Thu May 12 09:31:04 UTC 2016
On Wed, 2016-05-11 at 12:31 +0000, mariano.lopez at linux.intel.com wrote:
> From: Mariano Lopez <mariano.lopez at linux.intel.com>
>
> This new method extract the content of RPM file to a tmpdir,
> without actually installing the package.
>
> [YOCTO #9569]
>
> Signed-off-by: Mariano Lopez <mariano.lopez at linux.intel.com>
> ---
> meta/lib/oe/package_manager.py | 80
> ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 80 insertions(+)
>
> diff --git a/meta/lib/oe/package_manager.py
> b/meta/lib/oe/package_manager.py
> index 0830da9..d95564a 100644
> --- a/meta/lib/oe/package_manager.py
> +++ b/meta/lib/oe/package_manager.py
> @@ -1404,6 +1404,86 @@ class RpmPM(PackageManager):
> for f in rpm_db_locks:
> bb.utils.remove(f, True)
>
> + """
> + Returns a dictionary with the package info.
> + """
> + def package_info(self, pkg):
> + cmd = "%s %s info --urls %s" % (self.smart_cmd,
> self.smart_opt, pkg)
> + try:
> + output = subprocess.check_output(cmd,
> stderr=subprocess.STDOUT, shell=True)
> + except subprocess.CalledProcessError as e:
> + bb.fatal("Unable to list available packages. Command
> '%s' "
> + "returned %d:\n%s" % (cmd, e.returncode,
> e.output))
> +
> + #Parse output
> + for line in output.splitlines():
> + line = line.rstrip()
> + if line.startswith("Name:"):
> + pkg = line.split(": ")[1]
> + elif line.startswith("Version:"):
> + tmp_str = line.split(": ")[1]
> + ver, arch = tmp_str.split("@")
> + break
Could pkg, ver and arch be potentially undefined here?
> +
> + # Get filename
> + index = re.search("^URLs", output, re.MULTILINE)
> + tmp_str = output[index.end():]
> + for line in tmp_str.splitlines():
> + if "/" in line:
> + line = line.lstrip()
> + filename = line.split(" ")[0]
> + break
> +
> + # To have the same data type than other package_info methods
> + pkg_dict = {}
> + pkg_dict[pkg] = {"arch":arch, "ver":ver,
> "filename":filename}
> +
> + return pkg_dict
> +
> + """
> + Returns the path to a tmpdir where resides the contents of a
> package.
> +
> + Deleting the tmpdir is responsability of the caller.
> +
> + """
> + def extract(self, pkg):
> + pkg_info = self.package_info(pkg)
> + if not pkg_info:
> + bb.fatal("Unable to get information for package '%s'
> while "
> + "trying to extract the package." % pkg)
> +
> + pkg_arch = pkg_info[pkg]["arch"]
> + pkg_filename = pkg_info[pkg]["filename"]
> + pkg_path = os.path.join(self.deploy_dir, pkg_arch,
> pkg_filename)
> +
> + cpio_cmd = bb.utils.which(os.getenv("PATH"), "cpio")
> + rpm2cpio_cmd = bb.utils.which(os.getenv("PATH"), "rpm2cpio")
> +
> + if not os.path.isfile(pkg_path):
> + bb.fatal("Unable to extract package for '%s'."
> + "File %s doesn't exists" % (pkg, pkg_path))
> +
> + tmp_dir = tempfile.mkdtemp()
> + current_dir = os.getcwd()
> + os.chdir(tmp_dir)
> +
> + try:
> + cmd = "%s %s | %s -idmv" % (rpm2cpio_cmd, pkg_path,
> cpio_cmd)
> + output = subprocess.check_output(cmd,
> stderr=subprocess.STDOUT, shell=True)
> + except subprocess.CalledProcessError as e:
> + bb.utils.remove(tmp_dir, recurse=True)
> + bb.fatal("Unable to extract %s package. Command '%s' "
> + "returned %d:\n%s" % (pkg_path, cmd,
> e.returncode, e.output))
> + except OSError as e:
> + bb.utils.remove(tmp_dir, recurse=True)
> + bb.fatal("Unable to extract %s package. Command '%s' "
> + "returned %d:\n%s at %s" % (pkg_path, cmd,
> e.errno, e.strerror, e.filename))
> +
> + bb.note("Extracted %s to %s" % (pkg_path, tmp_dir))
> + os.chdir(current_dir)
> +
> + return tmp_dir
> +
>
> class OpkgDpkgPM(PackageManager):
> """
> --
> 2.6.6
>
More information about the Openembedded-core
mailing list