Skip to content

Commit

Permalink
archive: remove extra arguments parsing code
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
René Scharfe authored and gitster committed Jul 15, 2008
1 parent 1d11d5b commit 489e351
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 31 deletions.
13 changes: 0 additions & 13 deletions archive-zip.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
6 changes: 1 addition & 5 deletions archive.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand Down
29 changes: 16 additions & 13 deletions builtin-archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
Expand Down

0 comments on commit 489e351

Please sign in to comment.