[pacman-dev] [PATCH] Add more information in conflicts question
Sebastian Nowicki
sebnow at gmail.com
Sun Apr 10 06:58:57 EDT 2011
In addition to the names of the conflicting packages, the origin and
versions will be displayed to the user.
This introduces an API change in the PM_TRANS_CONV_CONFLICT_PKG
conversation callback. All three arguments were strings. The first
two arguments are now pmpkg_t structures (sync and local, respectively).
Fixes FS#12536
---
In FS#12536 there was some discussion about changing pmconflict_t to
contain pmpkg_t structures rather than just strings. This would
be a much larger change, which I didn't think was worthwhile for
a cosmetic change.
Even so, this does introduce an API change, and a sneaky one at that.
The conversation callback had three string arguments, now it has two
pmpkg_t and a string. Due to these being all void pointers, end-users
won't get any compiler warnings/errors if they don't update their code!
Sample output without the patch applied:
$ sudo pacman -S qemu-kvm
resolving dependencies...
looking for inter-conflicts...
:: qemu-kvm and qemu are in conflict. Remove qemu? [y/N] n
error: unresolvable package conflicts detected
error: failed to prepare transaction (conflicting dependencies)
:: qemu-kvm and qemu are in conflict
Sample output with the patch applied:
$ sudo ./src/pacman/pacman -S qemu-kvm
resolving dependencies...
looking for inter-conflicts...
:: extra/qemu-kvm-0.14.0-1 and qemu-0.14.0-1 are in conflict. Remove qemu? [y/N] n
error: unresolvable package conflicts detected
error: failed to prepare transaction (conflicting dependencies)
:: qemu-kvm and qemu are in conflict
This patch was generated against master (commit d3d18a).
lib/libalpm/sync.c | 4 ++--
src/pacman/callback.c | 31 +++++++++++++++++++++----------
2 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 5428e40..4b54969 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -486,8 +486,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
pmpkg_t *sync = _alpm_pkg_find(trans->add, conflict->package1);
pmpkg_t *local = _alpm_db_get_pkgfromcache(db_local, conflict->package2);
int doremove = 0;
- QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, conflict->package1,
- conflict->package2, conflict->reason, &doremove);
+ QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, sync, local,
+ conflict->reason, &doremove);
if(doremove) {
/* append to the removes list */
_alpm_log(PM_LOG_DEBUG, "electing '%s' for removal\n", conflict->package2);
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 08c1cf3..b253546 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -266,19 +266,30 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,
alpm_pkg_get_name(data2));
break;
case PM_TRANS_CONV_CONFLICT_PKG:
- /* data parameters: target package, local package, conflict (strings) */
+ /* data parameters: target package, local package (pmpkg_t), conflict (string) */
/* print conflict only if it contains new information */
- if(strcmp(data1, data3) == 0 || strcmp(data2, data3) == 0) {
- *response = noyes(_(":: %s and %s are in conflict. Remove %s?"),
- (char *)data1,
- (char *)data2,
- (char *)data2);
+ if(strcmp(alpm_pkg_get_name(data1), data3) == 0
+ || strcmp(alpm_pkg_get_name(data2), data3) == 0) {
+ *response = noyes(_(":: %s%s%s-%s and %s-%s are in conflict. Remove %s?"),
+ /* The db will be NULL if the package was read from file. */
+ alpm_pkg_get_db(data1) == NULL ? "" : alpm_db_get_name(alpm_pkg_get_db(data1)),
+ alpm_pkg_get_db(data1) == NULL ? "" : "/",
+ alpm_pkg_get_name(data1),
+ alpm_pkg_get_version(data1),
+ alpm_pkg_get_name(data2),
+ alpm_pkg_get_version(data2),
+ alpm_pkg_get_name(data2));
} else {
- *response = noyes(_(":: %s and %s are in conflict (%s). Remove %s?"),
- (char *)data1,
- (char *)data2,
+ *response = noyes(_(":: %s%s%s-%s and %s-%s are in conflict (%s). Remove %s?"),
+ /* The db will be NULL if the package was read from file. */
+ alpm_pkg_get_db(data1) == NULL ? "" : alpm_db_get_name(alpm_pkg_get_db(data1)),
+ alpm_pkg_get_db(data1) == NULL ? "" : "/",
+ alpm_pkg_get_name(data1),
+ alpm_pkg_get_version(data1),
+ alpm_pkg_get_name(data2),
+ alpm_pkg_get_version(data2),
(char *)data3,
- (char *)data2);
+ alpm_pkg_get_name(data2));
}
break;
case PM_TRANS_CONV_REMOVE_PKGS:
--
1.7.4.4
More information about the pacman-dev
mailing list