From 250331a636699561e1239e341f30f2adfebbcb43 Mon Sep 17 00:00:00 2001 From: Chantry Xavier Date: Thu, 22 Nov 2007 21:01:45 +0100 Subject: [PATCH] Add new --needed option for -S. During a pacman operation such as a group install, pacman can ask several questions such as "local version is up to date. Upgrade anyway?". They are usually all answered either by yes or by no: * yes when you want to reinstall all the targets. * no when you only want to install the missing ones (either because you are installing a group, or because you are copying a pacman -S line from wiki or whatever). So instead of asking this question for each target, it is now now configured with a flag. Yes will be the default -S behavior, No will be achieved with the --needed flag. Signed-off-by: Chantry Xavier Signed-off-by: Dan McGee --- contrib/bash_completion | 1 + doc/pacman.8.txt | 3 +++ lib/libalpm/alpm.h | 5 +++-- lib/libalpm/sync.c | 17 ++++++++--------- src/pacman/callback.c | 11 ----------- src/pacman/pacman.c | 13 ++++++++----- 6 files changed, 23 insertions(+), 27 deletions(-) diff --git a/contrib/bash_completion b/contrib/bash_completion index 844396d3..a96780dd 100644 --- a/contrib/bash_completion +++ b/contrib/bash_completion @@ -270,6 +270,7 @@ _pacman () -u --sysupgrade \ -w --downloadonly \ -y --refresh \ + --needed \ --ignore \ --config \ --logfile \ diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt index 887f9122..9e00d36e 100644 --- a/doc/pacman.8.txt +++ b/doc/pacman.8.txt @@ -261,6 +261,9 @@ Sync Options[[SO]] '\--sysupgrade' or '-u'. Passing two '\--refresh' or '-y' flags will force a refresh of all package lists even if they are thought to be up to date. +*\--needed*:: + Only install the targets that are not already installed and up-to-date. + *\--ignore* <'package'>:: Directs pacman to ignore upgrades of package even if there is one available. Multiple packages can be specified by separating them diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 335ce39e..1e18ad95 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -280,7 +280,8 @@ typedef enum _pmtransflag_t { PM_TRANS_FLAG_DOWNLOADONLY = 0x200, PM_TRANS_FLAG_NOSCRIPTLET = 0x400, PM_TRANS_FLAG_NOCONFLICTS = 0x800, - PM_TRANS_FLAG_PRINTURIS = 0x1000 + PM_TRANS_FLAG_PRINTURIS = 0x1000, + PM_TRANS_FLAG_NEEDED = 0x2000 } pmtransflag_t; /* Transaction Events */ @@ -321,7 +322,7 @@ typedef enum _pmtransconv_t { PM_TRANS_CONV_CONFLICT_PKG = 0x04, PM_TRANS_CONV_CORRUPTED_PKG = 0x08, PM_TRANS_CONV_LOCAL_NEWER = 0x10, - PM_TRANS_CONV_LOCAL_UPTODATE = 0x20, + /* 0x20 flag can go here */ PM_TRANS_CONV_REMOVE_HOLDPKG = 0x40 } pmtransconv_t; diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 5e58400f..f6b130d2 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -349,15 +349,14 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy local = _alpm_db_get_pkgfromcache(db_local, alpm_pkg_get_name(spkg)); if(local) { if(alpm_pkg_compare_versions(local, spkg) == 0) { - /* spkg is NOT an upgrade, get confirmation before adding */ - if(!(trans->flags & PM_TRANS_FLAG_PRINTURIS)) { - int resp = 0; - QUESTION(trans, PM_TRANS_CONV_LOCAL_UPTODATE, local, NULL, NULL, &resp); - if(!resp) { - _alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"), - alpm_pkg_get_name(local), alpm_pkg_get_version(local)); - return(0); - } + /* spkg is NOT an upgrade */ + if(trans->flags & PM_TRANS_FLAG_NEEDED) { + _alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"), + alpm_pkg_get_name(local), alpm_pkg_get_version(local)); + return(0); + } else { + _alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"), + alpm_pkg_get_name(local), alpm_pkg_get_version(local)); } } } diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 232ca4cd..dd469ecc 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -305,7 +305,6 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2, *response = yesno(str); break; case PM_TRANS_CONV_LOCAL_NEWER: - if(!config->op_s_downloadonly) { snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is newer. Upgrade anyway? [Y/n] "), alpm_pkg_get_name(data1), @@ -315,16 +314,6 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2, *response = 1; } break; - case PM_TRANS_CONV_LOCAL_UPTODATE: - if(!config->op_s_downloadonly) { - snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is up to date. Upgrade anyway? [Y/n] "), - alpm_pkg_get_name(data1), - alpm_pkg_get_version(data1)); - *response = yesno(str); - } else { - *response = 1; - } - break; case PM_TRANS_CONV_CORRUPTED_PKG: if(!config->noconfirm) { snprintf(str, LOG_STR_LEN, _(":: File %s is corrupted. Do you want to delete it? [Y/n] "), diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 3f4af22c..19d8b2a4 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -129,6 +129,7 @@ static void usage(int op, const char * const myname) printf(_(" -u, --sysupgrade upgrade all packages that are out of date\n")); printf(_(" -w, --downloadonly download packages but do not install/upgrade anything\n")); printf(_(" -y, --refresh download fresh package databases from the server\n")); + printf(_(" --needed only install outdated or not yet installed packages\n")); printf(_(" --ignore ignore a package upgrade (can be used more than once)\n")); printf(_(" --ignoregroup \n" " ignore a group upgrade (can be used more than once)\n")); @@ -261,8 +262,8 @@ static int parseargs(int argc, char *argv[]) {"info", no_argument, 0, 'i'}, {"dbonly", no_argument, 0, 'k'}, {"list", no_argument, 0, 'l'}, - {"nosave", no_argument, 0, 'n'}, {"foreign", no_argument, 0, 'm'}, + {"nosave", no_argument, 0, 'n'}, {"owns", no_argument, 0, 'o'}, {"file", no_argument, 0, 'p'}, {"print-uris", no_argument, 0, 'p'}, @@ -286,10 +287,11 @@ static int parseargs(int argc, char *argv[]) {"asdeps", no_argument, 0, 1008}, {"logfile", required_argument, 0, 1009}, {"ignoregroup", required_argument, 0, 1010}, + {"needed", no_argument, 0, 1011}, {0, 0, 0, 0} }; - while((opt = getopt_long(argc, argv, "ARUFQSTr:b:vkhscVfmnoldepituwygzq", opts, &option_index))) { + while((opt = getopt_long(argc, argv, "ARUFQSTr:b:vkhscVfmnoldepqituwygz", opts, &option_index))) { alpm_list_t *list = NULL, *item = NULL; /* lists for splitting strings */ if(opt < 0) { @@ -361,6 +363,7 @@ static int parseargs(int argc, char *argv[]) } FREELIST(list); break; + case 1011: config->flags |= PM_TRANS_FLAG_NEEDED; break; case 'A': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_ADD); break; case 'Q': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_QUERY); break; case 'R': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_REMOVE); break; @@ -402,6 +405,9 @@ static int parseargs(int argc, char *argv[]) config->op_q_isfile = 1; config->flags |= PM_TRANS_FLAG_PRINTURIS; break; + case 'q': + config->quiet = 1; + break; case 'r': if(alpm_option_set_root(optarg) != 0) { pm_printf(PM_LOG_ERROR, _("problem setting root '%s' (%s)\n"), @@ -429,9 +435,6 @@ static int parseargs(int argc, char *argv[]) config->flags |= PM_TRANS_FLAG_NOCONFLICTS; break; case 'y': (config->op_s_sync)++; break; - case 'q': - config->quiet = 1; - break; case '?': return(1); default: return(1); }