[PATCH 2/2] Handle human readable environment names from kickstart (#1234890)

Martin Kolman mkolman at redhat.com
Fri Jun 26 13:31:08 UTC 2015


Correctly support human readable & localized human readable
environment specifications from kickstart, not just the
"machine readable" environment id.

Also keep the specification in its original format as long as it is
valid, so that the input and output kickstarts have the same
environment specifications.

Related: rhbz#1234890
Signed-off-by: Martin Kolman <mkolman at redhat.com>
---
 pyanaconda/packaging/yumpayload.py   | 14 ++++++++++++
 pyanaconda/ui/gui/spokes/software.py | 43 +++++++++++++++++++++++++++---------
 2 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index ee9a059..11e4f3b 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -1006,6 +1006,20 @@ reposdir=%s
 
             return (environment.ui_name, environment.ui_description)
 
+    def environmentId(self, environmentid):
+        """ Return environment id for the environment specified by id or name."""
+        groups = self._yumGroups
+        if not groups:
+            return environmentid
+
+        with _yum_lock:
+            if not groups.has_environment(environmentid):
+                raise NoSuchGroup(environmentid)
+
+            environment = groups.return_environment(environmentid)
+
+            return environment.environmentid
+
     def selectEnvironment(self, environmentid):
         groups = self._yumGroups
         if not groups:
diff --git a/pyanaconda/ui/gui/spokes/software.py b/pyanaconda/ui/gui/spokes/software.py
index 4801643..a32c4f7 100644
--- a/pyanaconda/ui/gui/spokes/software.py
+++ b/pyanaconda/ui/gui/spokes/software.py
@@ -23,7 +23,7 @@ from gi.repository import Gtk, Pango
 
 from pyanaconda.flags import flags
 from pyanaconda.i18n import _, C_, CN_
-from pyanaconda.packaging import PackagePayload, payloadMgr
+from pyanaconda.packaging import PackagePayload, payloadMgr, NoSuchGroup
 from pyanaconda.threads import threadMgr, AnacondaThread
 from pyanaconda import constants, iutil
 
@@ -109,6 +109,24 @@ class SoftwareSelectionSpoke(NormalSpoke):
         self.data.packages.environment = value
 
     @property
+    def environmentid(self):
+        """Return the "machine readable" environment id
+
+        Alternatively we could have just "canonicalized" the
+        environment description to the "machine readable" format
+        when reading it from kickstart for the first time.
+        But this could result in input and output kickstart,
+        which would be rather confusing for the user.
+        So we don't touch the specification from kickstart
+        if it is valid and use this property when we need
+        the "machine readable" form.
+        """
+        try:
+            return self.payload.environmentId(self.environment)
+        except NoSuchGroup:
+            return None
+
+    @property
     def environment_valid(self):
         """Return if the currently set environment is valid
         (represents an environment known by the payload)
@@ -120,7 +138,12 @@ class SoftwareSelectionSpoke(NormalSpoke):
         if self.environment is None:
             return True
         else:
-            return self.environment in self.payload.environments
+            try:
+                # check if the given environment name or id has a description,
+                # as a test of environment specification validity
+                return bool(self.payload.environmentDescription(self.environment))
+            except NoSuchGroup:
+                return False
 
     def _payload_finished(self):
         if self.environment_valid:
@@ -310,7 +333,7 @@ class SoftwareSelectionSpoke(NormalSpoke):
 
         threadMgr.wait(constants.THREAD_PAYLOAD)
 
-        if self.environment not in self.payload.environments:
+        if self.environmentid not in self.payload.environments:
             self.environment = None
 
         firstEnvironment = True
@@ -369,7 +392,7 @@ class SoftwareSelectionSpoke(NormalSpoke):
         self._add_row(self._addonListBox, name, desc, check, self.on_checkbox_toggled)
 
     def refreshAddons(self):
-        if self.environment and (self.environment in self.payload.environmentAddons):
+        if self.environment and (self.environmentid in self.payload.environmentAddons):
             self._clear_listbox(self._addonListBox)
 
             # We have two lists:  One of addons specific to this environment,
@@ -382,10 +405,10 @@ class SoftwareSelectionSpoke(NormalSpoke):
             # state will be used. Otherwise, the add-on will be selected if it is a default
             # for this environment.
 
-            addSep = len(self.payload.environmentAddons[self.environment][0]) > 0 and \
-                     len(self.payload.environmentAddons[self.environment][1]) > 0
+            addSep = len(self.payload.environmentAddons[self.environmentid][0]) > 0 and \
+                     len(self.payload.environmentAddons[self.environmentid][1]) > 0
 
-            for grp in self.payload.environmentAddons[self.environment][0]:
+            for grp in self.payload.environmentAddons[self.environmentid][0]:
                 self._addAddon(grp)
 
             # This marks a separator in the view - only add it if there's both environment
@@ -393,7 +416,7 @@ class SoftwareSelectionSpoke(NormalSpoke):
             if addSep:
                 self._addonListBox.insert(Gtk.Separator(), -1)
 
-            for grp in self.payload.environmentAddons[self.environment][1]:
+            for grp in self.payload.environmentAddons[self.environmentid][1]:
                 self._addAddon(grp)
 
         self._selectFlag = True
@@ -404,9 +427,9 @@ class SoftwareSelectionSpoke(NormalSpoke):
             self.clear_info()
 
     def _allAddons(self):
-        return self.payload.environmentAddons[self.environment][0] + \
+        return self.payload.environmentAddons[self.environmentid][0] + \
                [""] + \
-               self.payload.environmentAddons[self.environment][1]
+               self.payload.environmentAddons[self.environmentid][1]
 
     def _get_selected_addons(self):
         retval = []
-- 
2.4.3



More information about the anaconda-patches mailing list