cmd_config(): make a copy of path obtained from git_path()
[git/mjg.git] / parse-options-cb.c
blobbe8c413cfebb414bcbb7815cf4fe42bc31444d65
1 #include "git-compat-util.h"
2 #include "parse-options.h"
3 #include "cache.h"
4 #include "commit.h"
5 #include "color.h"
6 #include "string-list.h"
8 /*----- some often used options -----*/
10 int parse_opt_abbrev_cb(const struct option *opt, const char *arg, int unset)
12 int v;
14 if (!arg) {
15 v = unset ? 0 : DEFAULT_ABBREV;
16 } else {
17 v = strtol(arg, (char **)&arg, 10);
18 if (*arg)
19 return opterror(opt, "expects a numerical value", 0);
20 if (v && v < MINIMUM_ABBREV)
21 v = MINIMUM_ABBREV;
22 else if (v > 40)
23 v = 40;
25 *(int *)(opt->value) = v;
26 return 0;
29 int parse_opt_approxidate_cb(const struct option *opt, const char *arg,
30 int unset)
32 *(unsigned long *)(opt->value) = approxidate(arg);
33 return 0;
36 int parse_opt_expiry_date_cb(const struct option *opt, const char *arg,
37 int unset)
39 return parse_expiry_date(arg, (unsigned long *)opt->value);
42 int parse_opt_color_flag_cb(const struct option *opt, const char *arg,
43 int unset)
45 int value;
47 if (!arg)
48 arg = unset ? "never" : (const char *)opt->defval;
49 value = git_config_colorbool(NULL, arg);
50 if (value < 0)
51 return opterror(opt,
52 "expects \"always\", \"auto\", or \"never\"", 0);
53 *(int *)opt->value = value;
54 return 0;
57 int parse_opt_verbosity_cb(const struct option *opt, const char *arg,
58 int unset)
60 int *target = opt->value;
62 if (unset)
63 /* --no-quiet, --no-verbose */
64 *target = 0;
65 else if (opt->short_name == 'v') {
66 if (*target >= 0)
67 (*target)++;
68 else
69 *target = 1;
70 } else {
71 if (*target <= 0)
72 (*target)--;
73 else
74 *target = -1;
76 return 0;
79 int parse_opt_with_commit(const struct option *opt, const char *arg, int unset)
81 unsigned char sha1[20];
82 struct commit *commit;
84 if (!arg)
85 return -1;
86 if (get_sha1(arg, sha1))
87 return error("malformed object name %s", arg);
88 commit = lookup_commit_reference(sha1);
89 if (!commit)
90 return error("no such commit %s", arg);
91 commit_list_insert(commit, opt->value);
92 return 0;
95 int parse_opt_tertiary(const struct option *opt, const char *arg, int unset)
97 int *target = opt->value;
98 *target = unset ? 2 : 1;
99 return 0;
102 int parse_options_concat(struct option *dst, size_t dst_size, struct option *src)
104 int i, j;
106 for (i = 0; i < dst_size; i++)
107 if (dst[i].type == OPTION_END)
108 break;
109 for (j = 0; i < dst_size; i++, j++) {
110 dst[i] = src[j];
111 if (src[j].type == OPTION_END)
112 return 0;
114 return -1;
117 int parse_opt_string_list(const struct option *opt, const char *arg, int unset)
119 struct string_list *v = opt->value;
121 if (unset) {
122 string_list_clear(v, 0);
123 return 0;
126 if (!arg)
127 return -1;
129 string_list_append(v, xstrdup(arg));
130 return 0;
133 int parse_opt_noop_cb(const struct option *opt, const char *arg, int unset)
135 return 0;