All the work lies in PATCH 1/2 and the comment is in its commit message.
Vratislav Podzimek (2): Refactor and cleanup exception handling pieces Cleanup some trailing whitespace on otherwise empty lines
pyanaconda/exception.py | 24 ++++++++--- pyanaconda/ui/__init__.py | 30 ++++++------- pyanaconda/ui/gui/__init__.py | 97 ++++++++++++++++++++++++++++--------------- pyanaconda/ui/tui/__init__.py | 23 +++++----- 4 files changed, 110 insertions(+), 64 deletions(-)
Before this patch our UserInterface classes somehow "implicitly" inherited python-meh's *Intf classes by providing two methods with right names. This patch adds a meh_interface property to our UserInterface classes that returns an instance of a class that really is inherited from the python-meh's *Intf class or actually is an instance of the python-meh's *Intf class in case of gui and tui respectively. It also adds a tty_num property to our *UserInterface classes that can be used in runDebug to get user to the right console before and after the pdb session automatically.
Signed-off-by: Vratislav Podzimek vpodzime@redhat.com --- pyanaconda/exception.py | 24 +++++++++---- pyanaconda/ui/__init__.py | 26 +++++++------- pyanaconda/ui/gui/__init__.py | 83 +++++++++++++++++++++++++++++-------------- pyanaconda/ui/tui/__init__.py | 19 +++++----- 4 files changed, 99 insertions(+), 53 deletions(-)
diff --git a/pyanaconda/exception.py b/pyanaconda/exception.py index 09f9837..2c852ae 100644 --- a/pyanaconda/exception.py +++ b/pyanaconda/exception.py @@ -43,6 +43,17 @@ _ = lambda x: gettext.ldgettext("anaconda", x)
class AnacondaExceptionHandler(ExceptionHandler): + + def __init__(self, confObj, intfClass, exnClass, tty_num): + """ + @see: python-meh's ExceptionHandler + @param tty_num: the number of tty the interface is running on + + """ + + ExceptionHandler.__init__(self, confObj, intfClass, exnClass) + self._intf_tty_num = tty_num + def handleException(self, (ty, value, tb), obj):
def run_handleException_on_idle(args_tuple): @@ -60,7 +71,7 @@ class AnacondaExceptionHandler(ExceptionHandler): super(AnacondaExceptionHandler, self).handleException((ty, value, tb), obj) return False - + if issubclass(ty, storage.errors.StorageError) and value.hardware_fault: hw_error_msg = _("The installation was stopped due to what " "seems to be a problem with your hardware. " @@ -105,9 +116,8 @@ class AnacondaExceptionHandler(ExceptionHandler): pass
def runDebug(self, (ty, value, tb)): - # vtActivate does not work on certain ppc64 machines, so just skip - # that and continue with the rest of the debugger setup. - iutil.vtActivate(1) + if self._intf_tty_num != 1: + iutil.vtActivate(1)
pidfl = "/tmp/vncshell.pid" if os.path.exists(pidfl) and os.path.isfile(pidfl): @@ -137,7 +147,8 @@ class AnacondaExceptionHandler(ExceptionHandler): import pdb pdb.post_mortem (tb)
- iutil.vtActivate(6) + if self._intf_tty_num != 1: + iutil.vtActivate(self._intf_tty_num)
def initExceptionHandling(anaconda): fileList = [ "/tmp/anaconda.log", "/tmp/packaging.log", @@ -164,7 +175,8 @@ def initExceptionHandling(anaconda): "payload._yum"], localSkipList=[ "passphrase", "password" ], fileList=fileList) - handler = AnacondaExceptionHandler(conf, anaconda.intf, ReverseExceptionDump) + handler = AnacondaExceptionHandler(conf, anaconda.intf.meh_interface, + ReverseExceptionDump, anaconda.intf.tty_num) handler.install(anaconda)
return conf diff --git a/pyanaconda/ui/__init__.py b/pyanaconda/ui/__init__.py index 9337a2a..d09e9b4 100644 --- a/pyanaconda/ui/__init__.py +++ b/pyanaconda/ui/__init__.py @@ -64,6 +64,11 @@ class UserInterface(object): basemask = "pyanaconda.ui" paths = PathDict({})
+ @property + def tty_num(self): + """Returns the number of tty the UserInterface is running on.""" + raise NotImplementedError + @classmethod def update_paths(cls, pathdict): """Receives pathdict and appends it's contents to the current @@ -85,6 +90,15 @@ class UserInterface(object): """ raise NotImplementedError
+ @property + def meh_interface(self): + """ + Returns an interface for exception handling (defined by python-meh's + AbstractIntf class). + + """ + raise NotImplementedError + ### ### MESSAGE HANDLING METHODS ### @@ -156,15 +170,3 @@ class UserInterface(object): key=lambda obj: obj.priority))
return actionClasses - - def mainExceptionWindow(self, text, exn_file): - """Return window with the exception and buttons for debugging, bug - reporting and exitting the installer. - - This method will be called only when unhandled exception appears. - """ - raise NotImplementedError - - def saveExceptionWindow(self, account_manager, signature): - """Show a window that provides a way to report a bug.""" - raise NotImplementedError diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py index a7c9ea7..73925e7 100644 --- a/pyanaconda/ui/gui/__init__.py +++ b/pyanaconda/ui/gui/__init__.py @@ -230,7 +230,9 @@ class GraphicalUserInterface(UserInterface): self._distributionText = distributionText self._isFinal = isFinal self._quitDialog = quitDialog - + self._mehInterface = GraphicalExceptionHandlingIface( + self.lightbox_over_current_action) + # This is a hack to make sure the AnacondaWidgets library gets loaded # before glade tries to use Anaconda types # glade file should contain the following line to make this seamless @@ -259,7 +261,15 @@ class GraphicalUserInterface(UserInterface): os.path.join(path, "hubs")) for path in pathlist] } - + + @property + def tty_num(self): + return 6 + + @property + def meh_interface(self): + return self._mehInterface + def _list_hubs(self): """Return a list of Hub classes to be imported to this interface""" from .hubs.summary import SummaryHub @@ -289,6 +299,20 @@ class GraphicalUserInterface(UserInterface): # Second, order them according to their relationship return self._orderActionClasses(standalones, hubs)
+ def lightbox_over_current_action(self, window): + """ + Creates lightbox over current action for the given window. Or + DOES NOTHING IF THERE ARE NO ACTIONS. + + """ + + from gi.repository import AnacondaWidgets + + # if there are no actions (not populated yet), we can do nothing + if len(self._actions) > 0: + lightbox = AnacondaWidgets.lb_show_over(self._currentAction.window) + window.main_window.set_transient_for(lightbox) + def _instantiateAction(self, actionClass): from spokes import StandaloneSpoke
@@ -399,30 +423,6 @@ class GraphicalUserInterface(UserInterface):
return bool(rc)
- - def mainExceptionWindow(self, text, exn_file, *args, **kwargs): - from gi.repository import Gtk, AnacondaWidgets - - meh_intf = meh.ui.gui.GraphicalIntf() - exc_window = meh_intf.mainExceptionWindow(text, exn_file) - exc_window.main_window.set_decorated(False) - - # exception may appear before self._actions gets populated - if len(self._actions) > 0: - lightbox = AnacondaWidgets.lb_show_over(self._currentAction.window) - exc_window.main_window.set_transient_for(lightbox) - - # without WindowGroup, python-meh's window is insensitive if it appears - # above a spoke (Gtk.Window running its own Gtk.main loop) - window_group = Gtk.WindowGroup() - window_group.add_window(exc_window.main_window) - - return exc_window - - def saveExceptionWindow(self, signature, *args, **kwargs): - meh_intf = meh.ui.gui.GraphicalIntf() - meh_intf.saveExceptionWindow(signature) - ### ### SIGNAL HANDLING METHODS ### @@ -493,7 +493,38 @@ class GraphicalUserInterface(UserInterface): if rc == 1: sys.exit(0)
+class GraphicalExceptionHandlingIface(meh.ui.gui.GraphicalIntf): + """ + Class inheriting from python-meh's GraphicalIntf and overriding methods + that need some modification in Anaconda. + + """ + + def __init__(self, lightbox_func): + """ + @param lightbox_func: a function that creates lightbox for a given + window + @type lightbox_func: GtkWindow -> None + + """ + + self._lightbox_func = lightbox_func
+ def mainExceptionWindow(self, text, exn_file, *args, **kwargs): + from gi.repository import Gtk + + meh_intf = meh.ui.gui.GraphicalIntf() + exc_window = meh_intf.mainExceptionWindow(text, exn_file) + exc_window.main_window.set_decorated(False) + + self._lightbox_func(exc_window) + + # without WindowGroup, python-meh's window is insensitive if it appears + # above a spoke (Gtk.Window running its own Gtk.main loop) + window_group = Gtk.WindowGroup() + window_group.add_window(exc_window.main_window) + + return exc_window
def busyCursor(): window = Gdk.get_default_root_window() diff --git a/pyanaconda/ui/tui/__init__.py b/pyanaconda/ui/tui/__init__.py index cebb6c4..64b9f7f 100644 --- a/pyanaconda/ui/tui/__init__.py +++ b/pyanaconda/ui/tui/__init__.py @@ -130,6 +130,7 @@ class TextUserInterface(ui.UserInterface):
ui.UserInterface.__init__(self, storage, payload, instclass) self._app = None + self._meh_interface = meh.ui.text.TextIntf()
basemask = "pyanaconda.ui.tui" basepath = os.path.dirname(__file__) @@ -146,7 +147,15 @@ class TextUserInterface(ui.UserInterface): os.path.join(path, "hubs")) for path in pathlist] } - + + @property + def tty_num(self): + return 1 + + @property + def meh_interface(self): + return self._meh_interface + def _list_hubs(self): """returns the list of hubs to use""" return [SummaryHub, ProgressHub] @@ -225,11 +234,3 @@ class TextUserInterface(ui.UserInterface): question_window = YesNoDialog(self._app, message) self._app.switch_screen_modal(question_window) return question_window.answer - - def mainExceptionWindow(self, text, exn_file, *args, **kwargs): - meh_intf = meh.ui.text.TextIntf() - return meh_intf.mainExceptionWindow(text, exn_file, *args, **kwargs) - - def saveExceptionWindow(self, signature, *args, **kwargs): - meh_intf = meh.ui.text.TextIntf() - return meh_intf.saveExceptionWindow(signature, *args, **kwargs)
Ack.
----- Original Message -----
Before this patch our UserInterface classes somehow "implicitly" inherited python-meh's *Intf classes by providing two methods with right names. This patch adds a meh_interface property to our UserInterface classes that returns an instance of a class that really is inherited from the python-meh's *Intf class or actually is an instance of the python-meh's *Intf class in case of gui and tui respectively. It also adds a tty_num property to our *UserInterface classes that can be used in runDebug to get user to the right console before and after the pdb session automatically.
Signed-off-by: Vratislav Podzimek vpodzime@redhat.com
pyanaconda/exception.py | 24 +++++++++---- pyanaconda/ui/__init__.py | 26 +++++++------- pyanaconda/ui/gui/__init__.py | 83 +++++++++++++++++++++++++++++-------------- pyanaconda/ui/tui/__init__.py | 19 +++++----- 4 files changed, 99 insertions(+), 53 deletions(-)
diff --git a/pyanaconda/exception.py b/pyanaconda/exception.py index 09f9837..2c852ae 100644 --- a/pyanaconda/exception.py +++ b/pyanaconda/exception.py @@ -43,6 +43,17 @@ _ = lambda x: gettext.ldgettext("anaconda", x)
class AnacondaExceptionHandler(ExceptionHandler):
- def __init__(self, confObj, intfClass, exnClass, tty_num):
"""
@see: python-meh's ExceptionHandler
@param tty_num: the number of tty the interface is running
on
"""
ExceptionHandler.__init__(self, confObj, intfClass,
exnClass)
self._intf_tty_num = tty_num
def handleException(self, (ty, value, tb), obj):
def run_handleException_on_idle(args_tuple):
@@ -60,7 +71,7 @@ class AnacondaExceptionHandler(ExceptionHandler): super(AnacondaExceptionHandler, self).handleException((ty, value, tb), obj) return False
if issubclass(ty, storage.errors.StorageError) and value.hardware_fault: hw_error_msg = _("The installation was stopped due to what " "seems to be a problem with your hardware. "
@@ -105,9 +116,8 @@ class AnacondaExceptionHandler(ExceptionHandler): pass
def runDebug(self, (ty, value, tb)):
# vtActivate does not work on certain ppc64 machines, so
just skip
# that and continue with the rest of the debugger setup.
iutil.vtActivate(1)
if self._intf_tty_num != 1:
iutil.vtActivate(1) pidfl = "/tmp/vncshell.pid" if os.path.exists(pidfl) and os.path.isfile(pidfl):
@@ -137,7 +147,8 @@ class AnacondaExceptionHandler(ExceptionHandler): import pdb pdb.post_mortem (tb)
iutil.vtActivate(6)
if self._intf_tty_num != 1:
iutil.vtActivate(self._intf_tty_num)
def initExceptionHandling(anaconda): fileList = [ "/tmp/anaconda.log", "/tmp/packaging.log", @@ -164,7 +175,8 @@ def initExceptionHandling(anaconda): "payload._yum"], localSkipList=[ "passphrase", "password" ], fileList=fileList)
- handler = AnacondaExceptionHandler(conf, anaconda.intf,
ReverseExceptionDump)
- handler = AnacondaExceptionHandler(conf,
anaconda.intf.meh_interface,
ReverseExceptionDump,
anaconda.intf.tty_num) handler.install(anaconda)
return conf
diff --git a/pyanaconda/ui/__init__.py b/pyanaconda/ui/__init__.py index 9337a2a..d09e9b4 100644 --- a/pyanaconda/ui/__init__.py +++ b/pyanaconda/ui/__init__.py @@ -64,6 +64,11 @@ class UserInterface(object): basemask = "pyanaconda.ui" paths = PathDict({})
- @property
- def tty_num(self):
"""Returns the number of tty the UserInterface is running
on."""
raise NotImplementedError
- @classmethod def update_paths(cls, pathdict): """Receives pathdict and appends it's contents to the current
@@ -85,6 +90,15 @@ class UserInterface(object): """ raise NotImplementedError
- @property
- def meh_interface(self):
"""
Returns an interface for exception handling (defined by
python-meh's
AbstractIntf class).
"""
raise NotImplementedError
- ### ### MESSAGE HANDLING METHODS ###
@@ -156,15 +170,3 @@ class UserInterface(object): key=lambda obj: obj.priority))
return actionClasses
- def mainExceptionWindow(self, text, exn_file):
"""Return window with the exception and buttons for
debugging, bug
reporting and exitting the installer.
This method will be called only when unhandled exception
appears.
"""
raise NotImplementedError
- def saveExceptionWindow(self, account_manager, signature):
"""Show a window that provides a way to report a bug."""
raise NotImplementedError
diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py index a7c9ea7..73925e7 100644 --- a/pyanaconda/ui/gui/__init__.py +++ b/pyanaconda/ui/gui/__init__.py @@ -230,7 +230,9 @@ class GraphicalUserInterface(UserInterface): self._distributionText = distributionText self._isFinal = isFinal self._quitDialog = quitDialog
self._mehInterface = GraphicalExceptionHandlingIface(
self.lightbox_over_current_action)
# This is a hack to make sure the AnacondaWidgets library gets loaded # before glade tries to use Anaconda types # glade file should contain the following line to make this seamless
@@ -259,7 +261,15 @@ class GraphicalUserInterface(UserInterface): os.path.join(path, "hubs")) for path in pathlist] }
- @property
- def tty_num(self):
return 6
- @property
- def meh_interface(self):
return self._mehInterface
- def _list_hubs(self): """Return a list of Hub classes to be imported to this interface""" from .hubs.summary import SummaryHub
@@ -289,6 +299,20 @@ class GraphicalUserInterface(UserInterface): # Second, order them according to their relationship return self._orderActionClasses(standalones, hubs)
- def lightbox_over_current_action(self, window):
"""
Creates lightbox over current action for the given window.
Or
DOES NOTHING IF THERE ARE NO ACTIONS.
"""
from gi.repository import AnacondaWidgets
# if there are no actions (not populated yet), we can do
nothing
if len(self._actions) > 0:
lightbox =
AnacondaWidgets.lb_show_over(self._currentAction.window)
window.main_window.set_transient_for(lightbox)
- def _instantiateAction(self, actionClass): from spokes import StandaloneSpoke
@@ -399,30 +423,6 @@ class GraphicalUserInterface(UserInterface):
return bool(rc)
- def mainExceptionWindow(self, text, exn_file, *args, **kwargs):
from gi.repository import Gtk, AnacondaWidgets
meh_intf = meh.ui.gui.GraphicalIntf()
exc_window = meh_intf.mainExceptionWindow(text, exn_file)
exc_window.main_window.set_decorated(False)
# exception may appear before self._actions gets populated
if len(self._actions) > 0:
lightbox =
AnacondaWidgets.lb_show_over(self._currentAction.window)
exc_window.main_window.set_transient_for(lightbox)
# without WindowGroup, python-meh's window is insensitive if
it appears
# above a spoke (Gtk.Window running its own Gtk.main loop)
window_group = Gtk.WindowGroup()
window_group.add_window(exc_window.main_window)
return exc_window
- def saveExceptionWindow(self, signature, *args, **kwargs):
meh_intf = meh.ui.gui.GraphicalIntf()
meh_intf.saveExceptionWindow(signature)
- ### ### SIGNAL HANDLING METHODS ###
@@ -493,7 +493,38 @@ class GraphicalUserInterface(UserInterface): if rc == 1: sys.exit(0)
+class GraphicalExceptionHandlingIface(meh.ui.gui.GraphicalIntf):
- """
- Class inheriting from python-meh's GraphicalIntf and overriding
methods
- that need some modification in Anaconda.
- """
- def __init__(self, lightbox_func):
"""
@param lightbox_func: a function that creates lightbox for a
given
window
@type lightbox_func: GtkWindow -> None
"""
self._lightbox_func = lightbox_func
def mainExceptionWindow(self, text, exn_file, *args, **kwargs):
from gi.repository import Gtk
meh_intf = meh.ui.gui.GraphicalIntf()
exc_window = meh_intf.mainExceptionWindow(text, exn_file)
exc_window.main_window.set_decorated(False)
self._lightbox_func(exc_window)
# without WindowGroup, python-meh's window is insensitive if
it appears
# above a spoke (Gtk.Window running its own Gtk.main loop)
window_group = Gtk.WindowGroup()
window_group.add_window(exc_window.main_window)
return exc_window
def busyCursor(): window = Gdk.get_default_root_window() diff --git a/pyanaconda/ui/tui/__init__.py b/pyanaconda/ui/tui/__init__.py index cebb6c4..64b9f7f 100644 --- a/pyanaconda/ui/tui/__init__.py +++ b/pyanaconda/ui/tui/__init__.py @@ -130,6 +130,7 @@ class TextUserInterface(ui.UserInterface):
ui.UserInterface.__init__(self, storage, payload, instclass) self._app = None
self._meh_interface = meh.ui.text.TextIntf()
basemask = "pyanaconda.ui.tui" basepath = os.path.dirname(__file__)
@@ -146,7 +147,15 @@ class TextUserInterface(ui.UserInterface): os.path.join(path, "hubs")) for path in pathlist] }
- @property
- def tty_num(self):
return 1
- @property
- def meh_interface(self):
return self._meh_interface
- def _list_hubs(self): """returns the list of hubs to use""" return [SummaryHub, ProgressHub]
@@ -225,11 +234,3 @@ class TextUserInterface(ui.UserInterface): question_window = YesNoDialog(self._app, message) self._app.switch_screen_modal(question_window) return question_window.answer
- def mainExceptionWindow(self, text, exn_file, *args, **kwargs):
meh_intf = meh.ui.text.TextIntf()
return meh_intf.mainExceptionWindow(text, exn_file, *args,
**kwargs)
- def saveExceptionWindow(self, signature, *args, **kwargs):
meh_intf = meh.ui.text.TextIntf()
return meh_intf.saveExceptionWindow(signature, *args,
**kwargs)
1.7.11.7
anaconda-patches mailing list anaconda-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
Since this patch affects just the lines having (trailing) whitespace only, it doesn't ruin git history in any significant way.
Signed-off-by: Vratislav Podzimek vpodzime@redhat.com --- pyanaconda/ui/__init__.py | 4 ++-- pyanaconda/ui/gui/__init__.py | 14 +++++++------- pyanaconda/ui/tui/__init__.py | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/pyanaconda/ui/__init__.py b/pyanaconda/ui/__init__.py index d09e9b4..c60698d 100644 --- a/pyanaconda/ui/__init__.py +++ b/pyanaconda/ui/__init__.py @@ -76,7 +76,7 @@ class UserInterface(object): for k,v in pathdict.iteritems(): cls.paths.setdefault(k, []) cls.paths[k].extend(v) - + def setup(self, data): """Construct all the objects required to implement this interface. This method must be provided by all subclasses. @@ -147,7 +147,7 @@ class UserInterface(object): getattr(obj, "preForHub", False) or getattr(obj, "postForHub", False)))
return standalones - + def _orderActionClasses(self, spokes, hubs): """Order all the Hub and Spoke classes which should be enqueued for processing according to their pre/post dependencies. diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py index 73925e7..d79aba6 100644 --- a/pyanaconda/ui/gui/__init__.py +++ b/pyanaconda/ui/gui/__init__.py @@ -75,7 +75,7 @@ class GUIObject(common.UIObject): uiFile = ""
screenshots_directory = "/tmp/anaconda-screenshots" - + def __init__(self, data): """Create a new UIObject instance, including loading its uiFile and all UI-related objects. @@ -204,7 +204,7 @@ class QuitDialog(GUIObject): uiFile = "main.glade"
MESSAGE = "" - + def run(self): if self.MESSAGE: self.builder.get_object("quit_message").set_label(_(self.MESSAGE)) @@ -218,7 +218,7 @@ class GraphicalUserInterface(UserInterface): def __init__(self, storage, payload, instclass, distributionText = distributionText, isFinal = isFinal, quitDialog = QuitDialog): - + UserInterface.__init__(self, storage, payload, instclass)
self._actions = [] @@ -283,7 +283,7 @@ class GraphicalUserInterface(UserInterface):
def setup(self, data): busyCursor() - + self._actions = self.getActionClasses(self._list_hubs()) self.data = data
@@ -324,7 +324,7 @@ class GraphicalUserInterface(UserInterface): if hasattr(obj, "set_path"): obj.set_path("spokes", self.paths["spokes"]) obj.set_path("categories", self.paths["categories"]) - + # If we are doing a kickstart install, some standalone spokes # could already be filled out. In that case, we do not want # to display them. @@ -428,7 +428,7 @@ class GraphicalUserInterface(UserInterface): ### def _on_continue_clicked(self): from gi.repository import Gtk - + # If we're on the last screen, clicking Continue quits. if len(self._actions) == 1: Gtk.main_quit() @@ -534,4 +534,4 @@ def unbusyCursor(): window = Gdk.get_default_root_window() window.set_cursor(Gdk.Cursor(Gdk.CursorType.ARROW))
- + diff --git a/pyanaconda/ui/tui/__init__.py b/pyanaconda/ui/tui/__init__.py index 64b9f7f..52e8f21 100644 --- a/pyanaconda/ui/tui/__init__.py +++ b/pyanaconda/ui/tui/__init__.py @@ -163,7 +163,7 @@ class TextUserInterface(ui.UserInterface): def _is_standalone(self, spoke): """checks if the passed spoke is standalone""" return isinstance(spoke, StandaloneSpoke) - + def setup(self, data): """Construct all the objects required to implement this interface. This method must be provided by all subclasses. @@ -175,7 +175,7 @@ class TextUserInterface(ui.UserInterface): path = os.path.join(os.path.dirname(__file__), "spokes") spokes = self._collectActionClasses(self.paths["spokes"], StandaloneSpoke) actionClasses = self._orderActionClasses(spokes, _hubs) - + for klass in actionClasses: obj = klass(self._app, data, self.storage, self.payload, self.instclass)
On Thu, Jan 17, 2013 at 01:17:20PM +0100, Vratislav Podzimek wrote:
All the work lies in PATCH 1/2 and the comment is in its commit message.
Vratislav Podzimek (2): Refactor and cleanup exception handling pieces Cleanup some trailing whitespace on otherwise empty lines
pyanaconda/exception.py | 24 ++++++++--- pyanaconda/ui/__init__.py | 30 ++++++------- pyanaconda/ui/gui/__init__.py | 97 ++++++++++++++++++++++++++++--------------- pyanaconda/ui/tui/__init__.py | 23 +++++----- 4 files changed, 110 insertions(+), 64 deletions(-)
Ack.
anaconda-patches@lists.fedorahosted.org