+static int write_tar_gzip_archive(struct archiver_args *args)
+{
+ return write_compressed_tar_archive(args,"gzip");
+}
+
+static int write_tar_bzip2_archive(struct archiver_args *args)
+{
+ return write_compressed_tar_archive(args,"bzip2");
+}
+
+const struct cgit_snapshot_format cgit_snapshot_formats[] = {
+ { ".zip", "application/x-zip", write_zip_archive, 0x1 },
+ { ".tar.gz", "application/x-tar", write_tar_gzip_archive, 0x2 },
+ { ".tar.bz2", "application/x-tar", write_tar_bzip2_archive, 0x4 },
+ { ".tar", "application/x-tar", write_tar_archive, 0x8 },
+ {}
+};
+
+static int make_snapshot(const struct cgit_snapshot_format *format,
+ const char *hex, const char *prefix,
+ const char *filename)
+{
+ struct archiver_args args;
+ struct commit *commit;
+ unsigned char sha1[20];
+
+ if(get_sha1(hex, sha1)) {
+ cgit_print_error(fmt("Bad object id: %s", hex));
+ return 1;