[OE-core] [PATCH 1/5] manifest.py: add create_full for OpkgManifest class
Laurentiu Palcu
laurentiu.palcu at intel.com
Thu Feb 20 15:21:11 UTC 2014
On Thu, Feb 20, 2014 at 03:06:51PM +0800, Hongxu Jia wrote:
> The function create_full creates the manifest after the package in
> initial manifest has been dummy installed. It lists all *to be
> installed* packages. There is no real installation, just a test.
>
> [YOCTO #1894]
> Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
> ---
> meta/lib/oe/manifest.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/meta/lib/oe/manifest.py b/meta/lib/oe/manifest.py
> index a4bc04b..6e40a9f 100644
> --- a/meta/lib/oe/manifest.py
> +++ b/meta/lib/oe/manifest.py
> @@ -1,6 +1,8 @@
> from abc import ABCMeta, abstractmethod
> +from oe.package_manager import *
> import os
> import re
> +import bb
>
>
> class Manifest(object):
> @@ -69,6 +71,7 @@ class Manifest(object):
>
> self.initial_manifest = os.path.join(self.manifest_dir, "%s_initial_manifest" % manifest_type)
> self.final_manifest = os.path.join(self.manifest_dir, "%s_final_manifest" % manifest_type)
> + self.full_manifest = os.path.join(self.manifest_dir, "%s_full_manifest" % manifest_type)
>
> # packages in the following vars will be split in 'must install' and
> # 'multilib'
> @@ -128,6 +131,15 @@ class Manifest(object):
> pass
>
> """
> + This creates the manifest after the package in initial manifest has been
> + dummy installed. It lists all *to be installed* packages. There is no real
> + installation, just a test.
> + """
> + @abstractmethod
> + def create_full(self):
> + pass
> +
> + """
> The following function parses an initial manifest and returns a dictionary
> object with the must install, attempt only, multilib and language packages.
> """
> @@ -158,6 +170,22 @@ class Manifest(object):
>
> return pkgs
>
> + '''
> + This following function parses a full manifest and return a list
> + object with packages.
> + '''
> + def parse_full_manifest(self):
> + installed_pkgs = list()
> + if not os.path.exists(self.full_manifest):
> + bb.note('full manifest not exist')
> + return installed_pkgs
> +
> + with open(self.full_manifest, 'r') as manifest:
> + for pkg in manifest.read().split('\n'):
> + installed_pkgs.append(pkg.strip())
> +
> + return installed_pkgs
> +
>
> class RpmManifest(Manifest):
> """
> @@ -202,10 +230,12 @@ class RpmManifest(Manifest):
> for pkg in pkgs[pkg_type].split():
> manifest.write("%s,%s\n" % (pkg_type, pkg))
>
> -
> def create_final(self):
> pass
>
> + def create_full(self):
> + pass
> +
>
> class OpkgManifest(Manifest):
> """
> @@ -253,6 +283,36 @@ class OpkgManifest(Manifest):
> def create_final(self):
> pass
>
> + def create_full(self):
> + if not os.path.exists(self.initial_manifest):
> + self.create_initial()
> +
> + initial_manifest = self.parse_initial_manifest()
> + pkgs_to_install = list()
> + for pkg_type in initial_manifest:
> + pkgs_to_install += initial_manifest[pkg_type]
> + if len(pkgs_to_install) == 0:
> + return
> +
> + image_rootfs = self.d.expand("${T}/opkg")
> + opkg_conf = self.d.getVar("IPKGCONF_TARGET", True)
> + pkg_archs = self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS", True)
> + pm = OpkgPM(self.d, image_rootfs, opkg_conf, pkg_archs)
Do we really need to instantiate another PM object here? Can't the
caller pass an instance to it? After all, dummy_install() is not
supposed to alter the metadata, am I wrong? So, in this case, I believe
the caller can safely pass an instance to PM as an argument to the
function.
> +
> + pm.update()
> + pm.handle_bad_recommendations()
> + output = pm.dummy_install(pkgs_to_install)
> +
> + with open(self.full_manifest, 'w+') as manifest:
> + pkg_re = re.compile('^Installing ([^ ]+) [^ ].*')
> + for line in set(output.split('\n')):
> + m = pkg_re.match(line)
> + if m:
> + manifest.write(m.group(1) + '\n')
> +
> + bb.utils.remove(image_rootfs, True)
> + return
> +
>
> class DpkgManifest(Manifest):
> def create_initial(self):
> @@ -272,6 +332,9 @@ class DpkgManifest(Manifest):
> def create_final(self):
> pass
>
> + def create_full(self):
> + pass
> +
>
> def create_manifest(d, final_manifest=False, manifest_dir=None,
> manifest_type=Manifest.MANIFEST_TYPE_IMAGE):
> --
> 1.8.1.2
>
More information about the Openembedded-core
mailing list