Exemple #1
0
def require_hostsys_dependencies(deps):
    """
    Require a dependency 'dep' to be installed. Try to install if not.
    Fail if not possible.
    """
    if not deps:
        return
    global REQUIRER_CHECKED_CACHE
    deps_to_check = [d for d in deps if d not in REQUIRER_CHECKED_CACHE]
    if not deps_to_check:
        return
    from pybombs import install_manager
    from pybombs.config_manager import config_manager
    REQUIRER_CHECKED_CACHE += deps_to_check
    try:
        config_manager.set_config_reference('pybombs')
        install_manager.InstallManager().install(
            deps_to_check,
            'install', # install / update
            fail_if_not_exists=False,
            update_if_exists=False,
            quiet=True,
            print_tree=False,
            install_type="binary", # Requirers may not request source packages
        )
    finally:
        config_manager.set_config_reference('prefix')
Exemple #2
0
def require_hostsys_dependencies(deps):
    """
    Require a dependency 'dep' to be installed. Try to install if not.
    Fail if not possible.
    """
    if not deps:
        return
    global REQUIRER_CHECKED_CACHE
    deps_to_check = [d for d in deps if d not in REQUIRER_CHECKED_CACHE]
    if not deps_to_check:
        return
    from pybombs import install_manager
    from pybombs.config_manager import config_manager
    s_order = config_manager.get('satisfy_order')
    # These are host system dependencies, so disallow source package manager
    config_manager.set('satisfy_order', 'native')
    REQUIRER_CHECKED_CACHE += deps_to_check
    install_manager.InstallManager().install(
            deps_to_check,
            'install', # install / update
            fail_if_not_exists=False,
            update_if_exists=False,
            quiet=True,
            print_tree=False,
    )
    # Restore previous settings
    config_manager.set('satisfy_order', s_order)
Exemple #3
0
 def install_dependencies(deps):
     " Install dependencies "
     if len(prefix_recipe.depends):
         self.log.info("Installing default packages for prefix...")
         self.log.info("".join(["\n  - {0}".format(x) for x in deps]))
         from pybombs import install_manager
         return install_manager.InstallManager().install(
             deps,
             'install', # install / update
             fail_if_not_exists=False,
             update_if_exists=False,
             print_tree=True,
         )
     return True
Exemple #4
0
 def __init__(self, cmd, args):
     CommandBase.__init__(
         self,
         cmd,
         args,
         load_recipes=True,
         require_prefix=False,  # Not required for non-source builds
     )
     self.args.packages = args.packages[0]
     get_all_pkgs = False
     if len(self.args.packages) == 0:
         if cmd == 'update':
             get_all_pkgs = True
             if not self.args.all:
                 self.args.no_deps = True
         else:
             self.log.error("No packages specified.")
             raise PBException("No packages specified.")
     self.update_if_exists = (cmd == 'update' or self.args.update)
     self.fail_if_not_exists = (cmd == 'update')
     if get_all_pkgs:
         self.args.packages = self.inventory.get_packages()
     self.install_manager = install_manager.InstallManager()
Exemple #5
0
    def _run_init(self):
        """
        pybombs prefix init
        """
        def register_alias(alias):
            if alias is not None:
                if self.prefix is not None and \
                        self.prefix.prefix_aliases.get(alias) is not None \
                        and not confirm("Alias `{0}' already exists, overwrite?".format(alias)):
                    self.log.warn('Aborting.')
                    raise PBException("Could not create alias.")
                self.cfg.update_cfg_file(
                    {'prefix_aliases': {
                        self.args.alias: path
                    }})

        # Go, go, go!
        try:
            prefix_recipe = get_prefix_recipe(self.args.recipe)
        except PBException as ex:
            self.log.error(str(ex))
            return -1
        if prefix_recipe is None:
            self.log.error("Could not find recipe for `{0}'".format(
                self.args.recipe))
            return -1
        # Make sure the directory is writable
        path = op.abspath(op.normpath(self.args.path))
        if not sysutils.mkdir_writable(path, self.log):
            self.log.error("Cannot write to prefix path `{0}'.".format(path))
            return -1
        # Make sure that a pybombs directory doesn't already exist
        from pybombs import config_manager
        if op.exists(op.join(path, config_manager.PrefixInfo.prefix_conf_dir)):
            self.log.error(
                "Ignoring. A prefix already exists in `{0}'".format(path))
            return -1
        # Add subdirs
        sysutils.require_subdirs(
            path, [k for k, v in prefix_recipe.dirs.items() if v])
        self.cfg.load(select_prefix=path)
        self.prefix = self.cfg.get_active_prefix()
        # Create files
        for fname, content in prefix_recipe.files.items():
            sysutils.write_file_in_subdir(
                path, fname, prefix_recipe.var_replace_all(content))
        # Register alias
        if self.args.alias is not None:
            register_alias(self.args.alias)
        # If there is no default prefix, make this the default
        if len(self.cfg.get('default_prefix')) == 0:
            if self.args.alias is not None:
                new_default_prefix = self.args.alias
            else:
                new_default_prefix = path
            self.cfg.update_cfg_file(
                {'config': {
                    'default_prefix': new_default_prefix
                }})
        # Create virtualenv if so desired
        if self.args.virtualenv:
            self.log.info("Creating Python virtualenv in prefix...")
            venv_args = ['virtualenv']
            venv_args.append(path)
            subproc.monitor_process(args=venv_args)
        # Install SDK if so desired
        sdk = self.args.sdkname or prefix_recipe.sdk
        if sdk is not None:
            self.log.info("Installing SDK recipe {0}.".format(sdk))
            self.log.info("Reloading configuration...")
            self.cfg.load(select_prefix=path)
            self.prefix = self.cfg.get_active_prefix()
            self.inventory = self.prefix.inventory
            self._install_sdk_to_prefix(sdk)
        # Update config section
        if len(prefix_recipe.config):
            self.cfg.update_cfg_file(prefix_recipe.config,
                                     self.prefix.cfg_file)
            self.cfg.load(select_prefix=path)
            self.prefix = self.cfg.get_active_prefix()
        # Install dependencies
        if len(prefix_recipe.depends):
            self.log.info("Installing default packages for prefix...")
            self.log.info("".join(
                ["\n  - {0}".format(x) for x in prefix_recipe.depends]))
            from pybombs import install_manager
            install_manager.InstallManager().install(
                prefix_recipe.depends,
                'install',  # install / update
                fail_if_not_exists=False,
                update_if_exists=False,
                print_tree=True,
            )
    def run(self):
        self.pid = os.getpid()
        self.pid_info.emit(self.pid)
        instaman = install_manager.InstallManager()
        if 'install' in self.package_list:
            install_list = self.package_list.get('install')
            for package in install_list:
                self.worker_log.info('Preparing {} for installation'.format(package))
                if instaman.install([package], 'install'):
                    self.worker_log.info("Install {} successful".format(package))
                    pkg_index = install_list.index(package)+1
                    progress = (pkg_index/len(install_list))* 100.0
                    self.progress_tick.emit(pkg_index, progress,
                                            len(install_list), 'install')
                else:
                    self.worker_log.error("Install Failed")
                    self.error_info.emit('install',
                                         "Install {} failed. Check logs !".format(package))

        if 'update' in self.package_list:
            update_list = self.package_list.get('update')
            for package in update_list:
                self.worker_log.info("Preparing {} to update".format(package))
                if instaman.install([package], 'update', update_if_exists=True):
                    self.worker_log.info("Update {} successful".format(package))
                    pkg_index = update_list.index(package)+1
                    progress = (pkg_index/len(update_list))* 100.0
                    self.progress_tick.emit(pkg_index, progress,
                                            len(update_list), 'update')
                else:
                    self.worker_log.error("Update Failed")
                    self.error_info.emit(
                        "Update {} failed. Check logs !".format(package))

        if 'remove' in self.package_list:
            remove_list = self.package_list.get('remove')
            pm = package_manager.PackageManager()
            dep_tree = dep_manager.DepManager().make_dep_tree(
            self.package_list.get('remove'),
            lambda x: bool(x in self.package_list.get('remove')))
            remove = reversed(dep_tree.serialize())
            ### Remove packages
            for pkg in remove:
                #Uninstall:
                self.worker_log.info("Preparing {} to remove".format(pkg))
                if pm.uninstall(pkg):
                    self.worker_log.info("Uninstall {} successful !".format(pkg))
                    pkg_index = remove_list.index(pkg)+1
                    progress = (pkg_index/len(remove_list))* 100.0
                    self.progress_tick.emit(pkg_index, progress,
                                            len(remove_list), 'remove')
                    #Remove entry from inventory:
                    self.inventory.remove(pkg)
                    self.inventory.save()
                else:
                    self.worker_log.error("Failed to remove {}".format(pkg))
                    self.error_info.emit(
                        "Removing {} unsuccessful. Check logs !".format(pkg))

        self.info_tick.emit("Tasks Completed successfully !")
        return