[pacman-dev] [PATCH v2] pacman+libalpm: print version names for conflicting packages
Allan McRae
allan at archlinux.org
Wed Dec 11 00:22:38 UTC 2019
On 28/11/19 6:40 am, morganamilo wrote:
> When ever pacman prints a conflict, it now prints pkgname-version,
> instead of just pkgname.
>
> alpm_conflict_t now carries pointers to alpm_pkg_t instead of just the
> names of each package.
>
> Fixes FS#12536 (point 2)
>
> ---
>
> v2: dupe each alpm_pkg_t
One typo spotted, and a suggestion for improving output.
Allan
>
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index 956284bd..b0aa0671 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -247,10 +247,8 @@ typedef struct _alpm_depmissing_t {
>
> /** Conflict */
> typedef struct _alpm_conflict_t {
> - unsigned long package1_hash;
> - unsigned long package2_hash;
> - char *package1;
> - char *package2;
> + alpm_pkg_t *package1;
> + alpm_pkg_t *package2;
> alpm_depend_t *reason;
> } alpm_conflict_t;
>
OK
> diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
> index 80827ed6..08ae86cb 100644
> --- a/lib/libalpm/conflict.c
> +++ b/lib/libalpm/conflict.c
> @@ -49,11 +49,8 @@ static alpm_conflict_t *conflict_new(alpm_pkg_t *pkg1, alpm_pkg_t *pkg2,
> alpm_conflict_t *conflict;
>
> CALLOC(conflict, 1, sizeof(alpm_conflict_t), return NULL);
> -
> - conflict->package1_hash = pkg1->name_hash;
> - conflict->package2_hash = pkg2->name_hash;
> - STRDUP(conflict->package1, pkg1->name, goto error);
> - STRDUP(conflict->package2, pkg2->name, goto error);
> + ASSERT(_alpm_pkg_dup(pkg1, &conflict->package1) == 0, goto error);
> + ASSERT(_alpm_pkg_dup(pkg2, &conflict->package2) == 0, goto error);
> conflict->reason = reason;
>
OK
> return conflict;
> @@ -69,8 +66,8 @@ error:
> void SYMEXPORT alpm_conflict_free(alpm_conflict_t *conflict)
> {
> ASSERT(conflict != NULL, return);
> - FREE(conflict->package2);
> - FREE(conflict->package1);
> + _alpm_pkg_free(conflict->package1);
> + _alpm_pkg_free(conflict->package2);
> FREE(conflict);
> }
>
OK
> @@ -79,20 +76,7 @@ void SYMEXPORT alpm_conflict_free(alpm_conflict_t *conflict)
> */
> alpm_conflict_t *_alpm_conflict_dup(const alpm_conflict_t *conflict)
> {
> - alpm_conflict_t *newconflict;
> - CALLOC(newconflict, 1, sizeof(alpm_conflict_t), return NULL);
> -
> - newconflict->package1_hash = conflict->package1_hash;
> - newconflict->package2_hash = conflict->package2_hash;
> - STRDUP(newconflict->package1, conflict->package1, goto error);
> - STRDUP(newconflict->package2, conflict->package2, goto error);
> - newconflict->reason = conflict->reason;
> -
> - return newconflict;
> -
> -error:
> - alpm_conflict_free(newconflict);
> - return NULL;
> + return conflict_new(conflict->package1, conflict->package2, conflict->reason);
OK - now a one line function!
> }
>
> /**
> @@ -108,10 +92,10 @@ static int conflict_isin(alpm_conflict_t *needle, alpm_list_t *haystack)
> alpm_list_t *i;
> for(i = haystack; i; i = i->next) {
> alpm_conflict_t *conflict = i->data;
> - if(needle->package1_hash == conflict->package1_hash
> - && needle->package2_hash == conflict->package2_hash
> - && strcmp(needle->package1, conflict->package1) == 0
> - && strcmp(needle->package2, conflict->package2) == 0) {
> + if(needle->package1->name_hash == conflict->package2->name_hash
conflict->package1->name_hash
> + && needle->package2->name_hash == conflict->package2->name_hash
> + && strcmp(needle->package1->name, conflict->package1->name) == 0
> + && strcmp(needle->package2->name, conflict->package2->name) == 0) {
> return 1;
> }
> }
> diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
> index 97a351fe..d26a1323 100644
> --- a/lib/libalpm/sync.c
> +++ b/lib/libalpm/sync.c
> @@ -510,21 +510,23 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
>
> for(i = deps; i; i = i->next) {
> alpm_conflict_t *conflict = i->data;
> + const char *name1 = conflict->package1->name;
> + const char *name2 = conflict->package2->name;
> alpm_pkg_t *rsync, *sync, *sync1, *sync2;
>
> /* have we already removed one of the conflicting targets? */
> - sync1 = alpm_pkg_find(trans->add, conflict->package1);
> - sync2 = alpm_pkg_find(trans->add, conflict->package2);
> + sync1 = alpm_pkg_find(trans->add, name1);
> + sync2 = alpm_pkg_find(trans->add, name2);
> if(!sync1 || !sync2) {
> continue;
> }
>
> _alpm_log(handle, ALPM_LOG_DEBUG, "conflicting packages in the sync list: '%s' <-> '%s'\n",
> - conflict->package1, conflict->package2);
> + name1, name2);
>
> /* if sync1 provides sync2, we remove sync2 from the targets, and vice versa */
> - alpm_depend_t *dep1 = alpm_dep_from_string(conflict->package1);
> - alpm_depend_t *dep2 = alpm_dep_from_string(conflict->package2);
> + alpm_depend_t *dep1 = alpm_dep_from_string(name1);
> + alpm_depend_t *dep2 = alpm_dep_from_string(name2);
> if(_alpm_depcmp(sync1, dep2)) {
> rsync = sync2;
> sync = sync1;
OK
> @@ -552,8 +554,8 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
>
> /* Prints warning */
> _alpm_log(handle, ALPM_LOG_WARNING,
> - _("removing '%s' from target list because it conflicts with '%s'\n"),
> - rsync->name, sync->name);
> + _("removing '%s-%s' from target list because it conflicts with '%s-%s'\n"),
> + rsync->name, rsync->version, sync->name, sync->version);
> trans->add = alpm_list_remove(trans->add, rsync, _alpm_pkg_cmp, NULL);
> /* rsync is not a transaction target anymore */
> trans->unresolvable = alpm_list_add(trans->unresolvable, rsync);
OK
> @@ -574,16 +576,18 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
> .conflict = i->data
> };
> alpm_conflict_t *conflict = i->data;
> + const char *name1 = conflict->package1->name;
> + const char *name2 = conflict->package2->name;
> int found = 0;
>
> - /* if conflict->package2 (the local package) is not elected for removal,
> + /* if name2 (the local package) is not elected for removal,
> we ask the user */
> - if(alpm_pkg_find(trans->remove, conflict->package2)) {
> + if(alpm_pkg_find(trans->remove, name2)) {
> found = 1;
> }
> for(j = trans->add; j && !found; j = j->next) {
> alpm_pkg_t *spkg = j->data;
> - if(alpm_pkg_find(spkg->removes, conflict->package2)) {
> + if(alpm_pkg_find(spkg->removes, name2)) {
> found = 1;
> }
> }
OK
> @@ -592,14 +596,14 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
> }
>
> _alpm_log(handle, ALPM_LOG_DEBUG, "package '%s' conflicts with '%s'\n",
> - conflict->package1, conflict->package2);
> + name1, name2);
>
> QUESTION(handle, &question);
> if(question.remove) {
> /* append to the removes list */
> - alpm_pkg_t *sync = alpm_pkg_find(trans->add, conflict->package1);
> - alpm_pkg_t *local = _alpm_db_get_pkgfromcache(handle->db_local, conflict->package2);
> - _alpm_log(handle, ALPM_LOG_DEBUG, "electing '%s' for removal\n", conflict->package2);
> + alpm_pkg_t *sync = alpm_pkg_find(trans->add, name1);
> + alpm_pkg_t *local = _alpm_db_get_pkgfromcache(handle->db_local, name2);
> + _alpm_log(handle, ALPM_LOG_DEBUG, "electing '%s' for removal\n", name2);
> sync->removes = alpm_list_add(sync->removes, local);
> } else { /* abort */
> _alpm_log(handle, ALPM_LOG_ERROR, _("unresolvable package conflicts detected\n"));
OK
> diff --git a/src/pacman/callback.c b/src/pacman/callback.c
> index 08da4bb7..812b64e3 100644
> --- a/src/pacman/callback.c
> +++ b/src/pacman/callback.c
> @@ -393,18 +393,22 @@ void cb_question(alpm_question_t *question)
> {
> alpm_question_conflict_t *q = &question->conflict;
> /* print conflict only if it contains new information */
> - if(strcmp(q->conflict->package1, q->conflict->reason->name) == 0
> - || strcmp(q->conflict->package2, q->conflict->reason->name) == 0) {
> - q->remove = noyes(_("%s and %s are in conflict. Remove %s?"),
> - q->conflict->package1,
> - q->conflict->package2,
> - q->conflict->package2);
> + if(strcmp(alpm_pkg_get_name(q->conflict->package1), q->conflict->reason->name) == 0
> + || strcmp(alpm_pkg_get_name(q->conflict->package2), q->conflict->reason->name) == 0) {
> + q->remove = noyes(_("%s-%s and %s-%s are in conflict. Remove %s?"),
> + alpm_pkg_get_name(q->conflict->package1),
> + alpm_pkg_get_version(q->conflict->package1),
> + alpm_pkg_get_name(q->conflict->package2),
> + alpm_pkg_get_version(q->conflict->package2),
> + alpm_pkg_get_name(q->conflict->package2));
I had a look at this and the line is getting too long with the extra
information. How about splitting the line like this:
colon_printf(_("%s-%s and %s-%s are in conflict\n"),
alpm_pkg_get_name(q->conflict->package1),
alpm_pkg_get_version(q->conflict->package1),
alpm_pkg_get_name(q->conflict->package2),
alpm_pkg_get_version(q->conflict->package2));
q->remove = noyes(_("Remove %s?"),
alpm_pkg_get_name(q->conflict->package2));
> } else {
> - q->remove = noyes(_("%s and %s are in conflict (%s). Remove %s?"),
> - q->conflict->package1,
> - q->conflict->package2,
> + q->remove = noyes(_("%s-%s and %s-%s are in conflict (%s). Remove %s?"),
> + alpm_pkg_get_name(q->conflict->package1),
> + alpm_pkg_get_version(q->conflict->package1),
> + alpm_pkg_get_name(q->conflict->package2),
> + alpm_pkg_get_version(q->conflict->package2),
> q->conflict->reason->name,
> - q->conflict->package2);
> + alpm_pkg_get_name(q->conflict->package2));
> }
> }
> break;
> diff --git a/src/pacman/database.c b/src/pacman/database.c
> index 378edc8c..db8ed2de 100644
> --- a/src/pacman/database.c
> +++ b/src/pacman/database.c
> @@ -157,7 +157,7 @@ static int check_db_local_package_conflicts(alpm_list_t *pkglist)
> for(i = data; i; i = i->next) {
> alpm_conflict_t *conflict = i->data;
> pm_printf(ALPM_LOG_ERROR, "'%s' conflicts with '%s'\n",
> - conflict->package1, conflict->package2);
> + alpm_pkg_get_name(conflict->package1), alpm_pkg_get_name(conflict->package2));
> ret++;
> }
> alpm_list_free_inner(data, (alpm_list_fn_free)alpm_conflict_free);
OK
> diff --git a/src/pacman/sync.c b/src/pacman/sync.c
> index 4bdeff7b..73e0496e 100644
> --- a/src/pacman/sync.c
> +++ b/src/pacman/sync.c
> @@ -777,12 +777,19 @@ int sync_prepare_execute(void)
> alpm_conflict_t *conflict = i->data;
> /* only print reason if it contains new information */
> if(conflict->reason->mod == ALPM_DEP_MOD_ANY) {
> - colon_printf(_("%s and %s are in conflict\n"),
> - conflict->package1, conflict->package2);
> + colon_printf(_("%s-%s and %s-%s are in conflict\n"),
> + alpm_pkg_get_name(conflict->package1),
> + alpm_pkg_get_version(conflict->package1),
> + alpm_pkg_get_name(conflict->package2),
> + alpm_pkg_get_version(conflict->package2));
> } else {
> char *reason = alpm_dep_compute_string(conflict->reason);
> - colon_printf(_("%s and %s are in conflict (%s)\n"),
> - conflict->package1, conflict->package2, reason);
> + colon_printf(_("%s-%s and %s-%s are in conflict (%s)\n"),
> + alpm_pkg_get_name(conflict->package1),
> + alpm_pkg_get_version(conflict->package1),
> + alpm_pkg_get_name(conflict->package2),
> + alpm_pkg_get_version(conflict->package2),
> + reason);
OK
More information about the pacman-dev
mailing list