[anaconda][rhel7-branch][PATCH] Add support for autostep and --autoscreenshot (#1234896)
Martin Kolman
mkolman at redhat.com
Tue Jul 28 14:40:17 UTC 2015
On Tue, 2015-07-28 at 10:14 +0200, Jiří Konečný wrote:
> On Mon, 2015-07-27 at 18:55 +0200, Martin Kolman wrote:
> > diff --git a/pyanaconda/iutil.py b/pyanaconda/iutil.py
> > index c827431..9136406 100644
> > --- a/pyanaconda/iutil.py
> > +++ b/pyanaconda/iutil.py
> > @@ -27,6 +27,7 @@ import os.path
> > import errno
> > import subprocess
> > import unicodedata
> > +import shutil
> > import string
> > import tempfile
> > import types
> > @@ -36,6 +37,7 @@ import signal
> >
> > from pyanaconda.flags import flags
> > from pyanaconda.constants import DRACUT_SHUTDOWN_EJECT,
> > TRANSLATIONS_UPDATE_DIR, UNSUPPORTED_HW
> > +from pyanaconda.constants import SCREENSHOTS_DIRECTORY,
> > SCREENSHOTS_TARGET_DIRECTORY
> > from pyanaconda.regexes import URL_PARSE
> >
> > from pyanaconda.i18n import _
> > @@ -1191,3 +1193,28 @@ def get_platform_groupid():
> > def parent_dir(directory):
> > """Return the parent's path"""
> > return "/".join(os.path.normpath(directory).split("/")[:-1])
> > +
> > +def sysroot_path(path):
> > + """Make the given relative or absolute path "sysrooted"
> > + :param str path: path to be sysrooted
> > + :returns: sysrooted path
> > + :rtype: str
> > + """
> > + return os.path.join(getSysroot(), path.lstrip(os.path.sep))
> > +
> > +def save_screenshots():
> > + """Save screenshots to the installed system"""
> > + if not os.path.exists(SCREENSHOTS_DIRECTORY):
> > + # there are no screenshots to copy
> > + return
> > + target_path = sysroot_path(SCREENSHOTS_TARGET_DIRECTORY)
> > + log.info("saving screenshots taken during the installation to:
> >
> > %s" % target_path)
>
> I think you should use ',' instead of '%'. So this way:
>
> log.info("... installation to: %s", target_path)
Yep, that's certainly wrong, thanks for spotting this. :-)
>
> > + try:
> > + # create the screenshots directory
> > + mkdirChain(target_path)
> > + # copy all screenshots
> > + for filename in os.listdir(SCREENSHOTS_DIRECTORY):
> > + shutil.copy(os.path.join(SCREENSHOTS_DIRECTORY,
> > filename), target_path)
> > +
> > + except OSError:
> > + log.exception("saving screenshots to installed system
> > failed")
> .
> .
> .
> > > diff --git a/pyanaconda/ui/gui/__init__.py
> > > b/pyanaconda/ui/gui/__init__.py
> > index 9251949..8ffc723 100644
> > from pyanaconda.ui import common
> > from pyanaconda.ui.gui import GUIObject
> > -from pyanaconda.ui.gui.utils import gtk_call_once, escape_markup
> > +from pyanaconda.ui.gui.utils import gtk_call_once,
> > fire_gtk_action,
> > escape_markup
> >
> > import logging
> > log = logging.getLogger("anaconda")
> > @@ -54,6 +54,8 @@ class Hub(GUIObject, common.Hub):
> > additional standalone screens either before or after them.
> > """
> >
> > + handles_autostep = True
> > +
> > def __init__(self, data, storage, payload, instclass):
> > """Create a new Hub instance.
> >
> > @@ -91,6 +93,9 @@ class Hub(GUIObject, common.Hub):
> >
> > self._checker = None
> >
> > + self._spokesToStepIn = []
> > + self._spokeAutostepIndex = 0
> > +
> > def _createBox(self):
> > from gi.repository import Gtk, AnacondaWidgets
> > from pyanaconda.ui.gui.utils import setViewportBackground
> > @@ -353,6 +358,11 @@ class Hub(GUIObject, common.Hub):
> > def spoke_done(self, spoke):
> > spoke.visitedSinceApplied = True
> >
> > + # don't apply any actions if the spoke was visited
> > automatically
> > + if spoke.automaticEntry:
> > + spoke.automaticEntry = False
> > + return
> > +
> > # Don't take visitedSinceApplied into account here. It
> > will
> > always be
> > # True from the line above.
> > if spoke.changed and (not spoke.skipTo or (spoke.skipTo
> > and
> > spoke.applyOnSkip)):
> > @@ -384,3 +394,37 @@ class Hub(GUIObject, common.Hub):
> > else:
> > self.main_window.returnToHub()
> >
> > + def _doAutostep(self):
> > + """Autostep through all spokes managed by this hub"""
> > + log.info("autostepping through all spokes on hub %s",
> > self.__class__.__name__)
> > + # created a list of all spokes in reverse alphabetic
> > order,
> > we will pop() from it when
> > + # processing all the spokes so the screenshots will
> > actually
> > be in alphabetic order
> > + self._spokesToStepIn =
> > list(reversed(sorted(self._spokes.values(), key=lambda x:
> > x.__class__.__name__)))
> > + # we can't just loop over all the spokes due to the
> > asynchronous nature of GtkStack, so we start by
> > + # autostepping to the first spoke, this will trigger a
> > callback that steps to the next spoke,
> > + # until we run out of unvisited spokes
> > + self._autostepSpoke()
>
> Please make this readable by adding some blank lines here.
Sure!
>
> > +
> > + def _autostepSpoke(self):
> > + if self._spokesToStepIn:
> > + spoke = self._spokesToStepIn.pop()
> > + self._spokeAutostepIndex += 1
> > + log.debug("stepping to spoke %s (%d/%d)",
> > spoke.__class__.__name__, self._spokeAutostepIndex,
> > len(self._spokes))
> > + spoke.automaticEntry = True
> > + spoke.autostepDoneCallback = lambda x:
> > self._autostepSpoke()
> > + # this is the last spoke, tell it to return to hub
> > once
> > the screenshot is taken
> > + if self._spokesToStepIn == []:
> > + spoke.lastAutostepSpoke = True
> > + #fire_gtk_action(self._on_spoke_clicked, None, None,
> > spoke)
> > + fire_gtk_action(self._on_spoke_clicked, None, None,
> > spoke)
> > + else:
> > + log.info("autostep for hub %s finished",
> > self.__class__.__name__)
> > + gtk_call_once(self._doPostAutostep)
>
> Same as before some blank lines please.
Yep!
>
> > +
> > + def _doPostAutostep(self):
> > + if self._spokesToStepIn:
> > + # there are still spokes that need to be stepped in
> > + return
> > + # we are done, re-emit the continue clicked signal we
> > "consumed" previously
> > + # so that the Anaconda GUI can switch to the next screen
> > (or
> > quit)
> > + self.window.emit("continue-clicked")
>
> Except the three above everything looks good to me.
> _______________________________________________
> anaconda-patches mailing list
> anaconda-patches at lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
More information about the anaconda-patches
mailing list