def load_plugin(name, config, plugin_config): log.info(f"load plugin '{name}'") search_name = name search_version = None if ':' in name: search_name, search_version = name.split(':') if search_name.endswith("-plugin") == False: search_name = f"{search_name}-plugin" package = load_installed_package(search_name) if package is None: raise PluginException(f"{name}: plugin not installed") return if search_version and package.version != Version(search_version): raise PluginException( f"{name}: require version '{search_version}' but '{package.version}' found" ) try: spec = importlib.util.spec_from_file_location( "plugin", os.path.join(package.path, '__init__.py')) plugin = importlib.util.module_from_spec(spec) plugin.args = plugin_config spec.loader.exec_module(plugin) except Exception as e: print_stack() log.debug(e) raise PluginException(f"{name}: failed to load plugin")
def uninstall(ctx, name, **kwargs): log.info(f"uninstall {name} {kwargs}") config = ctx.parent.config if len(name) == 0: print("nothing to uninstall", file=sys.stderr) exit(1) # build repositories list repositories = load_repositories(config, prefix) packages = [] for package in name: pkg = load_installed_package(package, prefix=prefix) if pkg is None: print(f"{package}: package not installed", file=sys.stderr) exit(1) packages.append(pkg) for package in packages: package.uninstall()
def get_arch(profile, project, dependencies): # add arch try: arch = profile.data["/arch"] arch_name = profile.data["/arch/name"] except Exception as e: print_stack() log.error(e) print("No arch definition provided by profile", file=sys.stderr) exit(1) if 'name' not in arch: print("Arch name missing", file=sys.stderr) exit(1) package = None res_package = None if 'package' in arch: if 'version' in arch: package_version = arch['version'] else: package_version = 'latest' package_name = arch['package'] package = load_installed_package(package_name, package_version) res_package = package if package is None: package = project # search arch in found package archs = package.archs arch = next(arch for arch in archs if arch.name == arch_name) if arch is None: print(f"Arch {arch_name} not found in {package}", file=sys.stderr) exit(1) return arch, res_package
def install(ctx, name, link, reinstall, **kwargs): log.info(f"install {name} {kwargs}") _global = kwargs['global'] # not in parameters due to conflict with global keywoard # load configuration config = ctx.parent.config # load project project = ctx.parent.project if project is None: log.info(f"no project loaded") if len(name)==0 and project is None: print("nothing to install", file=sys.stderr) exit(1) # build repositories list repositories = load_repositories(config, prefix) for repository in repositories: if repository.load_credentials()==False: print(f"{repository.name}: warning: load credentials failed, update may fail due to rate limitation", file=sys.stderr) packages = [] if len(name)==0: if project is None: log.error(f"{os.getcwd()}: army.toml not found") exit(1) # get target config target = ctx.parent.target # if target is None: # print(f"no target specified", file=sys.stderr) # exit(1) for package in project.dependencies: pkg, repo = _find_package(package, project.dependencies[package], repositories, priority_dev=link) packages.append(PackageDependency(package=pkg, repository=repo)) if target is not None: for package in target.dependencies: pkg, repo = _find_package(package, target.dependencies[package], repositories, priority_dev=link) packages.append(PackageDependency(package=pkg, repository=repo)) for plugin in project.plugins: pkg, repo = _find_package(plugin, project.plugins[plugin], repositories, plugin=True, priority_dev=link) packages.append(PackageDependency(package=pkg, repository=repo)) if target is not None: for plugin in target.plugins: pkg, repo = _find_package(plugin, target.plugins[plugin], repositories, plugin=True, priority_dev=link) packages.append(PackageDependency(package=pkg, repository=repo)) else: for package in name: if '@' in package: chunks = package.split('@') if len(chunks)==3: package = f"{chunks[0]}@{chunks[1]}" version = chunks[2] elif len(chunks)==2: try: # check if version is valid test_version = VersionRange(chunks[1], ["0.0.0"]) package, version = chunks except: version = 'latest' else: print(f"{package}: naming error", file=sys.stderr) exit(1) else: version = 'latest' pkg, repo = _find_package(package, version, repositories, priority_dev=link) packages.append(PackageDependency(package=pkg, repository=repo)) # locate install folder if _global: path = os.path.join(prefix or "", "~/.army/dist/") else: path = "dist" force = False if reinstall: force = True dependencies = [] while(len(packages)>0): # get dependencies from top level package to end level package_dep = packages.pop(0) package = package_dep.package # dependency treated ok, append to list dependencies.append(package_dep) # append dependencies to list for dependency in package.dependencies: pkg, repo = _find_package(dependency, package.dependencies[dependency], repositories, priority_dev=link) dep_pkg = PackageDependency(package=pkg, repository=repo, from_package=package) packages.append(dep_pkg) # append plugins to list for plugin in package.plugins: pkg, repo = _find_package(plugin, package.plugins[plugin], repositories, priority_dev=link) dep_pkg = PackageDependency(package=pkg, repository=repo, from_package=package) packages.append(dep_pkg) # treat dependencies first dependencies.reverse() log.debug(f"packages: {dependencies}") # TODO checks _check_dependency_version_conflict(dependencies) _check_installed_version_conflict(dependencies) # clean dependency duplicates to avoid installing several times same package dependencies = _remove_duplicates(dependencies) # install for dependency in dependencies: install = False installed_package = load_installed_package(dependency.package.name, prefix=prefix) if installed_package: if force==True: print(f"reinstall {dependency.package}") install = True else: print(f"package {dependency.package} already installed", file=sys.stderr) install = False else: install = True print(f"install package {dependency.package}") if install==True: if link==True and dependency.repository.DEV==False: print(f"{dependency.package.name}: repository is not local, link not applied", file=sys.stderr) if dependency.repository.DEV==True: dependency.package.install(path=os.path.join(path, dependency.package.name), link=link) else: # link mode is only possible with repository DEV dependency.package.install(path=os.path.join(path, dependency.package.name), link=False)