aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndré Erdmann <dywi@mailerd.de>2014-07-14 16:26:16 +0200
committerAndré Erdmann <dywi@mailerd.de>2014-07-14 16:26:16 +0200
commit88c02f7ff1141ba8903d671e32b363720337e9ea (patch)
tree15cddbc60de1d3a9bd15b0cced7db8475cf3f6e4
parentroverlay/packagerules/: match category name (diff)
downloadR_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.py85
-rw-r--r--roverlay/packagerules/parser/context/action.py37
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 (...) ---