[pacman-dev] [PATCH] add detail to broken dependency errors
Andrew Gregory
andrew.gregory.8 at gmail.com
Mon Nov 2 01:42:01 UTC 2015
The difference between a sync target having an unmet dependency and
breaking a dependency for an installed package is a common source of
confusion.
Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
src/pacman/remove.c | 3 ++-
src/pacman/sync.c | 27 ++++++++++++++++++++++-----
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/src/pacman/remove.c b/src/pacman/remove.c
index 069f236..e41e7f5 100644
--- a/src/pacman/remove.c
+++ b/src/pacman/remove.c
@@ -122,7 +122,8 @@ int pacman_remove(alpm_list_t *targets)
for(i = data; i; i = alpm_list_next(i)) {
alpm_depmissing_t *miss = i->data;
char *depstring = alpm_dep_compute_string(miss->depend);
- colon_printf(_("%s: requires %s\n"), miss->target, depstring);
+ colon_printf(_("%s: removing %s breaks dependency '%s'\n"),
+ miss->target, miss->causingpkg, depstring);
free(depstring);
alpm_depmissing_free(miss);
}
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 2a0f4b5..b13f76a 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -707,6 +707,26 @@ static int sync_trans(alpm_list_t *targets)
return sync_prepare_execute();
}
+static void print_broken_dep(alpm_depmissing_t *miss)
+{
+ char *depstring = alpm_dep_compute_string(miss->depend);
+ alpm_list_t *trans_add = alpm_trans_get_add(config->handle);
+ alpm_pkg_t *pkg;
+ if(miss->causingpkg == NULL) {
+ /* package being installed/upgraded has unresolved dependency */
+ colon_printf(_("%s: requires %s\n"), miss->target, depstring);
+ } else if((pkg = alpm_pkg_find(trans_add, miss->causingpkg))) {
+ /* upgrading a package breaks a local dependency */
+ colon_printf(_("%s: installing %s (%s) breaks dependency '%s'\n"),
+ miss->target, miss->causingpkg, alpm_pkg_get_version(pkg), depstring);
+ } else {
+ /* removing a package breaks a local dependency */
+ colon_printf(_("%s: removing %s breaks dependency '%s'\n"),
+ miss->target, miss->causingpkg, depstring);
+ }
+ free(depstring);
+}
+
int sync_prepare_execute(void)
{
alpm_list_t *i, *packages, *data = NULL;
@@ -727,11 +747,8 @@ int sync_prepare_execute(void)
break;
case ALPM_ERR_UNSATISFIED_DEPS:
for(i = data; i; i = alpm_list_next(i)) {
- alpm_depmissing_t *miss = i->data;
- char *depstring = alpm_dep_compute_string(miss->depend);
- colon_printf(_("%s: requires %s\n"), miss->target, depstring);
- free(depstring);
- alpm_depmissing_free(miss);
+ print_broken_dep(i->data);
+ alpm_depmissing_free(i->data);
}
break;
case ALPM_ERR_CONFLICTING_DEPS:
--
2.6.2
More information about the pacman-dev
mailing list