diff options
author | René Scharfe <rene.scharfe@lsrfire.ath.cx> | 2012-05-03 08:51:06 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-05-03 10:22:57 -0700 |
commit | ebf5374afa87afa334b040faec35144c2a3d03d5 (patch) | |
tree | b8c3adb8df8212e5cf533706b016fcb116e3e785 /archive-zip.c | |
parent | 60df6bd19ad40e3eae2926f3785a63e670c150ea (diff) | |
download | git-ebf5374afa87afa334b040faec35144c2a3d03d5.tar.gz git-ebf5374afa87afa334b040faec35144c2a3d03d5.tar.xz |
archive-zip: factor out helpers for writing sizes and CRC
We're going to reuse them soon for streaming. Also, update the ZIP
directory only at the very end, which will also make streaming easier.
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'archive-zip.c')
-rw-r--r-- | archive-zip.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/archive-zip.c b/archive-zip.c index 400ba38c7..678569ab2 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -120,6 +120,26 @@ static void *zlib_deflate(void *data, unsigned long size, return buffer; } +static void set_zip_dir_data_desc(struct zip_dir_header *header, + unsigned long size, + unsigned long compressed_size, + unsigned long crc) +{ + copy_le32(header->crc32, crc); + copy_le32(header->compressed_size, compressed_size); + copy_le32(header->size, size); +} + +static void set_zip_header_data_desc(struct zip_local_header *header, + unsigned long size, + unsigned long compressed_size, + unsigned long crc) +{ + copy_le32(header->crc32, crc); + copy_le32(header->compressed_size, compressed_size); + copy_le32(header->size, size); +} + static int write_zip_entry(struct archiver_args *args, const unsigned char *sha1, const char *path, size_t pathlen, @@ -200,9 +220,7 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(dirent.compression_method, method); copy_le16(dirent.mtime, zip_time); copy_le16(dirent.mdate, zip_date); - copy_le32(dirent.crc32, crc); - copy_le32(dirent.compressed_size, compressed_size); - copy_le32(dirent.size, size); + set_zip_dir_data_desc(&dirent, size, compressed_size, crc); copy_le16(dirent.filename_length, pathlen); copy_le16(dirent.extra_length, 0); copy_le16(dirent.comment_length, 0); @@ -210,11 +228,6 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(dirent.attr1, 0); copy_le32(dirent.attr2, attr2); copy_le32(dirent.offset, zip_offset); - memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE); - zip_dir_offset += ZIP_DIR_HEADER_SIZE; - memcpy(zip_dir + zip_dir_offset, path, pathlen); - zip_dir_offset += pathlen; - zip_dir_entries++; copy_le32(header.magic, 0x04034b50); copy_le16(header.version, 10); @@ -222,9 +235,7 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(header.compression_method, method); copy_le16(header.mtime, zip_time); copy_le16(header.mdate, zip_date); - copy_le32(header.crc32, crc); - copy_le32(header.compressed_size, compressed_size); - copy_le32(header.size, size); + set_zip_header_data_desc(&header, size, compressed_size, crc); copy_le16(header.filename_length, pathlen); copy_le16(header.extra_length, 0); write_or_die(1, &header, ZIP_LOCAL_HEADER_SIZE); @@ -239,6 +250,12 @@ static int write_zip_entry(struct archiver_args *args, free(deflated); free(buffer); + memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE); + zip_dir_offset += ZIP_DIR_HEADER_SIZE; + memcpy(zip_dir + zip_dir_offset, path, pathlen); + zip_dir_offset += pathlen; + zip_dir_entries++; + return 0; } |