[PATCH 6/9] Remove the loop from checkSoftwareSelection.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Just try once to resolve dependencies. Callers can catch the
DependencyError and present UI as needed to amend the software
set or repos and then try again.

This also changes spaceRequired. After successfully resolving
dependencies we explicitly trigger calculation of the required
space. Less magic to run amuck, more reliable results.
---
 pyanaconda/packaging/yumpayload.py |   85 ++++++++++++++----------------------
 1 files changed, 33 insertions(+), 52 deletions(-)

diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index 0d02c2a..0c7d028 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -68,8 +68,6 @@ from pyanaconda.image import opticalInstallMedia
 from pyanaconda.image import mountImage
 from pyanaconda.image import findFirstIsoImage
 
-from pyanaconda.storage.size import Size
-
 import gettext
 _ = lambda x: gettext.ldgettext("anaconda", x)
 
@@ -111,6 +109,8 @@ class YumPayload(PackagePayload):
 
     def reset(self, root=None):
         """ Reset this instance to its initial (unconfigured) state. """
+        from pyanaconda.storage.size import Size
+
         if os.path.ismount(INSTALL_TREE) and not flags.testing:
             isys.umount(INSTALL_TREE)
 
@@ -125,7 +125,7 @@ class YumPayload(PackagePayload):
 
         self.install_device = None
 
-        self._space_required = None
+        self._space_required = Size(bytes=0)
 
         self._groups = []
         self._packages = []
@@ -645,6 +645,7 @@ reposdir=%s
                 try:
                     self._groups = self._yum.comps
                 except (RepoError, GroupsError) as e:
+                    log.error("failed to get group info: %s" % e)
                     raise MetadataError(e.value)
 
             return [g.groupid for g in self._groups.get_groups()]
@@ -675,8 +676,6 @@ reposdir=%s
             except yum.Errors.GroupsError:
                 raise NoSuchGroup(groupid)
 
-        self._space_required = None
-
     def _deselectYumGroup(self, groupid):
         # deselect the group in comps
         log.debug("deselect group %s" % groupid)
@@ -686,8 +685,6 @@ reposdir=%s
             except yum.Errors.GroupsError:
                 raise NoSuchGroup(groupid)
 
-        self._space_required = None
-
     ###
     ### METHODS FOR WORKING WITH PACKAGES
     ###
@@ -720,8 +717,6 @@ reposdir=%s
             except yum.Errors.InstallError:
                 raise NoSuchPackage(pkgid)
 
-        self._space_required = None
-
     def _deselectYumPackage(self, pkgid):
         """Mark a package to be excluded from installation.
 
@@ -732,23 +727,25 @@ reposdir=%s
         with _yum_lock:
             self._yum.tsInfo.deselect(pkgid)
 
-        self._space_required = None
-
     ###
     ### METHODS FOR QUERYING STATE
     ###
     @property
     def spaceRequired(self):
         """ The total disk space (Size) required for the current selection. """
+        return self._space_required
+
+    def calculateSpaceNeeds(self):
+        from pyanaconda.storage.size import Size
+
         # XXX this will only be useful if you've run checkSoftwareSelection
-        if not self._space_required:
-            total = 0
-            with _yum_lock:
-                for txmbr in self._yum.tsInfo.getMembers():
-                    total += getattr(txmbr.po, "installedsize", 0)
+        total = 0
+        with _yum_lock:
+            for txmbr in self._yum.tsInfo.getMembers():
+                total += getattr(txmbr.po, "installedsize", 0)
 
-            total += total * 0.10   # add 10% to account for metadata, &c
-            self._space_required = Size(bytes=total)
+        total += total * 0.10   # add 10% to account for metadata, &c
+        self._space_required = Size(bytes=total)
 
         return self._space_required
 
@@ -807,42 +804,28 @@ reposdir=%s
             # select packages needed for storage, bootloader
 
             # check dependencies
-            # XXX FIXME: set self._yum.dsCallback before entering this loop?
-            while True:
-                log.info("checking dependencies")
-                (code, msgs) = self._yum.buildTransaction(unfinished_transactions_check=False)
-                if code == 0:
-                    # empty transaction?
-                    log.debug("empty transaction")
-                    break
-                elif code == 2:
-                    # success
-                    log.debug("success")
-                    break
-                elif self.data.packages.handleMissing == KS_MISSING_IGNORE:
-                    log.debug("ignoring missing due to ks config")
-                    break
-                elif self.data.upgrade.upgrade:
-                    log.debug("ignoring unresolved deps on upgrade")
-                    break
-
+            log.info("checking dependencies")
+            (code, msgs) = self._yum.buildTransaction(unfinished_transactions_check=False)
+            self._removeTxSaveFile()
+            if code == 0:
+                # empty transaction?
+                log.debug("empty transaction")
+            elif code == 2:
+                # success
+                log.debug("success")
+            elif self.data.packages.handleMissing == KS_MISSING_IGNORE:
+                log.debug("ignoring missing due to ks config")
+            elif self.data.upgrade.upgrade:
+                log.debug("ignoring unresolved deps on upgrade")
+            else:
                 for msg in msgs:
                     log.warning(msg)
 
-                exn = DependencyError(msgs)
-                rc = errorHandler.cb(exn)
-                if rc == ERROR_RAISE:
-                    raise exn
-                elif rc == ERROR_RETRY:
-                    # FIXME: figure out how to allow modification of software set
-                    self._yum._undoDepInstalls()
-                    return False
-                elif rc == ERROR_CONTINUE:
-                    break
+                raise DependencyError(msgs)
 
-            # check free space (?)
-
-            self._removeTxSaveFile()
+        self.calculateSpaceNeeds()
+        log.info("%d packages selected totalling %s"
+                 % (len(self._yum.tsInfo.getMembers()), self.spaceRequired))
 
     def selectKernelPackage(self):
         kernels = self.kernelPackages
@@ -879,8 +862,6 @@ reposdir=%s
 
         self._writeInstallConfig()
         self.checkSoftwareSelection()
-        log.info("about to install %d packages totalling %s"
-                 % (len(self._yum.tsInfo.getMembers()), self.spaceRequired))
 
         # doPreInstall
         # create mountpoints for protected device mountpoints (?)
-- 
1.7.7.6

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux