diff --git a/pisi/build.py b/pisi/build.py index e5bc915f..e903f298 100644 --- a/pisi/build.py +++ b/pisi/build.py @@ -285,9 +285,23 @@ class Builder: def check_build_dependencies(self): """fail if dependencies not satisfied""" + build_deps = set(self.spec.source.buildDependencies) + + if not ctx.get_option('bypass_safety'): + if ctx.componentdb.has_component('system.devel'): + build_deps_names = set([x.package for x in build_deps]) + devel_deps_names = set(ctx.componentdb.get_component('system.devel').packages) + extra_names = devel_deps_names - build_deps_names + ctx.ui.warning(_('Safety switch: following extra packages in system.devel will be installed: ') + + util.strlist(extra_names)) + extra_deps = [dependency.Dependency(package = x) for x in extra_names] + build_deps = build_deps.union(extra_deps) + else: + ctx.ui.warning(_('Safety switch: the component system.devel cannot be found')) + # find out the build dependencies that are not satisfied... dep_unsatis = [] - for dep in self.spec.source.buildDependencies: + for dep in build_deps: if not dependency.installed_satisfies_dep(dep): dep_unsatis.append(dep) diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index 4ec1ad41..e85287f6 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -361,6 +361,8 @@ class PackageOp(Command): p = self.parser p.add_option("-B", "--ignore-comar", action="store_true", default=False, help=_("bypass comar configuration agent")) + p.add_option("-S", "--bypass-safety", action="store_true", + default=False, help=_("bypass safety switch")) ignoredep_opt(self) def init(self): diff --git a/pisi/operations.py b/pisi/operations.py index 82333d24..b2504bcc 100644 --- a/pisi/operations.py +++ b/pisi/operations.py @@ -180,7 +180,7 @@ def expand_components(A): if ctx.componentdb.has_component(x): Ap = Ap.union(ctx.componentdb.get_component(x).packages) else: - Ap.append(x) + Ap.add(x) return Ap def install_pkg_names(A): @@ -379,6 +379,16 @@ def remove(A): # filter packages that are not installed A_0 = A = expand_components(set(A)) + + if not ctx.get_option('bypass_safety'): + if ctx.componentdb.has_component('system.base'): + refused = A.intersection(set(ctx.componentdb.get_component('system.base').packages)) + ctx.ui.warning(_('Safety switch: cannot remove the following packages in system.base: ' + + util.strlist(list(refused)))) + A = A - set(ctx.componentdb.get_component('system.base').packages) + else: + ctx.ui.warning(_('Safety switch: the component system.base cannot be found')) + Ap = [] for x in A: if ctx.installdb.is_installed(x): diff --git a/pisi/specfile.py b/pisi/specfile.py index 0ec570ef..7564ddee 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -168,7 +168,8 @@ class Package: t_License = [ [autoxml.String], autoxml.optional] t_Icon = [ autoxml.String, autoxml.optional] t_RuntimeDependencies = [ [Dependency], autoxml.optional] - t_Files = [ [Path], autoxml.optional] + t_ComponentDependencies = [ [autoxml.String], autoxml.optional, "RuntimeDependencies/Component"] + t_Files = [ [Path], autoxml.optional] t_Conflicts = [ [autoxml.String], autoxml.optional, "Conflicts/Package"] t_ProvidesComar = [ [ComarProvide], autoxml.optional, "Provides/COMAR"] #t_RequiresComar = [ [autoxml.String], autoxml.mandatory, "Requires/COMAR"]