From patchwork Wed Nov 27 20:40:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: morganamilo X-Patchwork-Id: 1401 Return-Path: Delivered-To: patchwork@archlinux.org Received: from apollo.archlinux.org (localhost [127.0.0.1]) by apollo.archlinux.org (Postfix) with ESMTP id 6C57715503C6E for ; Wed, 27 Nov 2019 20:43:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on apollo.archlinux.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1,DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1, MAILING_LIST_MULTI=-1,RCVD_IN_DNSWL_MED=-2.3,SPF_HELO_NONE=0.001, T_DMARC_POLICY_NONE=0.01 autolearn=ham autolearn_force=no version=3.4.2 X-Spam-BL-Results: [127.0.0.11] [127.0.0.10] [127.0.9.2] Received: from orion.archlinux.org (orion.archlinux.org [88.198.91.70]) by apollo.archlinux.org (Postfix) with ESMTPS for ; Wed, 27 Nov 2019 20:43:19 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id 2A50316EDE293A; Wed, 27 Nov 2019 20:43:18 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [IPv6:2a01:4f8:160:3033::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits)) (No client certificate requested) (Authenticated sender: luna) by orion.archlinux.org (Postfix) with ESMTPSA id D84AC16EDE2932; Wed, 27 Nov 2019 20:43:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=orion; t=1574887397; bh=meW5fXZ0tCoopgkm1fsS0fmmTflExVc0LDNDEQgcaC8=; h=From:To:Date:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:Reply-To; b=CZ0a9E7Jf4fcxcest7Q9C9sDqbnla0f8SEDo1wFGerdsv7eZKHejWMrP9J764ChBH UZ8vwvKHzQXbofQ3Ra27gXL/+Ysstsm4IHU7blNCcSpQ4KmIM8GcAsoGZas0A2LD+k mxK0Aa+M1zzBz23JXoZGvlOqxi739Y/t1d+FvAEiW33GJKXLUrXzKbSakuaUI0BSxq bW3MPnljk0C66D5fnIFklzWW8sE+ZvHDxa4gPC4PCZ2QHdae3vd2K0vqXH9rUNhmd+ lHr9LkrI+7Q/tQjgRvpRrNcMkfZnwMOnuZhwpZTzvHlGFbFhgtfrLJr1c7Zu7D6+6O S732QAUe8DO9o3Lr+aKp5HN7JLOJPrA4qZmnimrFUx2bCPBteZQewjJrc3lxQY9h49 DQ2pWWUu37xGe+yer8Y7YDTu8N3QszfYu1BQ5cG6x8sLgqHDZijG9fEIjh3a2h+3PP z4kO5I7m1PJCOd7xgpP+I3SRRUxPWkM31Stvb3M1E6lsceL8jvw7aL0kzGY1+odfik y55QG6nJNdE8eyvJ2Wsx1tk+fTvGeqgwrG3ScpZI1yLLjqWLLirQSawCHLndxvL4gz tcwtoy0Ve8Lp2BDBZKcq6st9uWN5eqYZewEsXM7vld8JbOV0AF3Tz6wl38LYTHQQIK zVo8c26oZBWSyqVbYc5srXqs= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id CAA312B78F; Wed, 27 Nov 2019 20:43:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=luna2; t=1574887397; bh=meW5fXZ0tCoopgkm1fsS0fmmTflExVc0LDNDEQgcaC8=; h=From:To:Date:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:Reply-To; b=jtxNqnlEjPQJ1zhg9jHXvzmcjCHie0cLOaWlyv5JlEQfZFs2LtwpAwFZwvewb2ROZ Ya+sNDE7i28MD8ozF/O0OS2T323ktqhzkkIJ8UXX/05M/5dQ0C6VvG5ZOJPWTXtAyr KZLhhfeUeJ+sC1waVT0s3dEVCxRPpDQFApJwCmjNxeoZGQdS9h28nno4XAoftvdwFw KWnBRSu5K8wXipTtm8cUqKiV+KRlY38OPaO57UMCemwDdY8QYsvplSsMEiFnJ8QeVp qKxnbo7cmM3Gmr9C+z/w40oFKR20nv1olq+bEVZsduFDwK+k4/iEgIX4UjchRGrx8o FpB3sUNLG0l24dBFz//FqX3VaWLZFtrcP05zvWSgsrusk82npx49qxG8A8j+JStAeI j50rsbXHGifP8MEzl10EiJRm/h/ntePAupD1XC42zmlchdXMiLmxJlchwNrsage1yP j/J61Nd/YDC8NKSJSG9jHNCPPRhKTLEM+IlWjXv+iFL2jsnBM+zHghfHKlSNH2u3JF 5wrCMm/TZjOuhT13KI0KoDekrPFXEIVFohQTLVJOCt8a73m65AlY0Q4pm8whSTPcUd a979opICbp08kqHZg4hWgVI06KKScVLqxN/5zWLG3rdPO5KMikduwvvc3OJgu+wUHo XR/e5PWkza60/FS8FScRnsHM= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id 155862B78A for ; Wed, 27 Nov 2019 20:43:15 +0000 (UTC) Received: from orion.archlinux.org (orion.archlinux.org [IPv6:2a01:4f8:160:6087::1]) by luna.archlinux.org (Postfix) with ESMTPS for ; Wed, 27 Nov 2019 20:43:15 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id DB88C16EDE2929; Wed, 27 Nov 2019 20:43:13 +0000 (UTC) Received: from localhost.localdomain (88-109-60-28.dynamic.dsl.as9105.com [88.109.60.28]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: morganamilo) by orion.archlinux.org (Postfix) with ESMTPSA id A9A0D16EDE2928; Wed, 27 Nov 2019 20:43:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=orion; t=1574887393; bh=meW5fXZ0tCoopgkm1fsS0fmmTflExVc0LDNDEQgcaC8=; h=From:To:Cc:Subject:Date; b=QR1lVZ5scPamUxf4nxTq0KnpO7fHBv8lQBHtcLdL1JxpExIC84WR1pnDrdjw1CoIS 9+ExBdkh7+6zAppran0xkBABB6MB0Js0sw/+sTXgwtprgToWmQ1Av995KTKU7pGfV8 9qfB5wgNyRGDYXY9aDoA5I5TIs/ozVQtQIVe4EcsLeLxOOHc+h1vy/BF0+rz14XhEa lqIdEmpB4O2mT8SMj7Nya/CwbX/F7R1OcAGeOvaeaSTVOplchoRTtebXPwDfwEwKX2 Gx6Elx/iTU+vtQCcnlH8IfCbgS5UH924pfu3lvz0yYnf+0QkoEadbQ6ui+vRPxHEbm d2xJ8JXoUE8k8/CV8pO1smKeaHIpoFE0gVhpp4x5ajiyYAq/P1YpuvQ4Kd4xqDDoXp nvs6sXX39lpVnYoSoh/BOcAtnE9LBHO0mND8nVT8uD/X7yG2wR/9wTJRVPh74Wee+F Nk0ZPWMSJsfXgY3V0QgyH0yfzBv7X/JUNWYOfyIK7ehgbWyEAtA3ystajbw2No8421 rDAR2r1iGC/BX4xQaMa1jUeQtIhgv5nVkqQiR14t4KfkqXYZcO4mTuVY1Gcnl+s/9+ Dnz6LDncYzwmwWGyTTmr5CqM97MAJnI9XJYmi5xLnJif6EISKiRzphY5HdWbJGWM0D m+Ehmr6pnq9Tew8jyOWL+bU4= From: morganamilo To: pacman-dev@archlinux.org Date: Wed, 27 Nov 2019 20:40:47 +0000 Message-Id: <20191127204045.501505-1-morganamilo@archlinux.org> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 Subject: [pacman-dev] [PATCH v2] pacman+libalpm: print version names for conflicting packages X-BeenThere: pacman-dev@archlinux.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion list for pacman development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Discussion list for pacman development Errors-To: pacman-dev-bounces@archlinux.org Sender: "pacman-dev" 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 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; 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; 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); } @@ -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); } /** @@ -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 + && 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; @@ -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); @@ -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; } } @@ -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")); 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)); } 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); 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); free(reason); } alpm_conflict_free(conflict);