archive: pass archiver struct to write_archive callback
authorJeff King <peff@peff.net>
Wed, 22 Jun 2011 01:24:07 +0000 (21:24 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Jun 2011 18:12:35 +0000 (11:12 -0700)
The current archivers are very static; when you are in the
write_tar_archive function, you know you are writing a tar.
However, to facilitate runtime-configurable archivers
that will share a common write function we need to tell the
function which archiver was used.

As a convenience, we also provide an opaque data pointer in
the archiver struct so that individual archivers can put
something useful there when they register themselves.
Technically they could just use the "name" field to look in
an internal map of names to data, but this is much simpler.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
archive-tar.c
archive-zip.c
archive.c
archive.h

index 930375bf2101be2b25472afaddc192f3c8cf32f9..bed9a9b15ce07fbb1ff0f40902e1b317b82663e9 100644 (file)
@@ -234,7 +234,8 @@ static int git_tar_config(const char *var, const char *value, void *cb)
        return 0;
 }
 
-static int write_tar_archive(struct archiver_args *args)
+static int write_tar_archive(const struct archiver *ar,
+                            struct archiver_args *args)
 {
        int err = 0;
 
index a776d8359c98f6f67229c3f1f015b7c2f3ac1c60..42df66080acad9a6705227a075058246e12078b2 100644 (file)
@@ -261,7 +261,8 @@ 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;
 }
 
-static int write_zip_archive(struct archiver_args *args)
+static int write_zip_archive(const struct archiver *ar,
+                            struct archiver_args *args)
 {
        int err;
 
index f0b4e85513eaab597225a23e2d132389224ea4c6..a0a5beb94840d04c11e9b8be53b1c50074fafed3 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -410,5 +410,5 @@ int write_archive(int argc, const char **argv, const char *prefix,
        parse_treeish_arg(argv, &args, prefix);
        parse_pathspec_arg(argv + 1, &args);
 
-       return ar->write_archive(&args);
+       return ar->write_archive(ar, &args);
 }
index f39cede0c6de829953d0ed3806b564b609ae2566..b3cf2198b162b1f8afb90762d50860c9edbeae50 100644 (file)
--- a/archive.h
+++ b/archive.h
@@ -17,8 +17,9 @@ struct archiver_args {
 #define ARCHIVER_WANT_COMPRESSION_LEVELS 1
 struct archiver {
        const char *name;
-       int (*write_archive)(struct archiver_args *);
+       int (*write_archive)(const struct archiver *, struct archiver_args *);
        unsigned flags;
+       void *data;
 };
 extern void register_archiver(struct archiver *);