Make it easier to ignore multiple packages.

This makes --ignore and --ignoregroup able to accept multiple
packages/groups by separating each with a comma.

For instance: pacman -Su --ignore kernel26,udev,glibc

This was requested in the comments of FS#8054.

Signed-off-by: Nathan Jones <nathanj@insightbb.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Nathan Jones 2007-11-13 19:32:56 -05:00 committed by Dan McGee
parent 70a91cbb22
commit 46ec9e3548
4 changed files with 55 additions and 4 deletions

View File

@ -267,11 +267,13 @@ Sync Options[[SO]]
*\--ignore* <'package'>::
Directs pacman to ignore upgrades of package even if there is one
available.
available. Multiple packages can be specified by separating them
with a comma.
*\--ignoregroup* <'group'>::
Directs pacman to ignore upgrades of all packages in 'group' even if
there is one available.
there is one available. Multiple groups can be specified by
separating them with a comma.
Handling Config Files[[HCF]]

View File

@ -315,6 +315,8 @@ static int parseargs(int argc, char *argv[])
};
while((opt = getopt_long(argc, argv, "ARUFQSTr:b:vkhscVfmnoldepituwygz", opts, &option_index))) {
alpm_list_t *list = NULL, *item = NULL; /* lists for splitting strings */
if(opt < 0) {
break;
}
@ -327,7 +329,13 @@ static int parseargs(int argc, char *argv[])
}
config->configfile = strndup(optarg, PATH_MAX);
break;
case 1002: alpm_option_add_ignorepkg(strdup(optarg)); break;
case 1002:
list = strsplit(optarg, ',');
for(item = list; item; item = alpm_list_next(item)) {
alpm_option_add_ignorepkg((char *)alpm_list_getdata(item));
}
FREELIST(list);
break;
case 1003:
/* debug levels are made more 'human readable' than using a raw logmask
* here, error and warning are set in config_new, though perhaps a
@ -371,7 +379,13 @@ static int parseargs(int argc, char *argv[])
}
config->have_logfile = 1;
break;
case 1010: alpm_option_add_ignoregrp(strdup(optarg)); break;
case 1010:
list = strsplit(optarg, ',');
for(item = list; item; item = alpm_list_next(item)) {
alpm_option_add_ignoregrp((char *)alpm_list_getdata(item));
}
FREELIST(list);
break;
case 'A': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_ADD); break;
case 'F':
config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_UPGRADE);

View File

@ -293,6 +293,40 @@ char *strreplace(const char *str, const char *needle, const char *replace)
return newstr;
}
/** Splits a string into a list of strings using the chosen character as
* a delimiter.
*
* @param str the string to split
* @param splitchar the character to split at
*
* @return a list containing the duplicated strings
*/
alpm_list_t *strsplit(const char *str, const char splitchar)
{
alpm_list_t *list = NULL;
const char *prev = str;
char *dup = NULL;
while((str = strchr(str, splitchar))) {
dup = strndup(prev, str - prev);
if(dup == NULL) {
return(NULL);
}
list = alpm_list_add(list, dup);
str++;
prev = str;
}
dup = strdup(prev);
if(dup == NULL) {
return(NULL);
}
list = alpm_list_add(list, strdup(prev));
return(list);
}
void list_display(const char *title, const alpm_list_t *list)
{
const alpm_list_t *i;

View File

@ -46,6 +46,7 @@ void indentprint(const char *str, int indent);
char *strtoupper(char *str);
char *strtrim(char *str);
char *strreplace(const char *str, const char *needle, const char *replace);
alpm_list_t *strsplit(const char *str, const char splitchar);
void list_display(const char *title, const alpm_list_t *list);
void display_targets(const alpm_list_t *syncpkgs, pmdb_t *db_local);
int yesno(char *fmt, ...);