[PATCH] Allow AddonData classes to parse options in the %addon line

David Shea dshea at redhat.com
Thu Feb 13 23:30:19 UTC 2014


This adds a function AddonData.handle_header. The AddonSection parser
will ignore any extra arguments to %addon when extracting the addon ID,
and it will pass the remaining arguments to AddonData.handle_header.
AddonData.handle_header will fail on extra arguments if not overridden
in a subclass.
---
 pyanaconda/addons.py | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/pyanaconda/addons.py b/pyanaconda/addons.py
index 8202a1d..3b658d5 100644
--- a/pyanaconda/addons.py
+++ b/pyanaconda/addons.py
@@ -23,7 +23,8 @@ __all__ = ["AddonSection", "AddonRegistry", "AddonData", "collect_addon_paths"]
 
 import os
 from pykickstart.sections import Section
-from pykickstart.options import KSOptionParser
+from pykickstart.errors import KickstartParseError, formatErrorMsg
+from pyanaconda.i18n import _
 
 def collect_addon_paths(toplevel_addon_paths, ui_subdir="gui"):
     """This method looks into the directories present
@@ -129,6 +130,27 @@ class AddonData(object):
         """
         pass
 
+    def handle_header(self, lineno, args):
+        """Process additional arguments to the %addon line.
+
+           This function receives any arguments on the %addon line after the
+           addon ID. For example, for the line:
+
+               %addon com_example_foo --argument='example'
+
+           This function would be called with args=["--argument='example'"].
+
+           By default AddonData.handle_header will fail if passed any arguments,
+           so addon sections that take arguments must override this method.
+        """
+
+        if args:
+            msg = _("Unhandled arguments on %%addon line for %s") % self.name
+            if lineno != None:
+                raise KickstartParseError(formatErrorMsg(lineno, msg=msg))
+            else:
+                raise KickstartParseError(msg)
+
     def handle_line(self, line):
         """Process one kickstart line."""
         self.content += line
@@ -160,14 +182,16 @@ class AddonSection(Section):
     def handleHeader(self, lineno, args):
         """Process the arguments to the %addon header."""
         Section.handleHeader(self, lineno, args)
-        op = KSOptionParser(version=self.version)
-        (_opts, extra) = op.parse_args(args=args[1:], lineno=lineno)
-        self.addon_id = extra[0]
+        self.addon_id = args[1]
 
         # if the addon is not registered, create dummy placeholder for it
         if self.addon_id and not hasattr(self.handler.addons, self.addon_id):
             setattr(self.handler.addons, self.addon_id, AddonData(self.addon_id))
 
+        # Parse additional arguments to %addon to the AddonData handler
+        addon = getattr(self.handler.addons, self.addon_id)
+        addon.handle_header(lineno, args[2:])
+
     def finalize(self):
         """Let addon know no additional data will come."""
         Section.finalize(self)
-- 
1.8.5.3



More information about the anaconda-patches mailing list