コード例 #1
0
ファイル: list.py プロジェクト: GStreamer/cerbero
 def run(self, config, args):
     store = PackagesStore(config)
     packages = store.get_packages_list()
     if len(packages) == 0:
         m.message(_("No packages found"))
     for p in packages:
         m.message("%s - %s" % (p.name, p.version))
コード例 #2
0
ファイル: list.py プロジェクト: z-ming/cerbero
 def run(self, config, args):
     store = PackagesStore(config)
     packages = store.get_packages_list()
     if len(packages) == 0:
         m.message(_("No packages found"))
     for p in packages:
         m.message("%s - %s" % (p.name, p.version))
コード例 #3
0
    def run(self, config, args):
        cookbook = CookBook(config)
        failed = []
        p_name = args.package[0]

        store = PackagesStore(config)
        p = store.get_package(p_name)
        ordered_recipes = map(lambda x: cookbook.get_recipe(x),
                              p.recipes_dependencies())

        for recipe in ordered_recipes:
            if cookbook.recipe_needs_build(recipe.name):
                raise CommandError(
                    _("Recipe %s is not built yet" % recipe.name))

        for recipe in ordered_recipes:
            # call step function
            stepfunc = None
            try:
                stepfunc = getattr(recipe, 'check')
            except:
                m.message('%s has no check step, skipped' % recipe.name)

            if stepfunc:
                try:
                    m.message('Running checks for recipe %s' % recipe.name)
                    stepfunc()
                except Exception as ex:
                    failed.append(recipe.name)
                    m.warning(_("%s checks failed: %s") % (recipe.name, ex))
        if failed:
            raise CommandError(
                _("Error running %s checks on:\n    " + "\n    ".join(failed))
                % p_name)
コード例 #4
0
 def run(self, config, args):
     store = PackagesStore(config)
     recipes = []
     for package_name in args.packages:
         package = store.get_package(package_name)
         recipes += package.recipes_dependencies()
     return self.fetch(store.cookbook, recipes, False, args.reset_rdeps)
コード例 #5
0
ファイル: info.py プロジェクト: dashesy/cerbero
 def run(self, config, args):
     store = PackagesStore(config)
     p_name = args.package[0]
     if args.list_files:
         m.message('\n'.join(store.get_package_files_list(p_name)))
     else:
         p = store.get_package(p_name)
         licenses = [p.license]
         if not isinstance(p, MetaPackage):
             recipes_licenses = p.recipes_licenses()
             recipes_licenses.update(p.devel_recipes_licenses())
             for recipe_name, categories_licenses in \
                     six.iteritems(recipes_licenses):
                 for category_licenses in six.itervalues(
                         categories_licenses):
                     licenses.extend(category_licenses)
         licenses = sorted(list(set(licenses)))
         d = {
             'name':
             p.name,
             'version':
             p.version,
             'url':
             p.url,
             'licenses':
             ' and '.join([l.acronym for l in licenses]),
             'desc':
             p.shortdesc,
             'deps':
             ', '.join(
                 [p.name for p in store.get_package_deps(p_name, True)])
         }
         m.message(INFO_TPL % d)
コード例 #6
0
    def run(self, config, args):
        cookbook = CookBook(config)
        failed = []
        p_name = args.package[0]

        store = PackagesStore(config)
        p = store.get_package(p_name)
        ordered_recipes = map(lambda x: cookbook.get_recipe(x),
                    p.recipes_dependencies())

        for recipe in ordered_recipes:
            if cookbook.recipe_needs_build(recipe.name):
                raise CommandError(_("Recipe %s is not built yet" % recipe.name))

        for recipe in ordered_recipes:
            # call step function
            stepfunc = None
            try:
                stepfunc = getattr(recipe, 'check')
            except:
                m.message('%s has no check step, skipped' % recipe.name)

            if stepfunc:
                try:
                    m.message('Running checks for recipe %s' % recipe.name)
                    stepfunc()
                except Exception, ex:
                    failed.append(recipe.name)
                    m.warning(_("%s checks failed: %s") % (recipe.name, ex))
コード例 #7
0
ファイル: package.py プロジェクト: z-ming/cerbero
    def run(self, config, args):
        self.store = PackagesStore(config)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(_("Cannot use --skip-deps-build together with "
                    "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p, args.no_devel)

        if args.only_build_deps:
            return

        if p is None:
            raise PackageNotFoundError(args.package[0])
        if args.tarball:
            pkg = DistTarball(config, p, self.store)
        else:
            pkg = Packager(config, p, self.store)
        m.action(_("Creating package for %s") % p.name)
        if args.tarball:
            paths = pkg.pack(os.path.abspath(args.output_dir), args.no_devel,
                             args.force, args.keep_temp, split=not args.no_split)
        else:
            paths = pkg.pack(os.path.abspath(args.output_dir), args.no_devel,
                             args.force, args.keep_temp)
        if None in paths:
            paths.remove(None)
        p.post_install(paths)
        m.action(_("Package successfully created in %s") %
                 ' '.join([os.path.abspath(x) for x in paths]))
コード例 #8
0
ファイル: package.py プロジェクト: wangfan008/cerbero
    def run(self, config, args):
        self.store = PackagesStore(config, offline=args.offline)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(
                _("Cannot use --skip-deps-build together with "
                  "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p, args.no_devel, args.offline,
                             args.dry_run, args.jobs)

        if args.only_build_deps or args.dry_run:
            return

        if args.compress_method != 'default':
            m.message('Forcing tarball compression method as ' +
                      args.compress_method)
            config.package_tarball_compression = args.compress_method

        if p is None:
            raise PackageNotFoundError(args.package[0])

        p.pre_package()
        packager_class = Packager
        if args.tarball:
            if config.target_platform == Platform.ANDROID and \
               config.target_arch == Architecture.UNIVERSAL:
                packager_class = AndroidPackager
            else:
                packager_class = DistTarball
        elif config.variants.uwp:
            # Split devel/runtime packages are useless for UWP since we will
            # need both when building the package, and all needed runtime DLLs
            # are packaged with the app as assets.
            m.warning('Forcing single-tarball output for UWP package')
            args.no_split = True
            packager_class = DistTarball

        m.action(_("Creating package for %s") % p.name)
        pkg = packager_class(config, p, self.store)
        output_dir = os.path.abspath(args.output_dir)
        if isinstance(pkg, DistTarball):
            paths = pkg.pack(output_dir,
                             args.no_devel,
                             args.force,
                             args.keep_temp,
                             split=not args.no_split,
                             strip_binaries=p.strip)
        else:
            paths = pkg.pack(output_dir, args.no_devel, args.force,
                             args.keep_temp)
        if None in paths:
            paths.remove(None)
        paths = p.post_package(paths, output_dir) or paths
        m.action(
            _("Package successfully created in %s") %
            ' '.join([os.path.abspath(x) for x in paths]))
コード例 #9
0
ファイル: debugpackages.py プロジェクト: wangfan008/cerbero
    def run(self, config, args):
        store = PackagesStore(config)

        allfiles = [p.all_files_list() for p in store.get_packages_list() if\
                    isinstance(p, Package)]
        allfiles = list(itertools.chain(*allfiles))

        self.find_duplicates(allfiles)
        self.find_orphan_files(allfiles, config.prefix, args.exclude)
コード例 #10
0
ファイル: debugpackages.py プロジェクト: AlertMe/cerbero
    def run(self, config, args):
        store = PackagesStore(config)

        allfiles = [p.all_files_list() for p in store.get_packages_list() if\
                    isinstance(p, Package)]
        allfiles = list(itertools.chain(*allfiles))

        self.find_duplicates(allfiles)
        self.find_orphan_files(allfiles, config.prefix, args.exclude)
コード例 #11
0
    def run(self, config, args):
        name = args.name[0]
        version = args.version[0]
        store = PackagesStore(config)
        filename = os.path.join(config.packages_dir, '%s.package' % name)
        if not args.force and os.path.exists(filename):
            m.warning(
                _("Package '%s' (%s) already exists, "
                  "use -f to replace" % (name, filename)))
            return

        template_args = {}

        template = RECEIPT_TPL
        template_args['name'] = name
        template_args['version'] = version

        if args.short_desc:
            template_args['shortdesc'] = args.short_desc
        else:
            template_args['shortdesc'] = name

        if args.codename:
            template += CODENAME_TPL
            template_args['codename'] = args.codename

        if args.vendor:
            template += VENDOR_TPL
            template_args['vendor'] = args.vendor

        if args.url:
            template += URL_TPL
            template_args['url'] = args.url

        if args.license:
            self.validate_licenses([args.license])
            template += LICENSE_TPL
            template_args['license'] = \
                'License.' + self.supported_licenses[args.license]

        deps = []
        if args.deps:
            template += DEPS_TPL
            deps = args.deps.split(',')
            for dname in deps:
                try:
                    package = store.get_package(dname)
                except Exception, ex:
                    raise UsageError(
                        _("Error creating package: "
                          "dependant package %s does not exist") % dname)
            template_args['deps'] = deps
コード例 #12
0
ファイル: add_package.py プロジェクト: AlertMe/cerbero
    def run(self, config, args):
        name = args.name[0]
        version = args.version[0]
        store = PackagesStore(config)
        filename = os.path.join(config.packages_dir, '%s.package' % name)
        if not args.force and os.path.exists(filename):
            m.warning(_("Package '%s' (%s) already exists, "
                "use -f to replace" % (name, filename)))
            return

        template_args = {}

        template = RECEIPT_TPL
        template_args['name'] = name
        template_args['version'] = version

        if args.short_desc:
            template_args['shortdesc'] = args.short_desc
        else:
            template_args['shortdesc'] = name

        if args.codename:
            template += CODENAME_TPL
            template_args['codename'] = args.codename

        if args.vendor:
            template += VENDOR_TPL
            template_args['vendor'] = args.vendor

        if args.url:
            template += URL_TPL
            template_args['url'] = args.url

        if args.license:
            self.validate_licenses([args.license])
            template += LICENSE_TPL
            template_args['license'] = \
                'License.' + self.supported_licenses[args.license]

        deps = []
        if args.deps:
            template += DEPS_TPL
            deps = args.deps.split(',')
            for dname in deps:
                try:
                    package = store.get_package(dname)
                except Exception, ex:
                    raise UsageError(_("Error creating package: "
                            "dependant package %s does not exist") % dname)
            template_args['deps'] = deps
コード例 #13
0
    def run(self, config, args):
        self.store = PackagesStore(config, offline=args.offline)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(
                _("Cannot use --skip-deps-build together with "
                  "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p, args.no_devel, args.offline,
                             args.dry_run)

        if args.only_build_deps or args.dry_run:
            return

        if args.xz:
            config.package_tarball_compression = 'xz'

        if p is None:
            raise PackageNotFoundError(args.package[0])
        p.pre_package()
        if args.tarball:
            if config.target_platform == Platform.ANDROID and \
               config.target_arch == Architecture.UNIVERSAL:
                pkg = AndroidPackager(config, p, self.store)
            else:
                pkg = DistTarball(config, p, self.store)
        else:
            pkg = Packager(config, p, self.store)
        m.action(_("Creating package for %s") % p.name)
        output_dir = os.path.abspath(args.output_dir)
        if args.tarball:
            paths = pkg.pack(output_dir,
                             args.no_devel,
                             args.force,
                             args.keep_temp,
                             split=not args.no_split,
                             strip_binaries=p.strip)
        else:
            paths = pkg.pack(output_dir, args.no_devel, args.force,
                             args.keep_temp)
        if None in paths:
            paths.remove(None)
        paths = p.post_package(paths, output_dir) or paths
        m.action(
            _("Package successfully created in %s") %
            ' '.join([os.path.abspath(x) for x in paths]))
コード例 #14
0
ファイル: package.py プロジェクト: UIKit0/ore-infinium
class Package(Command):
    doc = N_('Creates a distribution package')
    name = 'package'

    def __init__(self):
        Command.__init__(self,
            [ArgparseArgument('package', nargs=1,
                             help=_('name of the package to create')),
            ArgparseArgument('-o', '--output-dir', default='.',
                             help=_('Output directory for the tarball file')),
            ArgparseArgument('-t', '--tarball', action='store_true',
                default=False,
                help=_('Creates a tarball instead of a native package')),
            ArgparseArgument('-f', '--force', action='store_true',
                default=False, help=_('Delete any existing package file')),
            ArgparseArgument('-d', '--no-devel', action='store_false',
                default=True, help=_('Do not create the development version '
                    'of this package')),
            ArgparseArgument('-s', '--skip-deps-build', action='store_true',
                default=False, help=_('Do not build the recipes needed to '
                    'create this package (conflicts with --only-build-deps)')),
            ArgparseArgument('-b', '--only-build-deps', action='store_true',
                default=False, help=_('Only build the recipes needed to '
                    'create this package (conflicts with --skip-deps-build)')),
            ArgparseArgument('-k', '--keep-temp', action='store_true',
                default=False, help=_('Keep temporary files for debug')),
            ])

    def run(self, config, args):
        self.store = PackagesStore(config)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(_("Cannot use --skip-deps-build together with "
                    "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p)

        if args.only_build_deps:
            return

        if p is None:
            raise PackageNotFoundError(args.package[0])
        if args.tarball:
            pkg = DistTarball(config, p, self.store)
        else:
            pkg = Packager(config, p, self.store)
        m.action(_("Creating package for %s") % p.name)
        paths = pkg.pack(os.path.abspath(args.output_dir), args.no_devel,
                         args.force, args.keep_temp)
        if None in paths:
            paths.remove(None)
        m.action(_("Package successfully created in %s") %
                 ' '.join([os.path.abspath(x) for x in paths]))

    def _build_deps(self, config, package):
        build_command = build.Build()
        build_command.runargs(config, package.recipes_dependencies(),
            cookbook=self.store.cookbook)
コード例 #15
0
    def run(self, config, args):
        if args.recipe + args.package + args.package_recipes == 0:
            m.error(
                'Error: You need to specify either recipe, package or package-recipes '
                'mode to generate the dependency graph')
            return

        if args.recipe + args.package + args.package_recipes > 1:
            m.error(
                'Error: You can only specify recipe, package or package-recipes but not more than one'
            )
            return

        if not shutil.which('dot'):
            m.error(
                'Error: dot command not found. Please install graphviz it using '
                'your package manager. e.g. apt/dnf/brew install graphviz')
            return

        label = ''
        if args.recipe:
            self.graph_type = GraphType.RECIPE
            label = 'recipe'
        elif args.package:
            self.graph_type = GraphType.PACKAGE
            label = 'package'
        elif args.package_recipes:
            self.graph_type = GraphType.PACKAGE_RECIPES
            label = 'package\'s recipes'

        if self.graph_type == GraphType.RECIPE or self.graph_type == GraphType.PACKAGE_RECIPES:
            self.cookbook = CookBook(config)
        if self.graph_type == GraphType.PACKAGE or self.graph_type == GraphType.PACKAGE_RECIPES:
            self.package_store = PackagesStore(config)

        name = args.name[0]
        output = args.output[0] if args.output else name + '.svg'

        tmp = tempfile.NamedTemporaryFile()
        dot = 'digraph {{\n\tlabel="{} {}";\n{}}}\n'.format(
            name, label, self._dot_gen(name, self.graph_type))
        with open(tmp.name, 'w') as f:
            f.write(dot)

        shell.new_call(['dot', '-Tsvg', tmp.name, '-o', output])
        m.message("Dependency graph for %s generated at %s" % (name, output))
コード例 #16
0
    def __getattr__(self, name):
        if name not in self.__dict__:

            if name == 'store':
                self.__dict__[name] = PackagesStore(self.config)

            if name == 'cookbook':
                self.__dict__[name] = CookBook(self.config)

        return self.__dict__[name]
コード例 #17
0
ファイル: info.py プロジェクト: centricular/cerbero
 def run(self, config, args):
     store = PackagesStore(config)
     p_name = args.package[0]
     if args.list_files:
         m.message('\n'.join(store.get_package_files_list(p_name)))
     else:
         p = store.get_package(p_name)
         licenses = [p.license]
         if not isinstance(p, MetaPackage):
             recipes_licenses = p.recipes_licenses()
             recipes_licenses.update(p.devel_recipes_licenses())
             for recipe_name, categories_licenses in \
                     recipes_licenses.items():
                 for category_licenses in categories_licenses.values():
                     licenses.extend(category_licenses)
         licenses = sorted(list(set(licenses)))
         d = {'name': p.name, 'version': p.version, 'url': p.url,
              'licenses': ' and '.join([l.acronym for l in licenses]),
              'desc': p.shortdesc,
              'deps': ', '.join([p.name for p in
                                 store.get_package_deps(p_name, True)])}
         m.message(INFO_TPL % d)
コード例 #18
0
ファイル: info.py プロジェクト: RoyinRolland/cerbero
 def run(self, config, args):
     store = PackagesStore(config)
     p_name = args.package[0]
     if args.list_files:
         m.message("\n".join(store.get_package_files_list(p_name)))
     else:
         p = store.get_package(p_name)
         licenses = [p.license]
         if not isinstance(p, MetaPackage):
             recipes_licenses = p.recipes_licenses()
             recipes_licenses.update(p.devel_recipes_licenses())
             for recipe_name, categories_licenses in recipes_licenses.iteritems():
                 for category_licenses in categories_licenses.itervalues():
                     licenses.extend(category_licenses)
         licenses = sorted(list(set(licenses)))
         d = {
             "name": p.name,
             "version": p.version,
             "url": p.url,
             "licenses": " and ".join([l.acronym for l in licenses]),
             "desc": p.shortdesc,
             "deps": ", ".join([p.name for p in store.get_package_deps(p_name, True)]),
         }
         m.message(INFO_TPL % d)
コード例 #19
0
    def start_cooking(self,
                      recipes,
                      use_binaries=False,
                      upload_binaries=False,
                      build_missing=True):
        '''
        Cooks the provided recipe names
        '''
        if isinstance(recipes, str):
            recipes = [recipes]

        m.message(
            _("Building the following recipes: %s") %
            ' '.join([x for x in recipes]))

        if use_binaries or upload_binaries:

            def _build(recipe, i, length):
                self.cook_recipe(recipe, i, length)
                if upload_binaries:
                    try:
                        fridge.freeze_recipe(recipe, i, length)
                    except RecipeNotFreezableError:
                        pass

            if not self.store:
                self.store = PackagesStore(self.cookbook.get_config())
            fridge = Fridge(self.store, force=self.force, dry_run=self.dry_run)
            i = 1
            for recipe in recipes:
                if use_binaries:
                    try:
                        fridge.unfreeze_recipe(recipe, i, len(recipes))
                    except (RecipeNotFreezableError, BuildStepError) as e:
                        if build_missing or isinstance(
                                e, RecipeNotFreezableError):
                            _build(recipe, i, len(recipes))
                        else:
                            raise e
                else:
                    _build(recipe, i, len(recipes))
                i += 1
        else:
            i = 1
            for recipe in recipes:
                self.cook_recipe(recipe, i, len(recipes))
                i += 1
コード例 #20
0
def create_store(config):
    cookbook = create_cookbook(config)
    store = PackagesStore(config, False)

    for klass in [Package1, Package2, Package3, Package4, App]:
        package = klass(config, store, cookbook)
        package.__file__ = 'test/test_packages_common.py'
        store.add_package(package)
    for klass in [MetaPackage]:
        package = klass(config, store)
        package.__file__ = 'test/test_packages_common.py'
        store.add_package(package)
    return store
コード例 #21
0
    def runargs(self, config, recipes, missing_files=False, force=False,
                no_deps=False, store=None, dry_run=False, use_binaries=False,
                upload_binaries=False, build_missing=False):
        if not store:
            store = PackagesStore(config)
        cookbook = store.cookbook

        oven = Oven(cookbook, force=self.force, missing_files=missing_files,
                    dry_run=dry_run, store=store)

        if isinstance(recipes, str):
            recipes = [recipes]

        if no_deps:
            ordered_recipes = recipes
        else:
            ordered_recipes = cookbook.list_recipes_deps(recipes)
        oven.start_cooking(ordered_recipes, use_binaries, upload_binaries,
                build_missing)
コード例 #22
0
ファイル: genbinaries.py プロジェクト: llenroc/cerbero
    def run(self, config, args):
        store = PackagesStore(config)
        cookbook = store.cookbook
        recipes = cookbook.get_recipes_list()
        fridge = Fridge(store, args.force, args.dry_run)
        built_recipes = []
        # get all built recipes
        for recipe in recipes:
            bv = cookbook.recipe_built_version(recipe.name)
            cv = recipe.built_version()
            if bv == cv:
                built_recipes.append(recipe)

        # finally freeze them
        i = 1
        for recipe in built_recipes:
            try:
                fridge.freeze_recipe(recipe, i, len(built_recipes))
            except:
                pass
            i += 1
コード例 #23
0
ファイル: package.py プロジェクト: fluendo/cerbero
    def run(self, config, args):
        self.store = PackagesStore(config)
        packages = []
        for name in args.package:
            p = self.store.get_package(name)
            if p is None:
                raise PackageNotFoundError(name)
            packages.append(p)

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(_("Cannot use --skip-deps-build together with "
                    "--only-build-deps"))
        if not args.skip_deps_build:
            self._build_deps(config, packages, args)
        if args.only_build_deps:
            return

        package_outputs = []
        for package in packages:
            package_outputs += self._create_package(config, package, args)
        print package_outputs
        return
コード例 #24
0
    def _get(self):

        tools = Build_Tools(self.config)
        store  = PackagesStore(self.config)
        cookbook = CookBook(self.config)

        names  = tools.BUILD_TOOLS
        names += tools.PLAT_BUILD_TOOLS.get(self.config.platform, [])
        recipes ={}
        path = os.path.join(self.config.packages_dir,'custom.py')
        d={}
        parse_file(path,d )
        version = d['GStreamer'].version

        for name in names:
            recipes[name] = cookbook.get_recipe(name).version

        pkgname ='build-tools'

        tarball = '%s-%s-%s-%s'%( pkgname,
            self.config.platform,
            self.config.arch,
            version
        )

        return {
            'name':pkgname,
            'version': version,
            'prefix':self.config.build_tools_prefix,
            'deps':[],
            'platform':self.config.platform,
            'arch':self.config.arch,

            'tarball':{
                'runtime':{ 'filename':tarball +'.tar.bz2'}
            },
            'recipes': recipes
        }
コード例 #25
0
class PackageTest(unittest.TestCase):
    def setUp(self):
        self.config = common.DummyConfig()
        self.config.packages_dir = '/test'
        self.config.target_platform = Platform.LINUX
        self.store = PackagesStore(self.config, False)

    def testAddPackage(self):
        package = common.Package1(self.config, None, None)
        self.assertEqual(len(self.store._packages), 0)
        self.store.add_package(package)
        self.assertEqual(len(self.store._packages), 1)
        self.assertEqual(package, self.store._packages[package.name])

    def testGetPackage(self):
        package = common.Package1(self.config, None, None)
        self.store.add_package(package)
        self.assertEqual(package, self.store.get_package(package.name))

    def testPackageNotFound(self):
        self.assertRaises(PackageNotFoundError, self.store.get_package,
                          'unknown')

    def testPackagesList(self):
        package = common.Package1(self.config, None, None)
        metapackage = common.MetaPackage(self.config, None)
        self.store.add_package(package)
        self.store.add_package(metapackage)
        l = sorted([package, metapackage], key=lambda x: x.name)
        self.assertEqual(l, self.store.get_packages_list())

    def testPackageDeps(self):
        package = common.Package1(self.config, None, None)
        package2 = common.Package2(self.config, None, None)
        self.store.add_package(package)
        self.store.add_package(package2)
        self.assertEqual(
            package.deps,
            [x.name for x in self.store.get_package_deps(package.name)])

    def testMetaPackageDeps(self):
        metapackage = common.MetaPackage(self.config, None)
        self.store.add_package(metapackage)
        # the metapackage depends on package that are not yet in the store
        self.assertRaises(PackageNotFoundError, self.store.get_package_deps,
                          metapackage.name)
        for klass in [
                common.Package1, common.Package2, common.Package3,
                common.Package4
        ]:
            p = klass(self.config, None, None)
            self.store.add_package(p)
        for klass in [common.MetaPackage]:
            p = klass(self.config, None)
            self.store.add_package(p)
        deps = [
            'gstreamer-test-bindings', 'gstreamer-test1', 'gstreamer-test2',
            'gstreamer-test3'
        ]
        res = [x.name for x in self.store.get_package_deps(metapackage.name)]
        self.assertEqual(sorted(deps), sorted(res))

    def testLoadPackageFromFile(self):
        package_file = tempfile.NamedTemporaryFile()
        package_file.write(PACKAGE)
        package_file.flush()
        p = self.store._load_package_from_file(package_file.name)
        self.assertIsInstance(p, Package)
        self.assertEqual('test-package', p.name)

    def testLoadMetaPackageFromFile(self):
        for x, t in [(SDKPACKAGE, SDKPackage),
                     (INSTALLERPACKAGE, InstallerPackage)]:
            package_file = tempfile.NamedTemporaryFile()
            package_file.write(x)
            package_file.flush()
            p = self.store._load_package_from_file(package_file.name)
            print(p, type(p))
            self.assertIsInstance(p, t)
            self.assertEqual('test-package', p.name)

    def testImports(self):
        package_file = tempfile.NamedTemporaryFile()
        package_file.write(PACKAGE)
        package_file.flush()
        p = self.store._load_package_from_file(package_file.name)
        self.assertIsInstance(p, Package)
        try:
            p.test_imports()
        except ImportError as e:
            self.fail("Import error raised, %s", e)
コード例 #26
0
class Graph(Command):
    doc = N_('Create a graph of dependencies using dot from graphviz')
    name = 'graph'

    def __init__(self):
        Command.__init__(self, [
            ArgparseArgument(
                'name',
                nargs=1,
                help=_('name of the recipe or package to generate deps from')),
            ArgparseArgument('-r',
                             '--recipe',
                             action='store_true',
                             help=_('generate deps for the given recipe')),
            ArgparseArgument('-p',
                             '--package',
                             action='store_true',
                             help=_('generate deps for the given package')),
            ArgparseArgument(
                '-pr',
                '--package-recipes',
                action='store_true',
                help=_('generate recipe deps for the given package')),
            ArgparseArgument('-o',
                             '--output',
                             nargs=1,
                             help=_('output file for the SVG graph')),
        ])

    def run(self, config, args):
        if args.recipe + args.package + args.package_recipes == 0:
            m.error(
                'Error: You need to specify either recipe, package or package-recipes '
                'mode to generate the dependency graph')
            return

        if args.recipe + args.package + args.package_recipes > 1:
            m.error(
                'Error: You can only specify recipe, package or package-recipes but not more than one'
            )
            return

        if not shutil.which('dot'):
            m.error(
                'Error: dot command not found. Please install graphviz it using '
                'your package manager. e.g. apt/dnf/brew install graphviz')
            return

        label = ''
        if args.recipe:
            self.graph_type = GraphType.RECIPE
            label = 'recipe'
        elif args.package:
            self.graph_type = GraphType.PACKAGE
            label = 'package'
        elif args.package_recipes:
            self.graph_type = GraphType.PACKAGE_RECIPES
            label = 'package\'s recipes'

        if self.graph_type == GraphType.RECIPE or self.graph_type == GraphType.PACKAGE_RECIPES:
            self.cookbook = CookBook(config)
        if self.graph_type == GraphType.PACKAGE or self.graph_type == GraphType.PACKAGE_RECIPES:
            self.package_store = PackagesStore(config)

        name = args.name[0]
        output = args.output[0] if args.output else name + '.svg'

        tmp = tempfile.NamedTemporaryFile()
        dot = 'digraph {{\n\tlabel="{} {}";\n{}}}\n'.format(
            name, label, self._dot_gen(name, self.graph_type))
        with open(tmp.name, 'w') as f:
            f.write(dot)

        shell.new_call(['dot', '-Tsvg', tmp.name, '-o', output])
        m.message("Dependency graph for %s generated at %s" % (name, output))

    def _dot_gen(self, name, graph_type, already_parsed=[]):
        already_parsed.append(name)
        if graph_type == GraphType.RECIPE:
            deps = self.cookbook.get_recipe(name).list_deps()
        elif graph_type == GraphType.PACKAGE:
            deps = [p.name for p in self.package_store.get_package_deps(name)]
        elif graph_type == GraphType.PACKAGE_RECIPES:
            deps = self.package_store.get_package(name).recipes_dependencies()
            graph_type = GraphType.RECIPE
        line = ''
        for dep in deps:
            line += '\t"{}" -> "{}";\n'.format(name, dep)
            if dep not in already_parsed:
                line += self._dot_gen(dep, graph_type, already_parsed)
        return line
コード例 #27
0
ファイル: package.py プロジェクト: wangfan008/cerbero
class Package(Command):
    doc = N_('Creates a distribution package')
    name = 'package'

    def __init__(self):
        Command.__init__(self, [
            ArgparseArgument(
                'package', nargs=1, help=_('name of the package to create')),
            ArgparseArgument('-o',
                             '--output-dir',
                             default='.',
                             help=_('Output directory for the tarball file')),
            ArgparseArgument(
                '-t',
                '--tarball',
                action='store_true',
                default=False,
                help=_('Creates a tarball instead of a native package')),
            ArgparseArgument(
                '-n',
                '--no-split',
                action='store_true',
                default=False,
                help=_(
                    '(only meaningfull when --tarball is set) Create one single '
                    'tarball with devel and runtime files')),
            ArgparseArgument('-f',
                             '--force',
                             action='store_true',
                             default=False,
                             help=_('Delete any existing package file')),
            ArgparseArgument('-d',
                             '--no-devel',
                             action='store_false',
                             default=True,
                             help=_('Do not create the development version '
                                    'of this package')),
            ArgparseArgument(
                '-s',
                '--skip-deps-build',
                action='store_true',
                default=False,
                help=_(
                    'Do not build the recipes needed to '
                    'create this package (conflicts with --only-build-deps)')),
            ArgparseArgument(
                '-b',
                '--only-build-deps',
                action='store_true',
                default=False,
                help=_(
                    'Only build the recipes needed to '
                    'create this package (conflicts with --skip-deps-build)')),
            ArgparseArgument('-k',
                             '--keep-temp',
                             action='store_true',
                             default=False,
                             help=_('Keep temporary files for debug')),
            ArgparseArgument('--offline',
                             action='store_true',
                             default=False,
                             help=_('Use only the source cache, no network')),
            ArgparseArgument(
                '--dry-run',
                action='store_true',
                default=False,
                help=_('Only print the packages that will be built')),
            ArgparseArgument('--compress-method',
                             type=str,
                             choices=['default', 'xz', 'bz2'],
                             default='default',
                             help=_('Select compression method for tarballs')),
            ArgparseArgument('--jobs',
                             '-j',
                             action='store',
                             type=int,
                             default=0,
                             help=_('How many recipes to build concurrently. '
                                    '0 = number of CPUs.')),
        ])

    def run(self, config, args):
        self.store = PackagesStore(config, offline=args.offline)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(
                _("Cannot use --skip-deps-build together with "
                  "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p, args.no_devel, args.offline,
                             args.dry_run, args.jobs)

        if args.only_build_deps or args.dry_run:
            return

        if args.compress_method != 'default':
            m.message('Forcing tarball compression method as ' +
                      args.compress_method)
            config.package_tarball_compression = args.compress_method

        if p is None:
            raise PackageNotFoundError(args.package[0])

        p.pre_package()
        packager_class = Packager
        if args.tarball:
            if config.target_platform == Platform.ANDROID and \
               config.target_arch == Architecture.UNIVERSAL:
                packager_class = AndroidPackager
            else:
                packager_class = DistTarball
        elif config.variants.uwp:
            # Split devel/runtime packages are useless for UWP since we will
            # need both when building the package, and all needed runtime DLLs
            # are packaged with the app as assets.
            m.warning('Forcing single-tarball output for UWP package')
            args.no_split = True
            packager_class = DistTarball

        m.action(_("Creating package for %s") % p.name)
        pkg = packager_class(config, p, self.store)
        output_dir = os.path.abspath(args.output_dir)
        if isinstance(pkg, DistTarball):
            paths = pkg.pack(output_dir,
                             args.no_devel,
                             args.force,
                             args.keep_temp,
                             split=not args.no_split,
                             strip_binaries=p.strip)
        else:
            paths = pkg.pack(output_dir, args.no_devel, args.force,
                             args.keep_temp)
        if None in paths:
            paths.remove(None)
        paths = p.post_package(paths, output_dir) or paths
        m.action(
            _("Package successfully created in %s") %
            ' '.join([os.path.abspath(x) for x in paths]))

    def _build_deps(self, config, package, has_devel, offline, dry_run, jobs):
        build_command = build.Build()
        build_command.runargs(config,
                              package.recipes_dependencies(has_devel),
                              cookbook=self.store.cookbook,
                              dry_run=dry_run,
                              offline=offline,
                              jobs=jobs)
コード例 #28
0
class Package(Command):
    doc = N_('Creates a distribution package')
    name = 'package'

    def __init__(self):
        Command.__init__(self, [
            ArgparseArgument(
                'package', nargs=1, help=_('name of the package to create')),
            ArgparseArgument('-o',
                             '--output-dir',
                             default='.',
                             help=_('Output directory for the tarball file')),
            ArgparseArgument(
                '-t',
                '--tarball',
                action='store_true',
                default=False,
                help=_('Creates a tarball instead of a native package')),
            ArgparseArgument(
                '-n',
                '--no-split',
                action='store_true',
                default=False,
                help=_(
                    '(only meaningfull when --tarball is set) Create one single '
                    'tarball with devel and runtime files')),
            ArgparseArgument('-f',
                             '--force',
                             action='store_true',
                             default=False,
                             help=_('Delete any existing package file')),
            ArgparseArgument('-d',
                             '--no-devel',
                             action='store_false',
                             default=True,
                             help=_('Do not create the development version '
                                    'of this package')),
            ArgparseArgument(
                '-s',
                '--skip-deps-build',
                action='store_true',
                default=False,
                help=_(
                    'Do not build the recipes needed to '
                    'create this package (conflicts with --only-build-deps)')),
            ArgparseArgument(
                '-b',
                '--only-build-deps',
                action='store_true',
                default=False,
                help=_(
                    'Only build the recipes needed to '
                    'create this package (conflicts with --skip-deps-build)')),
            ArgparseArgument('-k',
                             '--keep-temp',
                             action='store_true',
                             default=False,
                             help=_('Keep temporary files for debug')),
            ArgparseArgument('--offline',
                             action='store_true',
                             default=False,
                             help=_('Use only the source cache, no network')),
            ArgparseArgument(
                '--dry-run',
                action='store_true',
                default=False,
                help=_('Only print the packages that will be built')),
            ArgparseArgument('--xz',
                             action='store_true',
                             default=False,
                             help=_(
                                 'Use xz instead of bzip2 for compression if '
                                 'creating a tarball')),
        ])

    def run(self, config, args):
        self.store = PackagesStore(config, offline=args.offline)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(
                _("Cannot use --skip-deps-build together with "
                  "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p, args.no_devel, args.offline,
                             args.dry_run)

        if args.only_build_deps or args.dry_run:
            return

        if args.xz:
            config.package_tarball_compression = 'xz'

        if p is None:
            raise PackageNotFoundError(args.package[0])
        p.pre_package()
        if args.tarball:
            if config.target_platform == Platform.ANDROID and \
               config.target_arch == Architecture.UNIVERSAL:
                pkg = AndroidPackager(config, p, self.store)
            else:
                pkg = DistTarball(config, p, self.store)
        else:
            pkg = Packager(config, p, self.store)
        m.action(_("Creating package for %s") % p.name)
        output_dir = os.path.abspath(args.output_dir)
        if args.tarball:
            paths = pkg.pack(output_dir,
                             args.no_devel,
                             args.force,
                             args.keep_temp,
                             split=not args.no_split,
                             strip_binaries=p.strip)
        else:
            paths = pkg.pack(output_dir, args.no_devel, args.force,
                             args.keep_temp)
        if None in paths:
            paths.remove(None)
        paths = p.post_package(paths, output_dir) or paths
        m.action(
            _("Package successfully created in %s") %
            ' '.join([os.path.abspath(x) for x in paths]))

    def _build_deps(self, config, package, has_devel, offline, dry_run):
        build_command = build.Build()
        build_command.runargs(config,
                              package.recipes_dependencies(has_devel),
                              cookbook=self.store.cookbook,
                              dry_run=dry_run,
                              offline=offline)
コード例 #29
0
ファイル: package.py プロジェクト: z-ming/cerbero
class Package(Command):
    doc = N_('Creates a distribution package')
    name = 'package'

    def __init__(self):
        Command.__init__(self,
            [ArgparseArgument('package', nargs=1,
                             help=_('name of the package to create')),
            ArgparseArgument('-o', '--output-dir', default='.',
                             help=_('Output directory for the tarball file')),
            ArgparseArgument('-t', '--tarball', action='store_true',
                default=False,
                help=_('Creates a tarball instead of a native package')),
            ArgparseArgument('-n', '--no-split', action='store_true',
                default=False,
                help=_('(only meaningfull when --tarball is set) Create one single '
                       'tarball with devel and runtime files')),
            ArgparseArgument('-f', '--force', action='store_true',
                default=False, help=_('Delete any existing package file')),
            ArgparseArgument('-d', '--no-devel', action='store_false',
                default=True, help=_('Do not create the development version '
                    'of this package')),
            ArgparseArgument('-s', '--skip-deps-build', action='store_true',
                default=False, help=_('Do not build the recipes needed to '
                    'create this package (conflicts with --only-build-deps)')),
            ArgparseArgument('-b', '--only-build-deps', action='store_true',
                default=False, help=_('Only build the recipes needed to '
                    'create this package (conflicts with --skip-deps-build)')),
            ArgparseArgument('-k', '--keep-temp', action='store_true',
                default=False, help=_('Keep temporary files for debug')),
            ])

    def run(self, config, args):
        self.store = PackagesStore(config)
        p = self.store.get_package(args.package[0])

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(_("Cannot use --skip-deps-build together with "
                    "--only-build-deps"))

        if not args.skip_deps_build:
            self._build_deps(config, p, args.no_devel)

        if args.only_build_deps:
            return

        if p is None:
            raise PackageNotFoundError(args.package[0])
        if args.tarball:
            pkg = DistTarball(config, p, self.store)
        else:
            pkg = Packager(config, p, self.store)
        m.action(_("Creating package for %s") % p.name)
        if args.tarball:
            paths = pkg.pack(os.path.abspath(args.output_dir), args.no_devel,
                             args.force, args.keep_temp, split=not args.no_split)
        else:
            paths = pkg.pack(os.path.abspath(args.output_dir), args.no_devel,
                             args.force, args.keep_temp)
        if None in paths:
            paths.remove(None)
        p.post_install(paths)
        m.action(_("Package successfully created in %s") %
                 ' '.join([os.path.abspath(x) for x in paths]))

    def _build_deps(self, config, package, has_devel):
        build_command = build.Build()
        build_command.runargs(config, package.recipes_dependencies(has_devel),
            cookbook=self.store.cookbook)
コード例 #30
0
ファイル: fetch.py プロジェクト: AlertMe/cerbero
 def run(self, config, args):
     store = PackagesStore(config)
     package = store.get_package(args.package[0])
     return self.fetch(store.cookbook, package.recipes_dependencies(),
                       True, args.reset_rdeps, args.full_reset)
コード例 #31
0
ファイル: package.py プロジェクト: fluendo/cerbero
class Package(Command):
    doc = N_('Creates a distribution package for one or several packages')
    name = 'package'

    def __init__(self):
        Command.__init__(self,
            [ArgparseArgument('package', nargs='*',
                             help=_('name of the package to create')),
            ArgparseArgument('-o', '--output-dir', default='.',
                             help=_('Output directory for the tarball file')),
            ArgparseArgument('-t', '--type', type=str, default='native',
                choices=['native', ArchiveType.TARBALL , ArchiveType.ZIP],
                help=_('Choose a package type, native or archive')),
            ArgparseArgument('-f', '--force', action='store_true',
                default=False, help=_('Delete any existing package file')),
            ArgparseArgument('-d', '--no-devel', action='store_true',
                default=False, help=_('Do not create the development version '
                    'of this package')),
            ArgparseArgument('-s', '--skip-deps-build', action='store_true',
                default=False, help=_('Do not build the recipes needed to '
                    'create this package (conflicts with --only-build-deps)')),
            ArgparseArgument('-b', '--only-build-deps', action='store_true',
                default=False, help=_('Only build the recipes needed to '
                    'create this package (conflicts with --skip-deps-build)')),
            ArgparseArgument('-k', '--keep-temp', action='store_true',
                default=False, help=_('Keep temporary files for debug')),
            ArgparseArgument('-u', '--use-binaries', action='store_true',
                default=False,
                help=_('use binaries from the repo before building')),
            ArgparseArgument('-p', '--upload-binaries', action='store_true',
                default=False,
                help=_('after a recipe is built upload the corresponding binary package')),
            ArgparseArgument('-m', '--build-missing', action='store_true',
                default=False,
                help=_('in case a binary package is missing try to build it')),
            ])

    def run(self, config, args):
        self.store = PackagesStore(config)
        packages = []
        for name in args.package:
            p = self.store.get_package(name)
            if p is None:
                raise PackageNotFoundError(name)
            packages.append(p)

        if args.skip_deps_build and args.only_build_deps:
            raise UsageError(_("Cannot use --skip-deps-build together with "
                    "--only-build-deps"))
        if not args.skip_deps_build:
            self._build_deps(config, packages, args)
        if args.only_build_deps:
            return

        package_outputs = []
        for package in packages:
            package_outputs += self._create_package(config, package, args)
        print package_outputs
        return

    def _create_package(self, config, p, args):
        if args.type == 'native':
            pkg = Packager(config, p, self.store)
        else:
            pkg = DistArchive(config, p, self.store, args.type)

        m.action(_("Creating package for %s") % p.name)
        p.pre_package()
        paths = pkg.pack(os.path.abspath(args.output_dir), not args.no_devel,
                         args.force, args.keep_temp)
        if None in paths:
            paths.remove(None)
        if '' in paths:
            paths.remove('')

        paths = p.post_package(paths) or paths
        for p in paths:
            BUF_SIZE = 65536  # 64kb chunks
            sha1 = hashlib.sha1()
            with open(os.path.abspath(p), 'rb') as f:
                while True:
                    data = f.read(BUF_SIZE)
                    if not data:
                        break
                    sha1.update(data)
            sha1sum = sha1.hexdigest()

            m.action(_("Package successfully created in %s %s") % (os.path.abspath(p), sha1sum))
            # Generate the sha1sum file
            with open('%s.sha1' % p, 'w+') as sha1file:
                sha1file.write(sha1sum)
        return paths

    def _build_deps(self, config, packages, args):
        recipes = []
        for package in packages:
            recipes += package.recipes_dependencies()
        build_command = build.Build()
        build_command.runargs(config, set(recipes),
            store=self.store, use_binaries=args.use_binaries,
            upload_binaries=args.upload_binaries,
            build_missing=args.build_missing)
コード例 #32
0
 def setUp(self):
     self.config = common.DummyConfig()
     self.config.packages_dir = '/test'
     self.config.target_platform = Platform.LINUX
     self.store = PackagesStore(self.config, False)
コード例 #33
0
ファイル: bundlesource.py プロジェクト: Artpej/cerbero
    def run(self, config, args):
        packages = []
        recipes = []
        bundle_recipes = []
        bundle_dirs = []
        setup_args = ['sdist']

        if not config.uninstalled:
            m.error("Can only be run on cerbero-uninstalled")

        store = PackagesStore(config)
        cookbook = CookBook(config)

        packages = list(args.bundlepackages)

        for p in packages:
            package = store.get_package(p)
            if hasattr(package, 'list_packages'):
                packages += package.list_packages()
        packages = remove_list_duplicates(packages)

        for p in packages:
            package = store.get_package(p)
            if hasattr(package, 'deps'):
                packages += package.deps
        packages = remove_list_duplicates(packages)

        for p in packages:
            package = store.get_package(p)
            recipes += package.recipes_dependencies()
        recipes += args.add_recipe

        for r in recipes:
            bundle_recipes += cookbook.list_recipe_deps(r)
        bundle_recipes = remove_list_duplicates(bundle_recipes)

        for p in packages:
            setup_args.append('--package=' + p)

        for r in bundle_recipes:
            setup_args.append('--recipe=' + r.name)
            if r.stype != SourceType.CUSTOM:
                bundle_dirs.append(r.repo_dir)

        if not args.no_bootstrap:
            build_tools = BuildTools(config)
            bs_recipes = build_tools.BUILD_TOOLS + \
                         build_tools.PLAT_BUILD_TOOLS.get(config.platform, [])
            b_recipes = []
            for r in bs_recipes:
                b_recipes += cookbook.list_recipe_deps(r)
            b_recipes = remove_list_duplicates(b_recipes)

            for r in b_recipes:
                if r.stype != SourceType.CUSTOM:
                    bundle_dirs.append(r.repo_dir)

        setup_args.append('--source-dirs=' + ','.join(bundle_dirs))

        command = str(config._relative_path('setup.py'))
        run_setup(command, setup_args)
コード例 #34
0
 def __init__(self,config ):
     self.config = config
     self.store  = PackagesStore(config)
     self.cookbook = CookBook(config)
     self.packages_ = None
コード例 #35
0
ファイル: add_package.py プロジェクト: jpakkane/cerbero
    def run(self, config, args):
        name = args.name[0]
        version = args.version[0]
        store = PackagesStore(config)
        filename = os.path.join(config.packages_dir, '%s.package' % name)
        if not args.force and os.path.exists(filename):
            m.warning(_("Package '%s' (%s) already exists, "
                "use -f to replace" % (name, filename)))
            return

        template_args = {}

        template = RECEIPT_TPL
        template_args['name'] = name
        template_args['version'] = version

        if args.short_desc:
            template_args['shortdesc'] = args.short_desc
        else:
            template_args['shortdesc'] = name

        if args.codename:
            template += CODENAME_TPL
            template_args['codename'] = args.codename

        if args.vendor:
            template += VENDOR_TPL
            template_args['vendor'] = args.vendor

        if args.url:
            template += URL_TPL
            template_args['url'] = args.url

        if args.license:
            self.validate_licenses([args.license])
            template += LICENSE_TPL
            template_args['license'] = \
                'License.' + self.supported_licenses[args.license]

        deps = []
        if args.deps:
            template += DEPS_TPL
            deps = args.deps.split(',')
            for dname in deps:
                try:
                    package = store.get_package(dname)
                except Exception as ex:
                    raise UsageError(_("Error creating package: "
                            "dependant package %s does not exist") % dname)
            template_args['deps'] = deps

        include_files = []
        include_files_devel = []
        platform_include_files = {}
        platform_include_files_devel = {}
        if args.includes:
            includes = args.includes.split(',')
            if list(set(deps) & set(includes)):
                raise UsageError(_("Error creating package: "
                        "param --deps intersects with --includes"))
            for pname in includes:
                try:
                    package = store.get_package(pname)
                except Exception as ex:
                    raise UsageError(_("Error creating package: "
                            "included package %s does not exist") % pname)
                include_files.extend(package.files)
                include_files_devel.extend(package.files_devel)
                platform_include_files = self.merge_dict(
                        platform_include_files,
                        package.platform_files)
                platform_include_files_devel = self.merge_dict(
                        platform_include_files_devel,
                        package.platform_files_devel)

        include_files = list(set(include_files))
        include_files_devel = list(set(include_files_devel))

        if args.files or include_files:
            template += FILES_TPL
            files = []
            if args.files:
                files = args.files.split(',')
            if include_files:
                files.extend(include_files)
            template_args['files'] = files

        if args.files_devel or include_files_devel:
            template += FILES_DEVEL_TPL
            files_devel = []
            if args.files_devel:
                files_devel = args.files_devel.split(',')
            if include_files_devel:
                files_devel.extend(include_files_devel)
            template_args['files_devel'] = files_devel

        if args.platform_files or platform_include_files:
            template += PLATFORM_FILES_TPL
            platform_files = self.parse_platform_files(
                    args.platform_files, platform_include_files)
            template_args['platform_files'] = platform_files

        if args.platform_files_devel or platform_include_files_devel:
            template += PLATFORM_FILES_DEVEL_TPL
            platform_files_devel = self.parse_platform_files(
                    args.platform_files_devel,
                    platform_include_files_devel)
            template_args['platform_files_devel'] = platform_files_devel

        try:
            f = open(filename, 'w')
            f.write(template % template_args)
            f.close()

            m.action(_("Package '%s' successfully created in %s") %
                    (name, filename))
        except IOError as ex:
            raise FatalError(_("Error creating package: %s") % ex)
コード例 #36
0
ファイル: fetch.py プロジェクト: raj91765/gstreamer
 def run(self, config, args):
     store = PackagesStore(config)
     package = store.get_package(args.package[0])
     return self.fetch(store.cookbook, package.recipes_dependencies(),
                       False, args.reset_rdeps)
コード例 #37
0
 def run(self, config, args):
     store = PackagesStore(config)
     package = store.get_package(args.package[0])
     return self.fetch(store.cookbook, package.recipes_dependencies(),
                       args.deps, args.reset_rdeps, args.full_reset,
                       args.print_only, args.jobs)
コード例 #38
0
    def run(self, config, args):
        packages = []
        recipes = []
        bundle_recipes = []
        bundle_dirs = []
        setup_args = ['sdist']

        if not config.uninstalled:
            m.error("Can only be run on cerbero-uninstalled")

        store = PackagesStore(config)
        cookbook = CookBook(config)

        packages = list(args.bundlepackages)

        for p in packages:
            package = store.get_package(p)
            if hasattr(package, 'list_packages'):
                packages += package.list_packages()
        packages = remove_list_duplicates(packages)

        for p in packages:
            package = store.get_package(p)
            if hasattr(package, 'deps'):
                packages += package.deps
        packages = remove_list_duplicates(packages)

        for p in packages:
            package = store.get_package(p)
            recipes += package.recipes_dependencies()
        recipes += args.add_recipe

        for r in recipes:
            bundle_recipes += cookbook.list_recipe_deps(r)
        bundle_recipes = remove_list_duplicates(bundle_recipes)

        for p in packages:
            setup_args.append('--package=' + p)

        for r in bundle_recipes:
            setup_args.append('--recipe=' + r.name)
            if r.stype != SourceType.CUSTOM:
                bundle_dirs.append(r.repo_dir)

        if not args.no_bootstrap:
            build_tools = BuildTools(config)
            bs_recipes = build_tools.BUILD_TOOLS + \
                         build_tools.PLAT_BUILD_TOOLS.get(config.platform, [])
            b_recipes = []
            for r in bs_recipes:
                b_recipes += cookbook.list_recipe_deps(r)
            b_recipes = remove_list_duplicates(b_recipes)

            for r in b_recipes:
                if r.stype != SourceType.CUSTOM:
                    bundle_dirs.append(r.repo_dir)

        setup_args.append('--source-dirs=' + ','.join(bundle_dirs))

        command = str(config._relative_path('setup.py'))
        run_setup(command, setup_args)
コード例 #39
0
class PackageTest(unittest.TestCase):

    def setUp(self):
        self.config = common.DummyConfig()
        self.config.packages_dir = '/test'
        self.config.target_platform = Platform.LINUX
        self.store = PackagesStore(self.config, False)

    def testAddPackage(self):
        package = common.Package1(self.config, None, None)
        self.assertEquals(len(self.store._packages), 0)
        self.store.add_package(package)
        self.assertEquals(len(self.store._packages), 1)
        self.assertEquals(package, self.store._packages[package.name])

    def testGetPackage(self):
        package = common.Package1(self.config, None, None)
        self.store.add_package(package)
        self.assertEquals(package, self.store.get_package(package.name))

    def testPackageNotFound(self):
        self.failUnlessRaises(PackageNotFoundError, self.store.get_package,
            'unknown')

    def testPackagesList(self):
        package = common.Package1(self.config, None, None)
        metapackage = common.MetaPackage(self.config, None)
        self.store.add_package(package)
        self.store.add_package(metapackage)
        l = sorted([package, metapackage], key=lambda x: x.name)
        self.assertEquals(l, self.store.get_packages_list())

    def testPackageDeps(self):
        package = common.Package1(self.config, None,  None)
        package2 = common.Package2(self.config, None, None)
        self.store.add_package(package)
        self.store.add_package(package2)
        self.assertEquals(package.deps,
            [x.name for x in self.store.get_package_deps(package.name)])

    def testMetaPackageDeps(self):
        metapackage = common.MetaPackage(self.config, None)
        self.store.add_package(metapackage)
        # the metapackage depends on package that are not yet in the store
        self.failUnlessRaises(PackageNotFoundError,
            self.store.get_package_deps, metapackage.name)
        for klass in [common.Package1, common.Package2, common.Package3,
                common.Package4]:
            p = klass(self.config, None, None)
            self.store.add_package(p)
        for klass in [common.MetaPackage]:
            p = klass(self.config, None)
            self.store.add_package(p)
        deps = ['gstreamer-test-bindings', 'gstreamer-test1',
                'gstreamer-test2', 'gstreamer-test3']
        res = [x.name for x in self.store.get_package_deps(metapackage.name)]
        self.assertEquals(sorted(deps), sorted(res))

    def testLoadPackageFromFile(self):
        package_file = tempfile.NamedTemporaryFile()
        package_file.write(PACKAGE)
        package_file.flush()
        p = self.store._load_package_from_file(package_file.name)
        self.assertIsInstance(p, Package)
        self.assertEquals('test-package', p.name)

    def testLoadMetaPackageFromFile(self):
        for x, t in [(SDKPACKAGE, SDKPackage),
                (INSTALLERPACKAGE, InstallerPackage)]:
            package_file = tempfile.NamedTemporaryFile()
            package_file.write(x)
            package_file.flush()
            p = self.store._load_package_from_file(package_file.name)
            print p, type(p)
            self.assertIsInstance(p, t)
            self.assertEquals('test-package', p.name)

    def testImports(self):
        package_file = tempfile.NamedTemporaryFile()
        package_file.write(PACKAGE)
        package_file.flush()
        p = self.store._load_package_from_file(package_file.name)
        self.assertIsInstance(p, Package)
        try:
            p.test_imports()
        except ImportError, e:
            self.fail("Import error raised, %s", e)
コード例 #40
0
 def setUp(self):
     self.config = common.DummyConfig()
     self.config.packages_dir = '/test'
     self.config.target_platform = Platform.LINUX
     self.store = PackagesStore(self.config, False)
コード例 #41
0
ファイル: add_package.py プロジェクト: felipealmeida/cerbero
    def run(self, config, args):
        name = args.name[0]
        version = args.version[0]
        store = PackagesStore(config)
        filename = os.path.join(config.packages_dir, '%s.package' % name)
        if not args.force and os.path.exists(filename):
            m.warning(_("Package '%s' (%s) already exists, "
                "use -f to replace" % (name, filename)))
            return

        template_args = {}

        template = RECEIPT_TPL
        template_args['name'] = name
        template_args['version'] = version

        if args.short_desc:
            template_args['shortdesc'] = args.short_desc
        else:
            template_args['shortdesc'] = name

        if args.vendor:
            template += VENDOR_TPL
            template_args['vendor'] = args.vendor

        if args.url:
            template += URL_TPL
            template_args['url'] = args.url

        if args.license:
            self.validate_licenses([args.license])
            template += LICENSE_TPL
            template_args['license'] = \
                'License.' + self.supported_licenses[args.license]

        deps = []
        if args.deps:
            template += DEPS_TPL
            deps = args.deps.split(',')
            for dname in deps:
                try:
                    package = store.get_package(dname)
                except Exception as ex:
                    raise UsageError(_("Error creating package: "
                            "dependant package %s does not exist") % dname)
            template_args['deps'] = deps

        include_files = []
        include_files_devel = []
        platform_include_files = {}
        platform_include_files_devel = {}
        if args.includes:
            includes = args.includes.split(',')
            if list(set(deps) & set(includes)):
                raise UsageError(_("Error creating package: "
                        "param --deps intersects with --includes"))
            for pname in includes:
                try:
                    package = store.get_package(pname)
                except Exception as ex:
                    raise UsageError(_("Error creating package: "
                            "included package %s does not exist") % pname)
                include_files.extend(package.files)
                include_files_devel.extend(package.files_devel)
                platform_include_files = self.merge_dict(
                        platform_include_files,
                        package.platform_files)
                platform_include_files_devel = self.merge_dict(
                        platform_include_files_devel,
                        package.platform_files_devel)

        include_files = list(set(include_files))
        include_files_devel = list(set(include_files_devel))

        if args.files or include_files:
            template += FILES_TPL
            files = []
            if args.files:
                files = args.files.split(',')
            if include_files:
                files.extend(include_files)
            template_args['files'] = files

        if args.files_devel or include_files_devel:
            template += FILES_DEVEL_TPL
            files_devel = []
            if args.files_devel:
                files_devel = args.files_devel.split(',')
            if include_files_devel:
                files_devel.extend(include_files_devel)
            template_args['files_devel'] = files_devel

        if args.platform_files or platform_include_files:
            template += PLATFORM_FILES_TPL
            platform_files = self.parse_platform_files(
                    args.platform_files, platform_include_files)
            template_args['platform_files'] = platform_files

        if args.platform_files_devel or platform_include_files_devel:
            template += PLATFORM_FILES_DEVEL_TPL
            platform_files_devel = self.parse_platform_files(
                    args.platform_files_devel,
                    platform_include_files_devel)
            template_args['platform_files_devel'] = platform_files_devel

        try:
            f = open(filename, 'w')
            f.write(template % template_args)
            f.close()

            m.action(_("Package '%s' successfully created in %s") %
                    (name, filename))
        except IOError as ex:
            raise FatalError(_("Error creating package: %s") % ex)
コード例 #42
0
class Package(object):



    def __init__(self,config ):
        self.config = config
        self.store  = PackagesStore(config)
        self.cookbook = CookBook(config)
        self.packages_ = None

    
    def _recipes(self,package):
        '''
        return the recipes (name:version) dict included in the package (not include in deps packages)
        
        '''
        
        all = package.recipes_dependencies()
        
        rdeps=[]
        for pkg in self.store.get_package_deps( package.name):
            rdeps.extend( pkg.recipes_dependencies())
        rnames = list(set(all).difference(set(rdeps)))
        recipes ={}
        for name in rnames:
            recipes[name] = self.cookbook.get_recipe(name).version
        return recipes


    def get_recipes(self,package):
        '''
        return the recipes (name:version) dict included in the package (not include in deps packages)
        
        '''

        if isinstance (package,SDKPackage):
            recipes={}
            for p in self.store.get_package_deps(package):
                recipes.update( self._recipes( p) )
            return recipes
        
        return self._recipes(package)

    def get_packages_deps(self,package):
        '''
        return the packages of the SDK/package dependent.
        
        '''

        dependencies = []

        if isinstance (package,SDKPackage):
            if hasattr(package, 'dependencies'):
                dependencies = package.dependencies
            return []
        else:
            dependencies = [p.name for p in self.store.get_package_deps(package.name, False)]

        deps = {}
        for name in dependencies:            
            version = self.store.get_package(name).version
            deps[name] = version
        return deps



    def _pkg(self,package):

        

        t = DistTarball(self.config,package,self.store)
        tarball={}

        for ptype in [PackageType.DEVEL,PackageType.RUNTIME]:
            TNAME={PackageType.DEVEL:'devel',PackageType.RUNTIME:'runtime'}
            tarball[TNAME[ptype]]={
                'filename':t._get_name(ptype)
            }
        profile = {
            'name':package.name,
            'version':package.version,
            'platform':self.config.target_platform,
            'arch':self.config.target_arch,
            'recipes': self.get_recipes(package),
            'dependencies': self.get_packages_deps(package),

            #'deps': [p.name for p in self.store.get_package_deps(package.name, True)],
            #'direct.deps': [p.name for p in self.store.get_package_deps(package.name, False)],
            'tarball': tarball
        }

        if self.config.build_type == 'debug':
            profile['debug'] = True
        return profile

    def get(self,name):
        if self.packages_ is None:
            self.packages()
        return self.packages_[name]

    def packages(self):
        if self.packages_ is None:
            self.packages_ = {}
            for pkg in self.store.get_packages_list():
                #if isinstance (pkg,SDKPackage):
                #    continue
                self.packages_[pkg.name] = self._pkg( pkg )

        return self.packages_