diff options
author | Xavier Chantry <shiningxc@gmail.com> | 2009-09-07 20:58:49 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2009-09-08 21:45:17 -0500 |
commit | f53d9bab0ef28f2417abb10d1dff4867bf06b8ea (patch) | |
tree | ae695d3ec6dc135b6ac7a8a43545186d509ba73a /src | |
parent | cd5b029e934476e8ea6dade5798bfa3d6b6ceafd (diff) | |
download | pacman-f53d9bab0ef28f2417abb10d1dff4867bf06b8ea.tar.xz |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/pacman/sync.c | 135 |
1 files changed, 71 insertions, 64 deletions
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 */ |