X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=archive-zip.c;h=e9f426298b6d1c4ce64a1ef537a97375a8855d3c;hb=b381c98891c90c198b247b970bae783123226cad;hp=155ee4a779a1c2cd0cb2a7a8eea8c7ba8ba8502a;hpb=041bc65923e13313ca1b77681c3b2950b5e0a163;p=thirdparty%2Fgit.git diff --git a/archive-zip.c b/archive-zip.c index 155ee4a779..e9f426298b 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -24,6 +24,11 @@ static unsigned int max_creator_version; #define ZIP_STREAM (1 << 3) #define ZIP_UTF8 (1 << 11) +enum zip_method { + ZIP_METHOD_STORE = 0, + ZIP_METHOD_DEFLATE = 8 +}; + struct zip_local_header { unsigned char magic[4]; unsigned char version[2]; @@ -291,7 +296,7 @@ static int write_zip_entry(struct archiver_args *args, unsigned long attr2; unsigned long compressed_size; unsigned long crc; - int method; + enum zip_method method; unsigned char *out; void *deflated = NULL; void *buffer; @@ -320,7 +325,7 @@ static int write_zip_entry(struct archiver_args *args, } if (S_ISDIR(mode) || S_ISGITLINK(mode)) { - method = 0; + method = ZIP_METHOD_STORE; attr2 = 16; out = NULL; size = 0; @@ -330,17 +335,18 @@ static int write_zip_entry(struct archiver_args *args, enum object_type type = oid_object_info(args->repo, oid, &size); - method = 0; + method = ZIP_METHOD_STORE; attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) : (mode & 0111) ? ((mode) << 16) : 0; if (S_ISLNK(mode) || (mode & 0111)) creator_version = 0x0317; if (S_ISREG(mode) && args->compression_level != 0 && size > 0) - method = 8; + method = ZIP_METHOD_DEFLATE; if (S_ISREG(mode) && type == OBJ_BLOB && !args->convert && size > big_file_threshold) { - stream = open_istream(oid, &type, &size, NULL); + stream = open_istream(args->repo, oid, &type, &size, + NULL); if (!stream) return error(_("cannot stream blob %s"), oid_to_hex(oid)); @@ -358,7 +364,7 @@ static int write_zip_entry(struct archiver_args *args, buffer, size); out = buffer; } - compressed_size = (method == 0) ? size : 0; + compressed_size = (method == ZIP_METHOD_STORE) ? size : 0; } else { return error(_("unsupported file mode: 0%o (SHA1: %s)"), mode, oid_to_hex(oid)); @@ -367,13 +373,13 @@ static int write_zip_entry(struct archiver_args *args, if (creator_version > max_creator_version) max_creator_version = creator_version; - if (buffer && method == 8) { + if (buffer && method == ZIP_METHOD_DEFLATE) { out = deflated = zlib_deflate_raw(buffer, size, args->compression_level, &compressed_size); if (!out || compressed_size >= size) { out = buffer; - method = 0; + method = ZIP_METHOD_STORE; compressed_size = size; } } @@ -420,7 +426,7 @@ static int write_zip_entry(struct archiver_args *args, zip_offset += ZIP64_EXTRA_SIZE; } - if (stream && method == 0) { + if (stream && method == ZIP_METHOD_STORE) { unsigned char buf[STREAM_BUFFER_SIZE]; ssize_t readlen; @@ -443,7 +449,7 @@ static int write_zip_entry(struct archiver_args *args, zip_offset += compressed_size; write_zip_data_desc(size, compressed_size, crc); - } else if (stream && method == 8) { + } else if (stream && method == ZIP_METHOD_DEFLATE) { unsigned char buf[STREAM_BUFFER_SIZE]; ssize_t readlen; git_zstream zstream; @@ -577,7 +583,7 @@ static void write_zip64_trailer(void) write_or_die(1, &locator64, ZIP64_DIR_TRAILER_LOCATOR_SIZE); } -static void write_zip_trailer(const unsigned char *sha1) +static void write_zip_trailer(const struct object_id *oid) { struct zip_dir_trailer trailer; int clamped = 0; @@ -590,31 +596,31 @@ static void write_zip_trailer(const unsigned char *sha1) copy_le16_clamp(trailer.entries, zip_dir_entries, &clamped); copy_le32(trailer.size, zip_dir.len); copy_le32_clamp(trailer.offset, zip_offset, &clamped); - copy_le16(trailer.comment_length, sha1 ? GIT_SHA1_HEXSZ : 0); + copy_le16(trailer.comment_length, oid ? the_hash_algo->hexsz : 0); write_or_die(1, zip_dir.buf, zip_dir.len); if (clamped) write_zip64_trailer(); write_or_die(1, &trailer, ZIP_DIR_TRAILER_SIZE); - if (sha1) - write_or_die(1, sha1_to_hex(sha1), GIT_SHA1_HEXSZ); + if (oid) + write_or_die(1, oid_to_hex(oid), the_hash_algo->hexsz); } static void dos_time(timestamp_t *timestamp, int *dos_date, int *dos_time) { time_t time; - struct tm *t; + struct tm tm; if (date_overflows(*timestamp)) die(_("timestamp too large for this system: %"PRItime), *timestamp); time = (time_t)*timestamp; - t = localtime(&time); + localtime_r(&time, &tm); *timestamp = time; - *dos_date = t->tm_mday + (t->tm_mon + 1) * 32 + - (t->tm_year + 1900 - 1980) * 512; - *dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048; + *dos_date = tm.tm_mday + (tm.tm_mon + 1) * 32 + + (tm.tm_year + 1900 - 1980) * 512; + *dos_time = tm.tm_sec / 2 + tm.tm_min * 32 + tm.tm_hour * 2048; } static int archive_zip_config(const char *var, const char *value, void *data) @@ -635,7 +641,7 @@ static int write_zip_archive(const struct archiver *ar, err = write_archive_entries(args, write_zip_entry); if (!err) - write_zip_trailer(args->commit_sha1); + write_zip_trailer(args->commit_oid); strbuf_release(&zip_dir);