summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Jones <nathanj@insightbb.com>2007-11-13 19:32:56 -0500
committerDan McGee <dan@archlinux.org>2007-11-13 20:59:02 -0600
commit46ec9e3548b5b567c7eb18c360f54a77b6313b12 (patch)
tree0fd80f989cf93916e68fbd3e54146eb6516d756e
parent70a91cbb22bb3ec88d518e2e6c43553c53cde318 (diff)
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>
-rw-r--r--doc/pacman.8.txt6
-rw-r--r--src/pacman/pacman.c18
-rw-r--r--src/pacman/util.c34
-rw-r--r--src/pacman/util.h1
4 files changed, 55 insertions, 4 deletions
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index db7f9c3a..7b10bc0a 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -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]]
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 9f0293f8..31d31da1 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -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);
diff --git a/src/pacman/util.c b/src/pacman/util.c
index b91ec131..a0402ab0 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -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;
diff --git a/src/pacman/util.h b/src/pacman/util.h
index 4d17b179..931b456b 100644
--- a/src/pacman/util.h
+++ b/src/pacman/util.h
@@ -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, ...);