Linux Archive

Linux Archive (http://www.linux-archive.org/)
-   Gentoo User (http://www.linux-archive.org/gentoo-user/)
-   -   Tighten up interaction between source and software spokes. (http://www.linux-archive.org/gentoo-user/664899-tighten-up-interaction-between-source-software-spokes.html)

David Lehman 05-09-2012 08:43 PM

Tighten up interaction between source and software spokes.
 
The software spoke should only be ready when a valid source is
configured. Downloading of repo metadata happens in the background, as
does dependency checking.
---
pyanaconda/ui/gui/spokes/software.py | 33 ++++++++++++++++++++++++-
pyanaconda/ui/gui/spokes/source.py | 43 +++++++++++++++++++++++++++++----
2 files changed, 68 insertions(+), 8 deletions(-)

diff --git a/pyanaconda/ui/gui/spokes/software.py b/pyanaconda/ui/gui/spokes/software.py
index 16207fe..beb0a53 100644
--- a/pyanaconda/ui/gui/spokes/software.py
+++ b/pyanaconda/ui/gui/spokes/software.py
@@ -43,6 +43,7 @@ class SoftwareSelectionSpoke(NormalSpoke):
def __init__(self, *args, **kwargs):
NormalSpoke.__init__(self, *args, **kwargs)
self._ready = False
+ self._error = False

self.selectedGroups = []
self.excludedGroups = []
@@ -52,6 +53,8 @@ class SoftwareSelectionSpoke(NormalSpoke):
# NOTE: Other apply methods work directly with the ksdata, but this
# one does not. However, selectGroup/deselectGroup modifies ksdata as
# part of its operation. So this is fine.
+ from pyanaconda.threads import threadMgr, AnacondaThread
+
row = self._get_selected_desktop()
if not row:
return
@@ -69,9 +72,30 @@ class SoftwareSelectionSpoke(NormalSpoke):
for group in [g for g in groups if g not in self.excludedGroups]:
self.payload.selectGroup(group)

+ communication.send_not_ready(self.__class__.__name __)
+ threadMgr.add(AnacondaThread(name="AnaCheckSoftwar eThread",
+ target=self.checkSoftwareSelection))
+
+ def checkSoftwareSelection(self):
+ from pyanaconda.packaging import DependencyError
+ communication.send_message(self.__class__.__name__ ,
+ _("Checking software dependencies..."))
+ try:
+ self.payload.checkSoftwareSelection()
+ except DependencyError as e:
+ self._error = True
+ communication.send_message(self.__class__.__name__ ,
+ _("Error checking software dependencies"))
+ else:
+ communication.send_ready(self.__class__.__name__)
+ self._error = False
+
@property
def completed(self):
- return self._get_selected_desktop() is not None
+ from pyanaconda.threads import threadMgr
+ return self._get_selected_desktop() is not None and
+ not threadMgr.get("AnaCheckSoftwareThread") and
+ not self._error

@property
def ready(self):
@@ -80,10 +104,15 @@ class SoftwareSelectionSpoke(NormalSpoke):
# becasue the user filled something out, or because we're done fetching
# repo metadata from the mirror list, or we detected a DVD/CD.
from pyanaconda.threads import threadMgr
- return self._ready and not threadMgr.get("AnaPayloadMDThread")
+ return (self._ready and not threadMgr.get("AnaPayloadMDThread") and
+ not threadMgr.get("AnaCheckSoftwareThread") and
+ self.payload.baseRepo is not None)

@property
def status(self):
+ if self._error:
+ return _("Error checking software selection")
+
row = self._get_selected_desktop()
if not row:
return _("Nothing selected")
diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py
index 8d59abe..2dd9cc1 100644
--- a/pyanaconda/ui/gui/spokes/source.py
+++ b/pyanaconda/ui/gui/spokes/source.py
@@ -37,6 +37,9 @@ __all__ = ["SourceSpoke"]

MOUNTPOINT = "/mnt/install/isodir"

+METADATA_DOWNLOAD_MESSAGE = _("Downloading package metadata...")
+METADATA_ERROR_MESSAGE = _("Error downloading package metadata...")
+
class ProxyDialog(UIObject):
builderObjects = ["proxyDialog"]
mainWidgetName = "proxyDialog"
@@ -240,9 +243,11 @@ class SourceSpoke(NormalSpoke):
NormalSpoke.__init__(self, *args, **kwargs)
self._currentIsoFile = None
self._ready = False
+ self._error = False

def apply(self):
from pyanaconda.threads import threadMgr, AnacondaThread
+ from pyanaconda.packaging import PayloadError

if self._autodetectButton.get_active():
dev = self._get_selected_media()
@@ -297,20 +302,44 @@ class SourceSpoke(NormalSpoke):
(self.data.method.server, self.data.method.dir) = url.split(":", 2)
self.data.method.opts = self.builder.get_object("nfsOptsEntry").get_text() or ""

- self.payload.updateBaseRepo(self.storage)
- threadMgr.add(AnacondaThread(name="AnaPayloadMDThr ead",
- target=self.payload.gatherRepoMetadata))
+ communication.send_not_ready("SoftwareSelectionSpo ke")
+ try:
+ self.payload.updateBaseRepo(self.storage, fallback=False)
+ except PayloadError as e:
+ self._error = True
+ communication.send_message(self.__class__.__name__ ,
+ _("Failed to set up install source"))
+ else:
+ self._error = False
+ threadMgr.add(AnacondaThread(name="AnaPayloadMDThr ead",
+ target=self.getRepoMetadata))
+
+ def getRepoMetadata(self):
+ communication.send_not_ready(self.__class__.__name __)
+ communication.send_message(self.__class__.__name__ ,
+ METADATA_DOWNLOAD_MESSAGE)
+ self.payload.gatherRepoMetadata()
+ self.payload.release()
+ if not self.payload.baseRepo:
+ communication.send_message(self.__class__.__name__ ,
+ METADATA_ERROR_MESSAGE)
+ communication.send_ready(self.__class__.__name__)
+ self._error = True
+ else:
+ communication.send_ready(self.__class__.__name__)
+ communication.send_ready("SoftwareSelectionSpoke")

@property
def completed(self):
- return self.status and self.status != _("Nothing selected")
+ return not self._error and self.status and self.status != _("Nothing selected")

@property
def ready(self):
+ from pyanaconda.threads import threadMgr
# By default, the source spoke is not ready. We have to wait until
# storageInitialize is done to know whether or not there's local
# devices potentially holding install media.
- return self._ready
+ return (self._ready and not threadMgr.get("AnaPayloadMDThread"))

@property
def status(self):
@@ -328,6 +357,8 @@ class SourceSpoke(NormalSpoke):
else:
if self.payload.baseRepo:
return _("Closest mirror")
+ elif self._error:
+ return _("Error setting up software source")
else:
return _("Nothing selected")

@@ -374,7 +405,7 @@ class SourceSpoke(NormalSpoke):
if storageThread:
storageThread.join()

- communication.send_message(self.__class__.__name__ , _("Downloading package metadata..."))
+ communication.send_message(self.__class__.__name__ , METADATA_DOWNLOAD_MESSAGE)

payloadThread = threadMgr.get("AnaPayloadThread")
if payloadThread:
--
1.7.7.6

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


All times are GMT. The time now is 01:12 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.