[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