From 7266a5766441725210e7e4af3ee7da501cf0e38f Mon Sep 17 00:00:00 2001 From: guinux Date: Tue, 1 Mar 2016 15:43:51 +0100 Subject: [PATCH] better error handling, fix #103 --- src/common.vala | 2 +- src/daemon.vala | 33 +++++++++++++++++++++++---------- src/manager_window.vala | 7 ++++++- src/transaction.vala | 10 ++++++---- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/common.vala b/src/common.vala index ebc09b8..0cfdb76 100644 --- a/src/common.vala +++ b/src/common.vala @@ -32,11 +32,11 @@ namespace Pamac { } public struct ErrorInfos { + public uint errno; public string message; public string[] details; public ErrorInfos () { message = ""; - details = {}; } } } diff --git a/src/daemon.vala b/src/daemon.vala index 1411456..65fd953 100644 --- a/src/daemon.vala +++ b/src/daemon.vala @@ -134,8 +134,7 @@ namespace Pamac { alpm_config.set_handle (); if (alpm_config.handle == null) { current_error = ErrorInfos () { - message = _("Failed to initialize alpm library"), - details = {} + message = _("Failed to initialize alpm library") }; trans_commit_finished (false); } else { @@ -347,8 +346,10 @@ namespace Pamac { // We should always succeed if at least one DB was upgraded - we may possibly // fail later with unresolved deps, but that should be rare, and would be expected if (success == 0) { + Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to synchronize any databases"); - current_error.details = { Alpm.strerror (alpm_config.handle.errno ()) }; + current_error.details = { Alpm.strerror (errno) }; refresh_finished (false); } else { refresh_finished (true); @@ -465,8 +466,10 @@ namespace Pamac { current_error = ErrorInfos (); cancellable.reset (); if (alpm_config.handle.trans_init (transflags) == -1) { + Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to init transaction"); - current_error.details = { Alpm.strerror (alpm_config.handle.errno ()) }; + current_error.details = { Alpm.strerror (errno) }; return false; } else { intern_lock = true; @@ -477,8 +480,10 @@ namespace Pamac { public bool trans_sysupgrade (bool enable_downgrade) { current_error = ErrorInfos (); if (alpm_config.handle.trans_sysupgrade ((enable_downgrade) ? 1 : 0) == -1) { + Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to prepare transaction"); - current_error.details = { Alpm.strerror (alpm_config.handle.errno ()) }; + current_error.details = { Alpm.strerror (errno) }; return false; } return true; @@ -492,6 +497,7 @@ namespace Pamac { // just skip duplicate or ignored targets return true; } else { + current_error.errno = (uint) errno; current_error.message = _("Failed to prepare transaction"); current_error.details = { "%s: %s".printf (pkg.name, Alpm.strerror (errno)) }; return false; @@ -569,12 +575,16 @@ namespace Pamac { current_error = ErrorInfos (); Alpm.Package* pkg = alpm_config.handle.load_file (pkgpath, 1, alpm_config.handle.localfilesiglevel); if (pkg == null) { + Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to prepare transaction"); - current_error.details = { "%s: %s".printf (pkgpath, Alpm.strerror (alpm_config.handle.errno ())) }; + current_error.details = { "%s: %s".printf (pkgpath, Alpm.strerror (errno)) }; return false; } else if (alpm_config.handle.trans_add_pkg (pkg) == -1) { + Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to prepare transaction"); - current_error.details = { "%s: %s".printf (pkg->name, Alpm.strerror (alpm_config.handle.errno ())) }; + current_error.details = { "%s: %s".printf (pkg->name, Alpm.strerror (errno)) }; // free the package because it will not be used delete pkg; return false; @@ -590,8 +600,10 @@ namespace Pamac { current_error.details = { _("target not found: %s").printf (pkgname) }; return false; } else if (alpm_config.handle.trans_remove_pkg (pkg) == -1) { + Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to prepare transaction"); - current_error.details = { "%s: %s".printf (pkg.name, Alpm.strerror (alpm_config.handle.errno ())) }; + current_error.details = { "%s: %s".printf (pkg.name, Alpm.strerror (errno)) }; return false; } return true; @@ -603,6 +615,7 @@ namespace Pamac { Alpm.List err_data; if (alpm_config.handle.trans_prepare (out err_data) == -1) { Alpm.Errno errno = alpm_config.handle.errno (); + current_error.errno = (uint) errno; current_error.message = _("Failed to prepare transaction"); string detail = Alpm.strerror (errno); switch (errno) { @@ -723,6 +736,7 @@ namespace Pamac { trans_commit_finished (false); return; } + current_error.errno = (uint) errno; current_error.message = _("Failed to commit transaction"); string detail = Alpm.strerror (errno); string[] details = {}; @@ -782,8 +796,7 @@ namespace Pamac { } } else { current_error = ErrorInfos () { - message = _("Authentication failed"), - details = {} + message = _("Authentication failed") }; trans_release (); refresh_handle (); diff --git a/src/manager_window.vala b/src/manager_window.vala index 9df91d7..198ee6f 100644 --- a/src/manager_window.vala +++ b/src/manager_window.vala @@ -1738,7 +1738,12 @@ namespace Pamac { } void on_transaction_finished (bool success) { - set_buttons_sensitive (false); + if (transaction.to_add.length == 0 + && transaction.to_remove.length == 0 + && transaction.to_load.length == 0 + && transaction.to_build.length == 0) { + set_buttons_sensitive (false); + } refresh_packages_list (); transaction.to_load.remove_all (); if (refreshing) { diff --git a/src/transaction.vala b/src/transaction.vala index 476e2c3..98c8ed4 100644 --- a/src/transaction.vala +++ b/src/transaction.vala @@ -1122,7 +1122,9 @@ namespace Pamac { } void handle_error (ErrorInfos error) { - if (error.message != null && error.message != "") { + if (error.message != "") { + progress_dialog.action_label.set_text (""); + progress_dialog.progressbar.set_fraction (0); progress_dialog.expander.set_expanded (true); progress_dialog.spawn_in_term ({"echo", "-n", error.message}); Gtk.TextIter start_iter; @@ -1152,7 +1154,6 @@ namespace Pamac { transaction_info_dialog.textbuffer.get_start_iter (out start_iter); transaction_info_dialog.textbuffer.get_end_iter (out end_iter); transaction_info_dialog.textbuffer.delete (ref start_iter, ref end_iter); - progress_dialog.progressbar.set_fraction (0); progress_dialog.spawn_in_term ({"echo"}); while (Gtk.events_pending ()) { Gtk.main_iteration (); @@ -1277,9 +1278,10 @@ namespace Pamac { } } } else { - // if it is an authentication error, database was not modified + // if it is an authentication or a download error, database was not modified var err = get_current_error (); - if (err.message != dgettext (null, "Authentication failed")) { + if (err.message != dgettext (null, "Authentication failed") + && err.errno != Alpm.Errno.EXTERNAL_DOWNLOAD) { clear_lists (); database_modified = true; }