diff options
author | René Scharfe <rene.scharfe@lsrfire.ath.cx> | 2008-07-14 21:22:05 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-07-15 07:18:04 -0700 |
commit | 489e351ea03e78746bad0c0ad4fcf4a63920256d (patch) | |
tree | a1cbdc92c2abdf2ebc69545b4decf573d95aa899 | |
parent | 1d11d5bb85daf38aa1eb6ecd2387dff862181812 (diff) | |
download | git-489e351ea03e78746bad0c0ad4fcf4a63920256d.tar.gz |
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>
-rw-r--r-- | archive-zip.c | 13 | ||||
-rw-r--r-- | archive.h | 6 | ||||
-rw-r--r-- | builtin-archive.c | 29 |
3 files changed, 17 insertions, 31 deletions
diff --git a/archive-zip.c b/archive-zip.c index 81312899bc..d56e5cfc1e 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -282,16 +282,3 @@ int write_zip_archive(struct archiver_args *args) return err; } - -void *parse_extra_zip_args(int argc, const char **argv) -{ - for (; argc > 0; argc--, argv++) { - const char *arg = argv[0]; - - if (arg[0] == '-' && isdigit(arg[1]) && arg[2] == '\0') - zlib_compression_level = arg[1] - '0'; - else - die("Unknown argument for zip format: %s", arg); - } - return NULL; -} @@ -13,19 +13,16 @@ struct archiver_args { time_t time; const char **pathspec; unsigned int verbose : 1; - void *extra; }; typedef int (*write_archive_fn_t)(struct archiver_args *); -typedef void *(*parse_extra_args_fn_t)(int argc, const char **argv); - 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); struct archiver { const char *name; write_archive_fn_t write_archive; - parse_extra_args_fn_t parse_extra; + unsigned int flags; }; 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, */ extern int write_tar_archive(struct archiver_args *); extern int write_zip_archive(struct archiver_args *); -extern void *parse_extra_zip_args(int argc, const char **argv); extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry); diff --git a/builtin-archive.c b/builtin-archive.c index e7f4ec6341..88204bf733 100644 --- a/builtin-archive.c +++ b/builtin-archive.c @@ -15,9 +15,11 @@ static const char archive_usage[] = \ "git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>] <tree-ish> [path...]"; +#define USES_ZLIB_COMPRESSION 1 + const struct archiver archivers[] = { - { "tar", write_tar_archive, NULL }, - { "zip", write_zip_archive, parse_extra_zip_args }, + { "tar", write_tar_archive }, + { "zip", write_zip_archive, USES_ZLIB_COMPRESSION }, }; 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, int parse_archive_args(int argc, const char **argv, const struct archiver **ar, struct archiver_args *args) { - const char *extra_argv[MAX_EXTRA_ARGS]; - int extra_argc = 0; const char *format = "tar"; const char *base = ""; + int compression_level = -1; int verbose = 0; int i; @@ -168,12 +169,12 @@ int parse_archive_args(int argc, const char **argv, const struct archiver **ar, i++; break; } - if (arg[0] == '-') { - if (extra_argc > MAX_EXTRA_ARGS - 1) - die("Too many extra options"); - extra_argv[extra_argc++] = arg; + if (arg[0] == '-' && isdigit(arg[1]) && arg[2] == '\0') { + compression_level = arg[1] - '0'; continue; } + if (arg[0] == '-') + die("Unknown argument: %s", arg); break; } @@ -184,11 +185,13 @@ int parse_archive_args(int argc, const char **argv, const struct archiver **ar, if (!*ar) die("Unknown archive format '%s'", format); - if (extra_argc) { - if (!(*ar)->parse_extra) - die("'%s' format does not handle %s", - (*ar)->name, extra_argv[0]); - args->extra = (*ar)->parse_extra(extra_argc, extra_argv); + if (compression_level != -1) { + if ((*ar)->flags & USES_ZLIB_COMPRESSION) + zlib_compression_level = compression_level; + else { + die("Argument not supported for format '%s': -%d", + format, compression_level); + } } args->verbose = verbose; args->base = base; |