From f53d9bab0ef28f2417abb10d1dff4867bf06b8ea Mon Sep 17 00:00:00 2001
From: Xavier Chantry <shiningxc@gmail.com>
Date: Mon, 7 Sep 2009 20:58:49 +0200
Subject: Allow '-Su foo' operation

This implements FS#15581

'-Su foo' should be more or less equivalent do '-Su ; -S foo'

Note : I moved a block of code to a new process_target function

Signed-off-by: Xavier Chantry <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
---
 src/pacman/sync.c | 135 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 71 insertions(+), 64 deletions(-)

(limited to 'src/pacman')

diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 4f101f99..58f60476 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -548,18 +548,88 @@ static alpm_list_t *syncfirst() {
 	return(res);
 }
 
+static int process_target(char *targ, alpm_list_t *targets)
+{
+	alpm_list_t *sync_dbs = alpm_option_get_syncdbs();
+
+	if(alpm_trans_addtarget(targ) == -1) {
+		pmgrp_t *grp = NULL;
+		int found = 0;
+		alpm_list_t *j;
+
+		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"), targ);
+			return(0);
+		}
+		if(pm_errno != PM_ERR_PKG_NOT_FOUND) {
+			pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n",
+					targ, alpm_strerrorlast());
+			return(1);
+		}
+		/* target not found: check if it's a group */
+		printf(_("%s package not found, searching for group...\n"), targ);
+		for(j = sync_dbs; j; j = alpm_list_next(j)) {
+			pmdb_t *db = alpm_list_getdata(j);
+			grp = alpm_db_readgrp(db, targ);
+			if(grp) {
+				alpm_list_t *k, *pkgnames = NULL;
+
+				found++;
+				printf(_(":: group %s (including ignored packages):\n"), targ);
+				/* remove dupe entries in case a package exists in multiple repos */
+				alpm_list_t *grppkgs = alpm_grp_get_pkgs(grp);
+				alpm_list_t *pkgs = alpm_list_remove_dupes(grppkgs);
+				for(k = pkgs; k; k = alpm_list_next(k)) {
+					pkgnames = alpm_list_add(pkgnames,
+							(char*)alpm_pkg_get_name(k->data));
+				}
+				list_display("   ", pkgnames);
+				if(yesno(_(":: Install whole content?"))) {
+					for(k = pkgnames; k; k = alpm_list_next(k)) {
+						targets = alpm_list_add(targets, strdup(alpm_list_getdata(k)));
+					}
+				} else {
+					for(k = pkgnames; k; k = alpm_list_next(k)) {
+						char *pkgname = alpm_list_getdata(k);
+						if(yesno(_(":: Install %s from group %s?"), pkgname, targ)) {
+							targets = alpm_list_add(targets, strdup(pkgname));
+						}
+					}
+				}
+				alpm_list_free(pkgnames);
+				alpm_list_free(pkgs);
+			}
+		}
+		if(!found) {
+			pm_fprintf(stderr, PM_LOG_ERROR, _("'%s': not found in sync db\n"), targ);
+			return(1);
+		}
+	}
+	return(0);
+}
+
 static int sync_trans(alpm_list_t *targets)
 {
 	int retval = 0;
 	alpm_list_t *data = NULL;
-	alpm_list_t *sync_dbs = alpm_option_get_syncdbs();
 	alpm_list_t *packages = NULL;
+	alpm_list_t *i;
 
 	/* Step 1: create a new transaction... */
 	if(trans_init(PM_TRANS_TYPE_SYNC, config->flags) == -1) {
 		return(1);
 	}
 
+	/* process targets */
+	for(i = targets; i; i = alpm_list_next(i)) {
+		char *targ = alpm_list_getdata(i);
+		if(process_target(targ, targets) == 1) {
+			retval = 1;
+			goto cleanup;
+		}
+	}
+
 	if(config->op_s_upgrade) {
 		printf(_(":: Starting full system upgrade...\n"));
 		alpm_logaction("starting full system upgrade\n");
@@ -568,69 +638,6 @@ static int sync_trans(alpm_list_t *targets)
 			retval = 1;
 			goto cleanup;
 		}
-	} else {
-		alpm_list_t *i;
-
-		/* process targets */
-		for(i = targets; i; i = alpm_list_next(i)) {
-			char *targ = alpm_list_getdata(i);
-			if(alpm_trans_addtarget(targ) == -1) {
-				pmgrp_t *grp = NULL;
-				int found = 0;
-				alpm_list_t *j;
-
-				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"), targ);
-					continue;
-				}
-				if(pm_errno != PM_ERR_PKG_NOT_FOUND) {
-					pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n",
-							targ, alpm_strerrorlast());
-					retval = 1;
-					goto cleanup;
-				}
-				/* target not found: check if it's a group */
-				printf(_("%s package not found, searching for group...\n"), targ);
-				for(j = sync_dbs; j; j = alpm_list_next(j)) {
-					pmdb_t *db = alpm_list_getdata(j);
-					grp = alpm_db_readgrp(db, targ);
-					if(grp) {
-						alpm_list_t *k, *pkgnames = NULL;
-
-						found++;
-						printf(_(":: group %s (including ignored packages):\n"), targ);
-						/* remove dupe entries in case a package exists in multiple repos */
-						alpm_list_t *grppkgs = alpm_grp_get_pkgs(grp);
-						alpm_list_t *pkgs = alpm_list_remove_dupes(grppkgs);
-						for(k = pkgs; k; k = alpm_list_next(k)) {
-							pkgnames = alpm_list_add(pkgnames,
-									(char*)alpm_pkg_get_name(k->data));
-						}
-						list_display("   ", pkgnames);
-						if(yesno(_(":: Install whole content?"))) {
-							for(k = pkgnames; k; k = alpm_list_next(k)) {
-								targets = alpm_list_add(targets, strdup(alpm_list_getdata(k)));
-							}
-						} else {
-							for(k = pkgnames; k; k = alpm_list_next(k)) {
-								char *pkgname = alpm_list_getdata(k);
-								if(yesno(_(":: Install %s from group %s?"), pkgname, targ)) {
-									targets = alpm_list_add(targets, strdup(pkgname));
-								}
-							}
-						}
-						alpm_list_free(pkgnames);
-						alpm_list_free(pkgs);
-					}
-				}
-				if(!found) {
-					pm_fprintf(stderr, PM_LOG_ERROR, _("'%s': not found in sync db\n"), targ);
-					retval = 1;
-					goto cleanup;
-				}
-			}
-		}
 	}
 
 	/* Step 2: "compute" the transaction based on targets and flags */
-- 
cgit v1.2.3-70-g09d2