Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pacman/sync.c110
1 files changed, 95 insertions, 15 deletions
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 7353f7ee..deda77d4 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -590,6 +590,84 @@ static alpm_list_t *syncfirst(void) {
return(res);
}
+static pmdb_t *get_db(const char *dbname)
+{
+ alpm_list_t *i;
+ for(i = alpm_option_get_syncdbs(); i; i = i->next) {
+ pmdb_t *db = i->data;
+ if(strcmp(alpm_db_get_name(db), dbname) == 0) {
+ return(db);
+ }
+ }
+ return(NULL);
+}
+
+static int process_pkg(pmpkg_t *pkg)
+{
+ int ret = alpm_add_pkg(pkg);
+
+ if(ret == -1) {
+ if(pm_errno == PM_ERR_TRANS_DUP_TARGET
+ || pm_errno == PM_ERR_PKG_IGNORED) {
+ /* just skip duplicate or ignored targets */
+ pm_printf(PM_LOG_WARNING, _("skipping target: %s\n"), alpm_pkg_get_name(pkg));
+ return(0);
+ } else {
+ pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n", alpm_pkg_get_name(pkg),
+ alpm_strerrorlast());
+ return(1);
+ }
+ }
+ return(0);
+}
+
+static int process_group(alpm_list_t *dbs, char *group)
+{
+ int ret = 0;
+ alpm_list_t *i;
+ alpm_list_t *pkgs = alpm_find_grp_pkgs(dbs, group);
+ int count = alpm_list_count(pkgs);
+
+ if(!count) {
+ pm_fprintf(stderr, PM_LOG_ERROR, _("target not found: %s\n"), group);
+ return(1);
+ }
+
+ printf(_(":: There are %d members in group %s:\n"), count,
+ group);
+ select_display(pkgs);
+ select_question(count,
+ _("Which ones do you want to install?"));
+ char *array = malloc(count);
+ memset(array, 1, count);
+ int n = 0;
+ for(i = pkgs; i; i = alpm_list_next(i)) {
+ if(array[n++] == 0)
+ continue;
+ pmpkg_t *pkg = alpm_list_getdata(i);
+
+ if(process_pkg(pkg) == 1) {
+ ret = 1;
+ goto cleanup;
+ }
+ }
+cleanup:
+ alpm_list_free(pkgs);
+ free(array);
+ return(ret);
+}
+
+static int process_targname(alpm_list_t *dblist, char *targname)
+{
+ pmpkg_t *pkg = alpm_find_dbs_satisfier(dblist, targname);
+
+ if(pkg) {
+ return(process_pkg(pkg));
+ }
+ /* fallback on group */
+ return(process_group(dblist, targname));
+}
+
static int process_target(char *target)
{
/* process targets */
@@ -597,28 +675,30 @@ static int process_target(char *target)
char *targname = strchr(targstring, '/');
char *dbname = NULL;
int ret = 0;
+ alpm_list_t *dblist = NULL;
+
if(targname) {
+ pmdb_t *db = NULL;
+
*targname = '\0';
targname++;
dbname = targstring;
- ret = alpm_sync_dbtarget(dbname,targname);
- } else {
- targname = targstring;
- ret = alpm_sync_target(targname);
- }
-
- if(ret == -1) {
- if(pm_errno == PM_ERR_TRANS_DUP_TARGET
- || pm_errno == PM_ERR_PKG_IGNORED) {
- /* just skip duplicate or ignored targets */
- pm_printf(PM_LOG_WARNING, _("skipping target: %s\n"), target);
- } else {
- pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n", target,
- alpm_strerrorlast());
+ db = get_db(dbname);
+ if(!db) {
+ pm_fprintf(stderr, PM_LOG_ERROR, _("database not found: %s\n"),
+ dbname);
ret = 1;
+ goto cleanup;
}
+ dblist = alpm_list_add(dblist, db);
+ ret = process_targname(dblist, targname);
+ alpm_list_free(dblist);
+ } else {
+ targname = targstring;
+ dblist = alpm_option_get_syncdbs();
+ ret = process_targname(dblist, targname);
}
-
+cleanup:
free(targstring);
return(ret);
}