@matheusbsbs / matheus-bagliano / commits / 489e351ea0
Fork 0

archive: remove extra arguments parsing code

Replace the code that calls backend specific argument parsers by a simple flag mechanism. This reduces code size and complexity. We can add back such a mechanism (based on incremental parse_opt(), perhaps) when we need it. The compression level parameter, though, is going to be shared by future compressing backends like tgz. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Jul 14, 2008 at 21:22 UTC 489e351ea03e78746bad0c0ad4fcf4a63920256d
3 files changed +17 -31
archive-zip.c
-13
@@ -282,16 +282,3 @@ int write_zip_archive(struct archiver_args *args)
282
283 return err;
284 }
285 -
286 -void *parse_extra_zip_args(int argc, const char **argv)
287 -{
288 - for (; argc > 0; argc--, argv++) {
289 - const char *arg = argv[0];
290 -
291 - if (arg[0] == '-' && isdigit(arg[1]) && arg[2] == '\0')
292 - zlib_compression_level = arg[1] - '0';
293 - else
294 - die("Unknown argument for zip format: %s", arg);
295 - }
296 - return NULL;
297 -}
archive.h
+1 -5
@@ -13,19 +13,16 @@ struct archiver_args {
13 time_t time;
14 const char **pathspec;
15 unsigned int verbose : 1;
16 - void *extra;
16 };
17
18 typedef int (*write_archive_fn_t)(struct archiver_args *);
19
21 -typedef void *(*parse_extra_args_fn_t)(int argc, const char **argv);
22 -
20 typedef int (*write_archive_entry_fn_t)(struct archiver_args *args, const unsigned char *sha1, const char *path, size_t pathlen, unsigned int mode, void *buffer, unsigned long size);
21
22 struct archiver {
23 const char *name;
24 write_archive_fn_t write_archive;
28 - parse_extra_args_fn_t parse_extra;
25 + unsigned int flags;
26 };
27
28 extern int parse_archive_args(int argc, const char **argv, const struct archiver **ar, struct archiver_args *args);
@@ -41,7 +38,6 @@ extern void parse_pathspec_arg(const char **pathspec,
38 */
39 extern int write_tar_archive(struct archiver_args *);
40 extern int write_zip_archive(struct archiver_args *);
44 -extern void *parse_extra_zip_args(int argc, const char **argv);
41
42 extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry);
43
builtin-archive.c
+16 -13
@@ -15,9 +15,11 @@
15 static const char archive_usage[] = \
16 "git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>] <tree-ish> [path...]";
17
18 +#define USES_ZLIB_COMPRESSION 1
19 +
20 const struct archiver archivers[] = {
19 - { "tar", write_tar_archive, NULL },
20 - { "zip", write_zip_archive, parse_extra_zip_args },
21 + { "tar", write_tar_archive },
22 + { "zip", write_zip_archive, USES_ZLIB_COMPRESSION },
23 };
24
25 static int run_remote_archiver(const char *remote, int argc,
@@ -137,10 +139,9 @@ void parse_treeish_arg(const char **argv, struct archiver_args *ar_args,
139 int parse_archive_args(int argc, const char **argv, const struct archiver **ar,
140 struct archiver_args *args)
141 {
140 - const char *extra_argv[MAX_EXTRA_ARGS];
141 - int extra_argc = 0;
142 const char *format = "tar";
143 const char *base = "";
144 + int compression_level = -1;
145 int verbose = 0;
146 int i;
147
@@ -168,12 +169,12 @@ int parse_archive_args(int argc, const char **argv, const struct archiver **ar,
169 i++;
170 break;
171 }
171 - if (arg[0] == '-') {
172 - if (extra_argc > MAX_EXTRA_ARGS - 1)
173 - die("Too many extra options");
174 - extra_argv[extra_argc++] = arg;
172 + if (arg[0] == '-' && isdigit(arg[1]) && arg[2] == '\0') {
173 + compression_level = arg[1] - '0';
174 continue;
175 }
176 + if (arg[0] == '-')
177 + die("Unknown argument: %s", arg);
178 break;
179 }
180
@@ -184,11 +185,13 @@ int parse_archive_args(int argc, const char **argv, const struct archiver **ar,
185 if (!*ar)
186 die("Unknown archive format '%s'", format);
187
187 - if (extra_argc) {
188 - if (!(*ar)->parse_extra)
189 - die("'%s' format does not handle %s",
190 - (*ar)->name, extra_argv[0]);
191 - args->extra = (*ar)->parse_extra(extra_argc, extra_argv);
188 + if (compression_level != -1) {
189 + if ((*ar)->flags & USES_ZLIB_COMPRESSION)
190 + zlib_compression_level = compression_level;
191 + else {
192 + die("Argument not supported for format '%s': -%d",
193 + format, compression_level);
194 + }
195 }
196 args->verbose = verbose;
197 args->base = base;