summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f77bcca)
raw | patch | inline | side by side (parent: f77bcca)
author | Jeff King <peff@peff.net> | |
Thu, 9 Jun 2011 15:55:23 +0000 (11:55 -0400) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Wed, 22 Jun 2011 18:25:20 +0000 (11:25 -0700) |
This just adds repeated invocations of an option to a list
of strings. Using the "--no-<var>" form will reset the list
to empty.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
of strings. Using the "--no-<var>" form will reset the list
to empty.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
parse-options.c | patch | blob | history | |
parse-options.h | patch | blob | history | |
t/t0040-parse-options.sh | patch | blob | history | |
test-parse-options.c | patch | blob | history |
diff --git a/parse-options.c b/parse-options.c
index 73bd28ad90986af1618d82176076133186d045de..879ea82a3158ca5e6d4ca397e0c2dd2265e15edc 100644 (file)
--- a/parse-options.c
+++ b/parse-options.c
#include "cache.h"
#include "commit.h"
#include "color.h"
+#include "string-list.h"
static int parse_options_usage(struct parse_opt_ctx_t *ctx,
const char * const *usagestr,
@@ -687,3 +688,19 @@ int parse_options_concat(struct option *dst, size_t dst_size, struct option *src
}
return -1;
}
+
+int parse_opt_string_list(const struct option *opt, const char *arg, int unset)
+{
+ struct string_list *v = opt->value;
+
+ if (unset) {
+ string_list_clear(v, 0);
+ return 0;
+ }
+
+ if (!arg)
+ return -1;
+
+ string_list_append(v, xstrdup(arg));
+ return 0;
+}
diff --git a/parse-options.h b/parse-options.h
index d1b12fe979b34ac9bbf2ff637934b96f3878a53d..05eb09b878fd94cfcc549622a35a0b897fa56cb9 100644 (file)
--- a/parse-options.h
+++ b/parse-options.h
(h), PARSE_OPT_NOARG, NULL, (p) }
#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), "n", (h) }
#define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) }
+#define OPT_STRING_LIST(s, l, v, a, h) \
+ { OPTION_CALLBACK, (s), (l), (v), (a), \
+ (h), 0, &parse_opt_string_list }
#define OPT_UYN(s, l, v, h) { OPTION_CALLBACK, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG, &parse_opt_tertiary }
#define OPT_DATE(s, l, v, h) \
extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
extern int parse_opt_with_commit(const struct option *, const char *, int);
extern int parse_opt_tertiary(const struct option *, const char *, int);
+extern int parse_opt_string_list(const struct option *, const char *, int);
#define OPT__VERBOSE(var, h) OPT_BOOLEAN('v', "verbose", (var), (h))
#define OPT__QUIET(var, h) OPT_BOOLEAN('q', "quiet", (var), (h))
index ae266147b6db9e06abeb4dc30e4271b6c611deac..007f39d5e1dca6eff7e01969282c4cf2dc1bb57a 100755 (executable)
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
--st <st> get another string (pervert ordering)
-o <str> get another string
--default-string set string to default
+ --list <str> add str to list
Magic arguments
--quux means --quux
test_cmp expect output
'
+cat >>expect <<'EOF'
+list: foo
+list: bar
+list: baz
+EOF
+test_expect_success '--list keeps list of strings' '
+ test-parse-options --list foo --list=bar --list=baz >output &&
+ test_cmp expect output
+'
+
+test_expect_success '--no-list resets list' '
+ test-parse-options --list=other --list=irrelevant --list=options \
+ --no-list --list=foo --list=bar --list=baz >output &&
+ test_cmp expect output
+'
+
test_done
diff --git a/test-parse-options.c b/test-parse-options.c
index 4e3710b9a8fc868642e1e0e8f4af37eeb1ce0ce4..91a5701657556e07b4f4daafa947346d3b197cd1 100644 (file)
--- a/test-parse-options.c
+++ b/test-parse-options.c
#include "cache.h"
#include "parse-options.h"
+#include "string-list.h"
static int boolean = 0;
static int integer = 0;
static char *string = NULL;
static char *file = NULL;
static int ambiguous;
+static struct string_list list;
static int length_callback(const struct option *opt, const char *arg, int unset)
{
OPT_STRING('o', NULL, &string, "str", "get another string"),
OPT_SET_PTR(0, "default-string", &string,
"set string to default", (unsigned long)"default"),
+ OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
OPT_GROUP("Magic arguments"),
OPT_ARGUMENT("quux", "means --quux"),
OPT_NUMBER_CALLBACK(&integer, "set integer to NUM",
printf("dry run: %s\n", dry_run ? "yes" : "no");
printf("file: %s\n", file ? file : "(not set)");
+ for (i = 0; i < list.nr; i++)
+ printf("list: %s\n", list.items[i].string);
+
for (i = 0; i < argc; i++)
printf("arg %02d: %s\n", i, argv[i]);