builtin/send-pack.c: use parse_options API
The old option parsing code in this plumbing command predates this API, so option parsing was done more manually. Using the new API brings send-pack more in line with push, and accepts new variants like --no-* for negating options. Signed-off-by: Dave Borowitz <dborowitz@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Dave Borowitz committed
Aug 19, 2015 at 11:26 UTC
068c77a5189584de2a8d9c2ad29e2370159444ae
1 file changed
+59
-104
builtin/send-pack.c
+59
-104
@@ -12,10 +12,15 @@
12
#include "version.h"
13
#include "sha1-array.h"
14
#include "gpg-interface.h"
15
+#include "gettext.h"
16
16
-static const char send_pack_usage[] =
17
-"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> [<ref>...]\n"
18
-" --all and explicit <ref> specification are mutually exclusive.";
17
+static const char * const send_pack_usage[] = {
18
+ N_("git send-pack [--all | --mirror] [--dry-run] [--force] "
19
+ "[--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] "
20
+ "[<host>:]<directory> [<ref>...]\n"
21
+ " --all and explicit <ref> specification are mutually exclusive."),
22
+ NULL,
23
+};
24
25
static struct send_pack_args args;
26
@@ -107,116 +112,66 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
112
int ret;
113
int helper_status = 0;
114
int send_all = 0;
115
+ int verbose = 0;
116
const char *receivepack = "git-receive-pack";
117
+ unsigned dry_run = 0;
118
+ unsigned send_mirror = 0;
119
+ unsigned force_update = 0;
120
+ unsigned quiet = 0;
121
+ unsigned push_cert = 0;
122
+ unsigned use_thin_pack = 0;
123
+ unsigned atomic = 0;
124
+ unsigned stateless_rpc = 0;
125
int flags;
126
unsigned int reject_reasons;
127
int progress = -1;
128
int from_stdin = 0;
129
struct push_cas_option cas = {0};
130
117
- git_config(git_gpg_config, NULL);
131
+ struct option options[] = {
132
+ OPT__VERBOSITY(&verbose),
133
+ OPT_STRING(0, "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
134
+ OPT_STRING(0, "exec", &receivepack, "receive-pack", N_("receive pack program")),
135
+ OPT_STRING(0, "remote", &remote_name, "remote", N_("remote name")),
136
+ OPT_BOOL(0, "all", &send_all, N_("push all refs")),
137
+ OPT_BOOL('n' , "dry-run", &dry_run, N_("dry run")),
138
+ OPT_BOOL(0, "mirror", &send_mirror, N_("mirror all refs")),
139
+ OPT_BOOL('f', "force", &force_update, N_("force updates")),
140
+ OPT_BOOL(0, "signed", &push_cert, N_("GPG sign the push")),
141
+ OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
142
+ OPT_BOOL(0, "thin", &use_thin_pack, N_("use thin pack")),
143
+ OPT_BOOL(0, "atomic", &atomic, N_("request atomic transaction on remote side")),
144
+ OPT_BOOL(0, "stateless-rpc", &stateless_rpc, N_("use stateless RPC protocol")),
145
+ OPT_BOOL(0, "stdin", &from_stdin, N_("read refs from stdin")),
146
+ OPT_BOOL(0, "helper-status", &helper_status, N_("print status from remote helper")),
147
+ { OPTION_CALLBACK,
148
+ 0, CAS_OPT_NAME, &cas, N_("refname>:<expect"),
149
+ N_("require old value of ref to be at this value"),
150
+ PARSE_OPT_OPTARG, parseopt_push_cas_option },
151
+ OPT_END()
152
+ };
153
119
- argv++;
120
- for (i = 1; i < argc; i++, argv++) {
121
- const char *arg = *argv;
122
-
123
- if (*arg == '-') {
124
- if (starts_with(arg, "--receive-pack=")) {
125
- receivepack = arg + 15;
126
- continue;
127
- }
128
- if (starts_with(arg, "--exec=")) {
129
- receivepack = arg + 7;
130
- continue;
131
- }
132
- if (starts_with(arg, "--remote=")) {
133
- remote_name = arg + 9;
134
- continue;
135
- }
136
- if (!strcmp(arg, "--all")) {
137
- send_all = 1;
138
- continue;
139
- }
140
- if (!strcmp(arg, "--dry-run")) {
141
- args.dry_run = 1;
142
- continue;
143
- }
144
- if (!strcmp(arg, "--mirror")) {
145
- args.send_mirror = 1;
146
- continue;
147
- }
148
- if (!strcmp(arg, "--force")) {
149
- args.force_update = 1;
150
- continue;
151
- }
152
- if (!strcmp(arg, "--quiet")) {
153
- args.quiet = 1;
154
- continue;
155
- }
156
- if (!strcmp(arg, "--verbose")) {
157
- args.verbose = 1;
158
- continue;
159
- }
160
- if (!strcmp(arg, "--signed")) {
161
- args.push_cert = 1;
162
- continue;
163
- }
164
- if (!strcmp(arg, "--progress")) {
165
- progress = 1;
166
- continue;
167
- }
168
- if (!strcmp(arg, "--no-progress")) {
169
- progress = 0;
170
- continue;
171
- }
172
- if (!strcmp(arg, "--thin")) {
173
- args.use_thin_pack = 1;
174
- continue;
175
- }
176
- if (!strcmp(arg, "--atomic")) {
177
- args.atomic = 1;
178
- continue;
179
- }
180
- if (!strcmp(arg, "--stateless-rpc")) {
181
- args.stateless_rpc = 1;
182
- continue;
183
- }
184
- if (!strcmp(arg, "--stdin")) {
185
- from_stdin = 1;
186
- continue;
187
- }
188
- if (!strcmp(arg, "--helper-status")) {
189
- helper_status = 1;
190
- continue;
191
- }
192
- if (!strcmp(arg, "--" CAS_OPT_NAME)) {
193
- if (parse_push_cas_option(&cas, NULL, 0) < 0)
194
- exit(1);
195
- continue;
196
- }
197
- if (!strcmp(arg, "--no-" CAS_OPT_NAME)) {
198
- if (parse_push_cas_option(&cas, NULL, 1) < 0)
199
- exit(1);
200
- continue;
201
- }
202
- if (starts_with(arg, "--" CAS_OPT_NAME "=")) {
203
- if (parse_push_cas_option(&cas,
204
- strchr(arg, '=') + 1, 0) < 0)
205
- exit(1);
206
- continue;
207
- }
208
- usage(send_pack_usage);
209
- }
210
- if (!dest) {
211
- dest = arg;
212
- continue;
213
- }
214
- refspecs = (const char **) argv;
215
- nr_refspecs = argc - i;
216
- break;
154
+ git_config(git_gpg_config, NULL);
155
+ argc = parse_options(argc, argv, prefix, options, send_pack_usage, 0);
156
+ if (argc > 0) {
157
+ dest = argv[0];
158
+ refspecs = (const char **)(argv + 1);
159
+ nr_refspecs = argc - 1;
160
}
161
+
162
if (!dest)
219
- usage(send_pack_usage);
163
+ usage_with_options(send_pack_usage, options);
164
+
165
+ args.verbose = verbose;
166
+ args.dry_run = dry_run;
167
+ args.send_mirror = send_mirror;
168
+ args.force_update = force_update;
169
+ args.quiet = quiet;
170
+ args.push_cert = push_cert;
171
+ args.progress = progress;
172
+ args.use_thin_pack = use_thin_pack;
173
+ args.atomic = atomic;
174
+ args.stateless_rpc = stateless_rpc;
175
176
if (from_stdin) {
177
struct argv_array all_refspecs = ARGV_ARRAY_INIT;
@@ -245,7 +200,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
200
*/
201
if ((refspecs && (send_all || args.send_mirror)) ||
202
(send_all && args.send_mirror))
248
- usage(send_pack_usage);
203
+ usage_with_options(send_pack_usage, options);
204
205
if (remote_name) {
206
remote = remote_get(remote_name);