archive: pass archiver struct to write_archive callback

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>

Jeff King committed Jun 21, 2011 at 21:24 UTC 4d7c98986379b0ab93cbf9092b60dfb5ab1cee7c
4 files changed +7 -4
archive-tar.c
+2 -1
@@ -234,7 +234,8 @@ static int git_tar_config(const char *var, const char *value, void *cb)
234 return 0;
235 }
236
237 -static int write_tar_archive(struct archiver_args *args)
237 +static int write_tar_archive(const struct archiver *ar,
238 + struct archiver_args *args)
239 {
240 int err = 0;
241
archive-zip.c
+2 -1
@@ -261,7 +261,8 @@ static void dos_time(time_t *time, int *dos_date, int *dos_time)
261 *dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
262 }
263
264 -static int write_zip_archive(struct archiver_args *args)
264 +static int write_zip_archive(const struct archiver *ar,
265 + struct archiver_args *args)
266 {
267 int err;
268
archive.c
+1 -1
@@ -410,5 +410,5 @@ int write_archive(int argc, const char **argv, const char *prefix,
410 parse_treeish_arg(argv, &args, prefix);
411 parse_pathspec_arg(argv + 1, &args);
412
413 - return ar->write_archive(&args);
413 + return ar->write_archive(ar, &args);
414 }
archive.h
+2 -1
@@ -17,8 +17,9 @@ struct archiver_args {
17 #define ARCHIVER_WANT_COMPRESSION_LEVELS 1
18 struct archiver {
19 const char *name;
20 - int (*write_archive)(struct archiver_args *);
20 + int (*write_archive)(const struct archiver *, struct archiver_args *);
21 unsigned flags;
22 + void *data;
23 };
24 extern void register_archiver(struct archiver *);
25