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


Reply via email to