Skip to content

Commit

Permalink
archive: refactor list of archive formats
Browse files Browse the repository at this point in the history
Most of the tar and zip code was nicely split out into two
abstracted files which knew only about their specific
formats. The entry point to this code was a single "write
archive" function.

However, as these basic formats grow more complex (e.g., by
handling multiple file extensions and format names), a
static list of the entry point functions won't be enough.
Instead, let's provide a way for the tar and zip code to
tell the main archive code what they support by registering
archiver names and functions.

Signed-off-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
peff authored and gitster committed Jun 22, 2011
1 parent 40e7629 commit 13e0f88
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 27 deletions.
16 changes: 13 additions & 3 deletions archive-tar.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,12 +234,10 @@ static int git_tar_config(const char *var, const char *value, void *cb)
return 0;
}

int write_tar_archive(struct archiver_args *args)
static int write_tar_archive(struct archiver_args *args)
{
int err = 0;

git_config(git_tar_config, NULL);

if (args->commit_sha1)
err = write_global_extended_header(args);
if (!err)
Expand All @@ -248,3 +246,15 @@ int write_tar_archive(struct archiver_args *args)
write_trailer();
return err;
}

static struct archiver tar_archiver = {
"tar",
write_tar_archive,
0
};

void init_tar_archiver(void)
{
register_archiver(&tar_archiver);
git_config(git_tar_config, NULL);
}
13 changes: 12 additions & 1 deletion archive-zip.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ static void dos_time(time_t *time, int *dos_date, int *dos_time)
*dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
}

int write_zip_archive(struct archiver_args *args)
static int write_zip_archive(struct archiver_args *args)
{
int err;

Expand All @@ -278,3 +278,14 @@ int write_zip_archive(struct archiver_args *args)

return err;
}

static struct archiver zip_archiver = {
"zip",
write_zip_archive,
ARCHIVER_WANT_COMPRESSION_LEVELS
};

void init_zip_archiver(void)
{
register_archiver(&zip_archiver);
}
33 changes: 17 additions & 16 deletions archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,15 @@ static char const * const archive_usage[] = {
NULL
};

#define USES_ZLIB_COMPRESSION 1

static const struct archiver {
const char *name;
write_archive_fn_t write_archive;
unsigned int flags;
} archivers[] = {
{ "tar", write_tar_archive },
{ "zip", write_zip_archive, USES_ZLIB_COMPRESSION },
};
static const struct archiver **archivers;
static int nr_archivers;
static int alloc_archivers;

void register_archiver(struct archiver *ar)
{
ALLOC_GROW(archivers, nr_archivers + 1, alloc_archivers);
archivers[nr_archivers++] = ar;
}

static void format_subst(const struct commit *commit,
const char *src, size_t len,
Expand Down Expand Up @@ -208,9 +207,9 @@ static const struct archiver *lookup_archiver(const char *name)
if (!name)
return NULL;

for (i = 0; i < ARRAY_SIZE(archivers); i++) {
if (!strcmp(name, archivers[i].name))
return &archivers[i];
for (i = 0; i < nr_archivers; i++) {
if (!strcmp(name, archivers[i]->name))
return archivers[i];
}
return NULL;
}
Expand Down Expand Up @@ -355,8 +354,8 @@ static int parse_archive_args(int argc, const char **argv,
base = "";

if (list) {
for (i = 0; i < ARRAY_SIZE(archivers); i++)
printf("%s\n", archivers[i].name);
for (i = 0; i < nr_archivers; i++)
printf("%s\n", archivers[i]->name);
exit(0);
}

Expand All @@ -369,7 +368,7 @@ static int parse_archive_args(int argc, const char **argv,

args->compression_level = Z_DEFAULT_COMPRESSION;
if (compression_level != -1) {
if ((*ar)->flags & USES_ZLIB_COMPRESSION)
if ((*ar)->flags & ARCHIVER_WANT_COMPRESSION_LEVELS)
args->compression_level = compression_level;
else {
die("Argument not supported for format '%s': -%d",
Expand All @@ -395,6 +394,8 @@ int write_archive(int argc, const char **argv, const char *prefix,
prefix = setup_git_directory_gently(&nongit);

git_config(git_default_config, NULL);
init_tar_archiver();
init_zip_archiver();

argc = parse_archive_args(argc, argv, &ar, &args);
if (nongit) {
Expand Down
17 changes: 10 additions & 7 deletions archive.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,18 @@ struct archiver_args {
int compression_level;
};

typedef int (*write_archive_fn_t)(struct archiver_args *);
#define ARCHIVER_WANT_COMPRESSION_LEVELS 1
struct archiver {
const char *name;
int (*write_archive)(struct archiver_args *);
unsigned flags;
};
extern void register_archiver(struct archiver *);

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);
extern void init_tar_archiver(void);
extern void init_zip_archiver(void);

/*
* Archive-format specific backends.
*/
extern int write_tar_archive(struct archiver_args *);
extern int write_zip_archive(struct archiver_args *);
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);

extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry);
extern int write_archive(int argc, const char **argv, const char *prefix, int setup_prefix);
Expand Down

0 comments on commit 13e0f88

Please sign in to comment.