[PATCH2] Make progress screen in text mode standalone spoke instead of hub
Vratislav Podzimek
vpodzime at redhat.com
Tue Sep 17 09:38:49 UTC 2013
The progress screen in text mode is not a hub. It cannot provide any spokes
because it prints a lot of text to the output and spokes would be rolled off in
a moment. It should be a standalone spoke which also fixes the issue with it not
being scheduled because of no spokes to be provided.
Resolves: rhbz#1008788
Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
---
pyanaconda/ui/tui/hubs/progress.py | 131 --------------------------------
pyanaconda/ui/tui/spokes/progress.py | 140 +++++++++++++++++++++++++++++++++++
2 files changed, 140 insertions(+), 131 deletions(-)
delete mode 100644 pyanaconda/ui/tui/hubs/progress.py
create mode 100644 pyanaconda/ui/tui/spokes/progress.py
diff --git a/pyanaconda/ui/tui/hubs/progress.py b/pyanaconda/ui/tui/hubs/progress.py
deleted file mode 100644
index 82ad263..0000000
--- a/pyanaconda/ui/tui/hubs/progress.py
+++ /dev/null
@@ -1,131 +0,0 @@
-# Text progress hub classes
-#
-# Copyright (C) 2012 Red Hat, Inc.
-#
-# This copyrighted material is made available to anyone wishing to use,
-# modify, copy, or redistribute it subject to the terms and conditions of
-# the GNU General Public License v.2, or (at your option) any later version.
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY expressed or implied, including the implied warranties of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details. You should have received a copy of the
-# GNU General Public License along with this program; if not, write to the
-# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
-# source code or documentation are not subject to the GNU General Public
-# License and may only be used or replicated with the express permission of
-# Red Hat, Inc.
-#
-# Red Hat Author(s): Jesse Keating <jkeating at redhat.com>
-#
-
-import sys
-
-from pyanaconda.flags import flags
-from pyanaconda.i18n import _
-from pyanaconda.constants import THREAD_INSTALL, THREAD_CONFIGURATION
-from pykickstart.constants import KS_SHUTDOWN, KS_REBOOT
-
-from pyanaconda.ui.tui.hubs import TUIHub
-from pyanaconda.ui.tui.simpleline.base import ExitAllMainLoops
-
-__all__ = ["ProgressHub"]
-
-class ProgressHub(TUIHub):
- title = _("Progress")
-
- def __init__(self, app, ksdata, storage, payload, instclass):
- TUIHub.__init__(self, app, ksdata, storage, payload, instclass)
- self._stepped = False
-
- def _update_progress(self):
- """Handle progress updates from install thread."""
-
- from pyanaconda.progress import progressQ
- import Queue
-
- q = progressQ.q
-
- # Grab all messages may have appeared since last time this method ran.
- while True:
- # Attempt to get a message out of the queue for how we should update
- # the progress bar. If there's no message, don't error out.
- # Also flush the communication Queue at least once a second and
- # process it's events so we can react to async evens (like a thread
- # throwing an exception)
- while True:
- try:
- (code, args) = q.get(timeout = 1)
- break
- except Queue.Empty:
- pass
- finally:
- self.app.process_events()
-
- if code == progressQ.PROGRESS_CODE_INIT:
- # Text mode doesn't have a finite progress bar
- pass
- elif code == progressQ.PROGRESS_CODE_STEP:
- # Instead of updating a progress bar, we just print a pip
- # but print it without a new line.
- sys.stdout.write('.')
- sys.stdout.flush()
- # Use _stepped as an indication to if we need a newline before
- # the next message
- self._stepped = True
- elif code == progressQ.PROGRESS_CODE_MESSAGE:
- # This should already be translated
- if self._stepped:
- # Get a new line in case we've done a step before
- self._stepped = False
- print('')
- print(args[0])
- elif code == progressQ.PROGRESS_CODE_COMPLETE:
- # There shouldn't be any more progress updates, so return
- q.task_done()
-
-
- if self._stepped:
- print('')
- return True
- elif code == progressQ.PROGRESS_CODE_QUIT:
- sys.exit(args[0])
-
- q.task_done()
- return True
-
- def refresh(self, args = None):
- from pyanaconda.install import doInstall, doConfiguration
- from pyanaconda.threads import threadMgr, AnacondaThread
-
- # We print this here because we don't really use the window object
- print(self.title)
-
- threadMgr.add(AnacondaThread(name=THREAD_INSTALL, target=doInstall,
- args=(self.storage, self.payload, self.data,
- self.instclass)))
-
- # This will run until we're all done with the install thread.
- self._update_progress()
-
- threadMgr.add(AnacondaThread(name=THREAD_CONFIGURATION, target=doConfiguration,
- args=(self.storage, self.payload, self.data,
- self.instclass)))
-
- # This will run until we're all done with the configuration thread.
- self._update_progress()
-
- # kickstart install, continue automatically if reboot or shutdown selected
- if flags.automatedInstall and self.data.reboot.action in [KS_REBOOT, KS_SHUTDOWN]:
- # Just pretend like we got input, and our input doesn't care
- # what it gets, it just quits.
- self.input(None, None)
-
- return True
-
- def prompt(self, args = None):
- return(_("\tInstallation complete. Press return to quit"))
-
- def input(self, args, key):
- # There is nothing to do here, just raise to exit the hub
- raise ExitAllMainLoops()
diff --git a/pyanaconda/ui/tui/spokes/progress.py b/pyanaconda/ui/tui/spokes/progress.py
new file mode 100644
index 0000000..44adb43
--- /dev/null
+++ b/pyanaconda/ui/tui/spokes/progress.py
@@ -0,0 +1,140 @@
+# Text progress hub classes
+#
+# Copyright (C) 2012 Red Hat, Inc.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions of
+# the GNU General Public License v.2, or (at your option) any later version.
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY expressed or implied, including the implied warranties of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details. You should have received a copy of the
+# GNU General Public License along with this program; if not, write to the
+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
+# source code or documentation are not subject to the GNU General Public
+# License and may only be used or replicated with the express permission of
+# Red Hat, Inc.
+#
+# Red Hat Author(s): Jesse Keating <jkeating at redhat.com>
+#
+
+import sys
+
+from pyanaconda.flags import flags
+from pyanaconda.i18n import _
+from pyanaconda.constants import THREAD_INSTALL, THREAD_CONFIGURATION
+from pykickstart.constants import KS_SHUTDOWN, KS_REBOOT
+
+from pyanaconda.ui.tui.spokes import StandaloneTUISpoke
+from pyanaconda.ui.tui.hubs.summary import SummaryHub
+from pyanaconda.ui.tui.simpleline.base import ExitAllMainLoops
+
+__all__ = ["ProgressSpoke"]
+
+class ProgressSpoke(StandaloneTUISpoke):
+ title = _("Progress")
+
+ postForHub = SummaryHub
+ priority = 0
+
+ def __init__(self, app, ksdata, storage, payload, instclass):
+ StandaloneTUISpoke.__init__(self, app, ksdata, storage, payload, instclass)
+ self._stepped = False
+
+ @property
+ def completed(self):
+ # this spoke is never completed, initially
+ return False
+
+ def _update_progress(self):
+ """Handle progress updates from install thread."""
+
+ from pyanaconda.progress import progressQ
+ import Queue
+
+ q = progressQ.q
+
+ # Grab all messages may have appeared since last time this method ran.
+ while True:
+ # Attempt to get a message out of the queue for how we should update
+ # the progress bar. If there's no message, don't error out.
+ # Also flush the communication Queue at least once a second and
+ # process it's events so we can react to async evens (like a thread
+ # throwing an exception)
+ while True:
+ try:
+ (code, args) = q.get(timeout = 1)
+ break
+ except Queue.Empty:
+ pass
+ finally:
+ self.app.process_events()
+
+ if code == progressQ.PROGRESS_CODE_INIT:
+ # Text mode doesn't have a finite progress bar
+ pass
+ elif code == progressQ.PROGRESS_CODE_STEP:
+ # Instead of updating a progress bar, we just print a pip
+ # but print it without a new line.
+ sys.stdout.write('.')
+ sys.stdout.flush()
+ # Use _stepped as an indication to if we need a newline before
+ # the next message
+ self._stepped = True
+ elif code == progressQ.PROGRESS_CODE_MESSAGE:
+ # This should already be translated
+ if self._stepped:
+ # Get a new line in case we've done a step before
+ self._stepped = False
+ print('')
+ print(args[0])
+ elif code == progressQ.PROGRESS_CODE_COMPLETE:
+ # There shouldn't be any more progress updates, so return
+ q.task_done()
+
+
+ if self._stepped:
+ print('')
+ return True
+ elif code == progressQ.PROGRESS_CODE_QUIT:
+ sys.exit(args[0])
+
+ q.task_done()
+ return True
+
+ def refresh(self, args = None):
+ from pyanaconda.install import doInstall, doConfiguration
+ from pyanaconda.threads import threadMgr, AnacondaThread
+
+ # We print this here because we don't really use the window object
+ print(self.title)
+
+ threadMgr.add(AnacondaThread(name=THREAD_INSTALL, target=doInstall,
+ args=(self.storage, self.payload, self.data,
+ self.instclass)))
+
+ # This will run until we're all done with the install thread.
+ self._update_progress()
+
+ threadMgr.add(AnacondaThread(name=THREAD_CONFIGURATION, target=doConfiguration,
+ args=(self.storage, self.payload, self.data,
+ self.instclass)))
+
+ # This will run until we're all done with the configuration thread.
+ self._update_progress()
+
+ # kickstart install, continue automatically if reboot or shutdown selected
+ if flags.automatedInstall and self.data.reboot.action in [KS_REBOOT, KS_SHUTDOWN]:
+ # Just pretend like we got input, and our input doesn't care
+ # what it gets, it just quits.
+ self.input(None, None)
+
+ return True
+
+ def prompt(self, args = None):
+ return(_("\tInstallation complete. Press return to quit"))
+
+ def input(self, args, key):
+ # There is nothing to do here, just raise to exit the spoke
+ raise ExitAllMainLoops()
--
1.7.11.7
More information about the anaconda-patches
mailing list