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@xxxxxxxx> --- New in v2; before there was magic special-casing of the tar_filter code. archive-tar.c | 3 ++- archive-zip.c | 3 ++- archive.c | 2 +- archive.h | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/archive-tar.c b/archive-tar.c index 930375b..bed9a9b 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -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; diff --git a/archive-zip.c b/archive-zip.c index a776d83..42df660 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -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; diff --git a/archive.c b/archive.c index f0b4e85..a0a5beb 100644 --- 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); } diff --git a/archive.h b/archive.h index f39cede..b3cf219 100644 --- 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 *); -- 1.7.5.4.44.g4b107 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html