git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] archive-zip: add --text parameter

From
René Scharfe <l.s.r@web.de>
Date
Mar 5, 2015, 15:27 UTC
Message-ID
<54F875F4.1080508@web.de>
In-Reply-To
<54F77573.80109@web.de>
Am 04.03.2015 um 22:13 schrieb René Scharfe:
Show 60 quoted lines
> diff --git a/archive-zip.c b/archive-zip.c
> index 4bde019..3767940 100644
> --- a/archive-zip.c
> +++ b/archive-zip.c
> @@ -5,6 +5,7 @@
>   #include "archive.h"
>   #include "streaming.h"
>   #include "utf8.h"
> +#include "xdiff-interface.h"
>
>   static int zip_date;
>   static int zip_time;
> @@ -210,6 +211,7 @@ static int write_zip_entry(struct archiver_args *args,
>   	struct git_istream *stream = NULL;
>   	unsigned long flags = 0;
>   	unsigned long size;
> +	int is_binary = -1;
>
>   	crc = crc32(0, NULL, 0);
>
> @@ -238,8 +240,14 @@ static int write_zip_entry(struct archiver_args *args,
>   		method = 0;
>   		attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) :
>   			(mode & 0111) ? ((mode) << 16) : 0;
> -		if (S_ISREG(mode) && args->compression_level != 0 && size > 0)
> -			method = 8;
> +		if (S_ISREG(mode)) {
> +			if (args->compression_level != 0 && size > 0)
> +				method = 8;
> +			if (args->text == ARCHIVE_TEXT_ALL)
> +				is_binary = 0;
> +			else if (args->text == ARCHIVE_TEXT_NONE)
> +				is_binary = 1;
> +		}
>
>   		if (S_ISREG(mode) && type == OBJ_BLOB && !args->convert &&
>   		    size > big_file_threshold) {
> @@ -256,6 +264,8 @@ static int write_zip_entry(struct archiver_args *args,
>   				return error("cannot read %s",
>   					     sha1_to_hex(sha1));
>   			crc = crc32(crc, buffer, size);
> +			if (is_binary < 0)
> +				is_binary = buffer_is_binary(buffer, size);
>   			out = buffer;
>   		}
>   		compressed_size = (method == 0) ? size : 0;
> @@ -300,7 +310,6 @@ static int write_zip_entry(struct archiver_args *args,
>   	copy_le16(dirent.extra_length, ZIP_EXTRA_MTIME_SIZE);
>   	copy_le16(dirent.comment_length, 0);
>   	copy_le16(dirent.disk, 0);
> -	copy_le16(dirent.attr1, 0);
>   	copy_le32(dirent.attr2, attr2);
>   	copy_le32(dirent.offset, zip_offset);
>
> @@ -328,6 +337,8 @@ static int write_zip_entry(struct archiver_args *args,
>   			if (readlen <= 0)
>   				break;
>   			crc = crc32(crc, buf, readlen);
> +			if (is_binary < 0)
> +				is_binary = buffer_is_binary(buffer, size);

buffer is NULL here, so this crashes. buf and readlen have to be used instead. This code path is only used for entries that are too big to be compressed in one go.

Show 9 quoted lines
>   			write_or_die(1, buf, readlen);
>   		}
>   		close_istream(stream);
> @@ -361,6 +372,8 @@ static int write_zip_entry(struct archiver_args *args,
>   			if (readlen <= 0)
>   				break;
>   			crc = crc32(crc, buf, readlen);
> +			if (is_binary < 0)
> +				is_binary = buffer_is_binary(buffer, size);
Same here.
Show 20 quoted lines
>   			zstream.next_in = buf;
>   			zstream.avail_in = readlen;
> @@ -405,6 +418,8 @@ static int write_zip_entry(struct archiver_args *args,
>   	free(deflated);
>   	free(buffer);
>
> +	copy_le16(dirent.attr1, !is_binary);
> +
>   	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);
> @@ -466,7 +481,7 @@ static int write_zip_archive(const struct archiver *ar,
>   static struct archiver zip_archiver = {
>   	"zip",
>   	write_zip_archive,
> -	ARCHIVER_WANT_COMPRESSION_LEVELS|ARCHIVER_REMOTE
> +	ARCHIVER_WANT_COMPRESSION_LEVELS|ARCHIVER_REMOTE|ARCHIVER_TEXT_ATTRIBUTE
>   };
>
>   void init_zip_archiver(void)
Previous: René ScharfeNext: René Scharfe
Message 7 of 8 in “zip files created with git archive flags text files as binaries”
  1. Ulrike FischerFeb 23, 2015
  2. René ScharfeFeb 23, 2015
  3. René ScharfeMar 4, 2015
  4. archive-zip: add --text parameterRené Scharfe, Mar 4, 2015
  5. Junio C HamanoMar 5, 2015
  6. René ScharfeMar 5, 2015
  7. René ScharfeMar 5, 2015
  8. archive-zip: mark text files in archivesRené Scharfe, Mar 5, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.