diff options
author | André Erdmann <dywi@mailerd.de> | 2014-07-14 16:26:16 +0200 |
---|---|---|
committer | André Erdmann <dywi@mailerd.de> | 2014-07-14 16:26:16 +0200 |
commit | 88c02f7ff1141ba8903d671e32b363720337e9ea (patch) | |
tree | 15cddbc60de1d3a9bd15b0cced7db8475cf3f6e4 | |
parent | roverlay/packagerules/: match category name (diff) | |
download | R_overlay-88c02f7ff1141ba8903d671e32b363720337e9ea.tar.gz R_overlay-88c02f7ff1141ba8903d671e32b363720337e9ea.tar.bz2 R_overlay-88c02f7ff1141ba8903d671e32b363720337e9ea.zip |
roverlay/packagerules: addition control actions
"add-policy {force-deny,force-add,deny-replace,revbump-on-collision,default}"
See previous commits for details.
-rw-r--r-- | roverlay/packagerules/actions/addition_control.py | 85 | ||||
-rw-r--r-- | roverlay/packagerules/parser/context/action.py | 37 |
2 files changed, 122 insertions, 0 deletions
diff --git a/roverlay/packagerules/actions/addition_control.py b/roverlay/packagerules/actions/addition_control.py new file mode 100644 index 0000000..be92da9 --- /dev/null +++ b/roverlay/packagerules/actions/addition_control.py @@ -0,0 +1,85 @@ +# R overlay -- package rule actions, addition-control actions +# -*- coding: utf-8 -*- +# Copyright (C) 2013 André Erdmann <dywi@mailerd.de> +# Distributed under the terms of the GNU General Public License; +# either version 2 of the License, or (at your option) any later version. + +## names: PackageAdditionControl<type>Action + + +import roverlay.packagerules.abstract.actions + +import roverlay.overlay.abccontrol + +from roverlay.overlay.abccontrol import AdditionControlResult + +ACTIONS = [ + 'PackageAdditionControlDefaultAction', + 'PackageAdditionControlForceDenyAction', + 'PackageAdditionControlForceAddAction', + 'PackageAdditionControlDenyReplaceAction', + 'PackageAdditionControlRevbumpOnCollisionAction', +] + +__all__ = ACTIONS + + +class PackageAdditionControlActionBase ( + roverlay.packagerules.abstract.actions.PackageRuleAction +): + KEYWORD = "add-policy" + CONTROL_KEYWORD = None + CONTROL_RESULT = None + + def apply_action ( self, p_info ): + p_info.addition_override = self.CONTROL_RESULT + + # more correct: + # ao = (ao & CONTROL_RESULT_IMASK) | CONTROL_RESULT + # where CONTROL_RESULT_IMASK filters out all conflicting bits + # --- end of apply_action (...) --- + + def gen_str ( self, level ): + yield "{indent}{keyword} {control_keyword}".format ( + keyword = self.KEYWORD, + control_keyword = self.CONTROL_KEYWORD, + indent = ( level * self.INDENT ) + ) + # --- end of gen_str (...) --- + +# --- end of PackageAdditionControlActionBase --- + + +class PackageAdditionControlDefaultAction ( + PackageAdditionControlActionBase +): + CONTROL_KEYWORD = "default" + CONTROL_RESULT = AdditionControlResult.PKG_DEFAULT_BEHAVIOR + + +class PackageAdditionControlForceDenyAction ( + PackageAdditionControlActionBase +): + CONTROL_KEYWORD = "force-deny" + CONTROL_RESULT = AdditionControlResult.PKG_FORCE_DENY + + +class PackageAdditionControlForceAddAction ( + PackageAdditionControlActionBase +): + CONTROL_KEYWORD = "force-add" + CONTROL_RESULT = AdditionControlResult.PKG_FORCE_ADD + + +class PackageAdditionControlDenyReplaceAction ( + PackageAdditionControlActionBase +): + CONTROL_KEYWORD = "deny-replace" + CONTROL_RESULT = AdditionControlResult.PKG_DENY_REPLACE + + +class PackageAdditionControlRevbumpOnCollisionAction ( + PackageAdditionControlActionBase +): + CONTROL_KEYWORD = "revbump-on-collision" + CONTROL_RESULT = AdditionControlResult.PKG_REVBUMP_ON_COLLISION diff --git a/roverlay/packagerules/parser/context/action.py b/roverlay/packagerules/parser/context/action.py index bb1a001..063c901 100644 --- a/roverlay/packagerules/parser/context/action.py +++ b/roverlay/packagerules/parser/context/action.py @@ -8,6 +8,7 @@ import re import roverlay.strutil +import roverlay.packagerules.actions.addition_control import roverlay.packagerules.actions.dependencies import roverlay.packagerules.actions.evar import roverlay.packagerules.actions.info @@ -32,6 +33,14 @@ class ActionInvalid ( RuleActionException ): # --- end of ActionInvalid --- +def _create_action_map_v ( attr_name, action_classes ): + return { + getattr ( cls, attr_name ): cls + for cls in action_classes + } +# --- end of _create_action_map_v (...) --- + + class RuleActionContext ( roverlay.packagerules.parser.context.base.BaseContext ): @@ -48,6 +57,21 @@ class RuleActionContext ( }) + # base keyword(s) for addition-control actions (set) + KEYWORDS_ADDITION_CONTROL = frozenset ({ + roverlay.packagerules.actions.addition_control.PackageAdditionControlActionBase.KEYWORD, + }) + + # dict ( <key> => <addition-control action> ) + ADDITION_CONTROL_MAP = _create_action_map_v ( + 'CONTROL_KEYWORD', + [ + getattr ( roverlay.packagerules.actions.addition_control, k ) + for k in roverlay.packagerules.actions.addition_control.ACTIONS + ] + ) + + # dict ( <keyword> => <evar class> ) # Dict of evar action keywords (with corresponding classes) # @@ -311,7 +335,20 @@ class RuleActionContext ( return True # else disabled + elif keyword in self.KEYWORDS_ADDITION_CONTROL: + if not argstr: + raise ActionNeedsValue ( orig_str ) + + elif argstr not in self.ADDITION_CONTROL_MAP: + raise ActionInvalid ( orig_str ) + + else: + self._add_action ( + self.ADDITION_CONTROL_MAP [argstr] ( lino ) + ) + return True # -- end if + return False # --- end of _add_as_keyworded_action (...) --- |