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')
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)
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
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()
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