Re: [pacman-dev] [PATCH v2] pacman+libalpm: print version names for conflicting packages

2019-12-10 Thread Allan McRae
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, >package1) == 0, goto error);
> + ASSERT(_alpm_pkg_dup(pkg2, >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 

[pacman-dev] [PATCH v2] pacman+libalpm: print version names for conflicting packages

2019-11-27 Thread morganamilo
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, >package1) == 0, goto error);
+   ASSERT(_alpm_pkg_dup(pkg2, >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 */
-