summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pacman/list.c22
-rw-r--r--src/pacman/list.h1
-rw-r--r--src/pacman/sync.c20
3 files changed, 36 insertions, 7 deletions
diff --git a/src/pacman/list.c b/src/pacman/list.c
index 9f58c3ee..1556a675 100644
--- a/src/pacman/list.c
+++ b/src/pacman/list.c
@@ -170,4 +170,26 @@ void PM_LIST_display(const char *title, PM_LIST *list)
}
}
+/* Filter out any duplicate strings in a PM_LIST
+ *
+ * Not the most efficient way, but simple to implement -- we assemble
+ * a new list, using is_in() to check for dupes at each iteration.
+ *
+ * This function takes a PM_LIST* and returns a list_t*
+ *
+ */
+list_t *PM_LIST_remove_dupes(PM_LIST *list)
+{
+ PM_LIST *i;
+ list_t *newlist = NULL;
+
+ for(i = alpm_list_first(list); i; i = alpm_list_next(i)) {
+ char *data = alpm_list_getdata(i);
+ if(!list_is_strin(data, newlist)) {
+ newlist = list_add(newlist, strdup(data));
+ }
+ }
+ return newlist;
+}
+
/* vim: set ts=2 sw=2 noet: */
diff --git a/src/pacman/list.h b/src/pacman/list.h
index ca738f9e..13ad034a 100644
--- a/src/pacman/list.h
+++ b/src/pacman/list.h
@@ -39,6 +39,7 @@ int list_is_strin(char *needle, list_t *haystack);
void list_display(const char *title, list_t *list);
void PM_LIST_display(const char *title, PM_LIST *list);
+list_t *PM_LIST_remove_dupes(PM_LIST *list);
#endif /* _PM_LIST_H */
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 9d741c48..5fab26b3 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -474,22 +474,28 @@ int pacman_sync(list_t *targets)
sync_t *sync = j->data;
grp = alpm_db_readgrp(sync->db, targ);
if(grp) {
- PM_LIST *k, *pkgs;
+ PM_LIST *pmpkgs;
+ list_t *k, *pkgs;
MSG(NL, ":: group %s:\n", targ);
- pkgs = alpm_grp_getinfo(grp, PM_GRP_PKGNAMES);
- PM_LIST_display(" ", pkgs);
+ pmpkgs = alpm_grp_getinfo(grp, PM_GRP_PKGNAMES);
+ /* remove dupe entries in case a package exists in multiple repos */
+ /* (the dupe function takes a PM_LIST* and returns a list_t*) */
+ pkgs = PM_LIST_remove_dupes(pmpkgs);
+ /* */
+ list_display(" ", pkgs);
if(yesno(":: Install whole content? [Y/n] ")) {
- for(k = alpm_list_first(pkgs); k; k = alpm_list_next(k)) {
- targets = list_add(targets, strdup(alpm_list_getdata(k)));
+ for(k = pkgs; k; k = k->next) {
+ targets = list_add(targets, strdup(k->data));
}
} else {
- for(k = alpm_list_first(pkgs); k; k = alpm_list_next(k)) {
- char *pkgname = alpm_list_getdata(k);
+ for(k = pkgs; k; k = k->next) {
+ char *pkgname = k->data;
if(yesno(":: Install %s from group %s? [Y/n] ", pkgname, targ)) {
targets = list_add(targets, strdup(pkgname));
}
}
}
+ FREELIST(pkgs);
}
}
if(grp == NULL) {