pack-objects: don't traverse objects unnecessarily
[git/jnareb-git.git] / parse-options-cb.c
blob6db0921fc1fde3b5fbf829577bdd019ae95462e0
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_color_flag_cb(const struct option *opt, const char *arg,
37 int unset)
39 int value;
41 if (!arg)
42 arg = unset ? "never" : (const char *)opt->defval;
43 value = git_config_colorbool(NULL, arg);
44 if (value < 0)
45 return opterror(opt,
46 "expects \"always\", \"auto\", or \"never\"", 0);
47 *(int *)opt->value = value;
48 return 0;
51 int parse_opt_verbosity_cb(const struct option *opt, const char *arg,
52 int unset)
54 int *target = opt->value;
56 if (unset)
57 /* --no-quiet, --no-verbose */
58 *target = 0;
59 else if (opt->short_name == 'v') {
60 if (*target >= 0)
61 (*target)++;
62 else
63 *target = 1;
64 } else {
65 if (*target <= 0)
66 (*target)--;
67 else
68 *target = -1;
70 return 0;
73 int parse_opt_with_commit(const struct option *opt, const char *arg, int unset)
75 unsigned char sha1[20];
76 struct commit *commit;
78 if (!arg)
79 return -1;
80 if (get_sha1(arg, sha1))
81 return error("malformed object name %s", arg);
82 commit = lookup_commit_reference(sha1);
83 if (!commit)
84 return error("no such commit %s", arg);
85 commit_list_insert(commit, opt->value);
86 return 0;
89 int parse_opt_tertiary(const struct option *opt, const char *arg, int unset)
91 int *target = opt->value;
92 *target = unset ? 2 : 1;
93 return 0;
96 int parse_options_concat(struct option *dst, size_t dst_size, struct option *src)
98 int i, j;
100 for (i = 0; i < dst_size; i++)
101 if (dst[i].type == OPTION_END)
102 break;
103 for (j = 0; i < dst_size; i++, j++) {
104 dst[i] = src[j];
105 if (src[j].type == OPTION_END)
106 return 0;
108 return -1;
111 int parse_opt_string_list(const struct option *opt, const char *arg, int unset)
113 struct string_list *v = opt->value;
115 if (unset) {
116 string_list_clear(v, 0);
117 return 0;
120 if (!arg)
121 return -1;
123 string_list_append(v, xstrdup(arg));
124 return 0;