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

Re: [PATCH v2 4/4] upload-archive: use start_command instead of fork

From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
Date
Aug 9, 2011, 10:25 UTC
Message-ID
<4E410B26.1080407@lsrfire.ath.cx>
In-Reply-To
<20110809050211.GA3588@sigill.intra.peff.net>
Am 09.08.2011 07:02, schrieb Jeff King:
Show 35 quoted lines
> On Mon, Aug 08, 2011 at 07:10:01PM +0200, René Scharfe wrote:
> 
>>> -	tar_filter_config("tar.tgz.command", "gzip -cn", NULL);
>>> +	tar_filter_config("tar.tgz.command", "gzip -cn | cat", NULL);
>>>  	tar_filter_config("tar.tgz.remote", "true", NULL);
>>> -	tar_filter_config("tar.tar.gz.command", "gzip -cn", NULL);
>>> +	tar_filter_config("tar.tar.gz.command", "gzip -cn | cat", NULL);
>>>  	tar_filter_config("tar.tar.gz.remote", "true", NULL);
>>>  	git_config(git_tar_config, NULL);
>>>  	for (i = 0; i < nr_tar_filters; i++) {
>>>
>>> (provided that 'cat' magically does not suffer from the same problem,
>>> and I do think that it does not.)
>>
>> The external cat can indeed be used.  We'd need to do that for user
>> supplied commands as well, though, like this (ugh):
>>
>> diff --git a/archive-tar.c b/archive-tar.c
>> index 20af005..eaa9a1c 100644
>> --- a/archive-tar.c
>> +++ b/archive-tar.c
>> @@ -326,6 +326,9 @@ static int write_tar_filter_archive(const struct archiver *ar,
>>  		die("BUG: tar-filter archiver called with no filter defined");
>>  
>>  	strbuf_addstr(&cmd, ar->data);
>> +#ifdef WIN32
>> +	strbuf_addstr(&cmd, " | cat");
>> +#endif
>>  	if (args->compression_level >= 0)
>>  		strbuf_addf(&cmd, " -%d", args->compression_level);
> 
> Do we need to? It seems to me that defaulting to "gzip -cn | cat" is not
> "we are on Windows, a platform that needs a special workaround in git",
> but rather "this gzip is horribly broken, but at build-time you can
> set a gzip that works".

It's an MSYS platform problem IMHO, and we can work around it. That extra cat is nothing to be proud of, sure. And msysgit avoiding the issue by distibuting a gzip that never converts line endings would solve it without any runtime overhead.

> So if the user wants to specify some broken filter, it is up to them to
> add "| cat" if their filter merits it.

Well, I'd rather take this responsibility from the user, who might struggle a while before finding out what is going on. However...

> But that is somewhat a matter of perception, and it won't make a user on
> Windows who does "git config archive.bz2 bzip2 -c" any happier when they
> are told it is their responsibility to deal with it.
If all packers shipped with msysgit are usable then we're probably good.
> BTW, as nice as this "gzip -cn | cat" idea is, I think it needs to be
> wrapped in a shell script. With the code above, we will generate "gzip
> -cn | cat -9".

Yes, the three added lines in the patch above would have to be moved down two lines, after the compression level is added. D'oh!

Show 8 quoted lines
> So we really need:
> 
>   $ cat `which gzip`
>   #!/bin/sh
>   gzip.real -cn "$@" | cat
>
> and then no hacks need to go into git at all. The fix is about providing
> a sane gzip, not fixing git.

OK, that's one way to do it; another would be let gzip (and bzip2 etc.) do whatever cat does to avoid end of line conversions. And yet another is to take them from http://unxutils.sourceforge.net/.

Show 10 quoted lines
> BTW, from what Johannes said, the issue is about a non-msys program
> calling an msys one. Does that mean that having git run:
> 
>   sh -c 'gzip -cn'
> 
> would work? If so, then could the solution be as simple as turning off
> the "don't bother with the shell" optimization that run-command uses?
> Something like "gzip -cn" gets split by git and run via spawn now
> (because it has no metacharacters). But we could easily make it always
> run through the shell.

Just checked -- it doesn't work. I assume that's because the shell is also an MSYS program.

René
Previous: Jeff KingNext: Jeff King
Message 29 of 33 in “port upload-archive to Windows”
  1. 0/4 port upload-archive to WindowsErik Faye-Lund, Jul 18, 2011
  2. 1/4 compat/win32/sys/poll.c: upgrade from upstreamErik Faye-Lund, Jul 18, 2011
  3. 2/4 mingw: fix compilation of poll-emulationErik Faye-Lund, Jul 18, 2011
  4. 3/4 enter_repo: do not modify inputErik Faye-Lund, Jul 18, 2011
  5. 4/4 upload-archive: use start_command instead of forkErik Faye-Lund, Jul 18, 2011
  6. Junio C HamanoJul 19, 2011
  7. Erik Faye-LundJul 28, 2011
  8. Jeff KingJul 28, 2011
  9. Jeff KingJul 28, 2011
  10. Jeff KingJul 28, 2011
  11. Erik Faye-LundAug 1, 2011
  12. Jeff KingAug 1, 2011
  13. Erik Faye-LundAug 1, 2011
  14. Jeff KingAug 1, 2011
  15. René ScharfeAug 1, 2011
  16. Johannes SixtAug 1, 2011
  17. René ScharfeAug 1, 2011
  18. René ScharfeAug 1, 2011
  19. Jeff KingAug 2, 2011
  20. René ScharfeAug 2, 2011
  21. Jeff KingAug 2, 2011
  22. Johannes SixtAug 2, 2011
  23. Jeff KingAug 3, 2011
  24. René ScharfeAug 6, 2011
  25. Johannes SixtAug 7, 2011
  26. Jeff KingAug 7, 2011
  27. René ScharfeAug 8, 2011
  28. Jeff KingAug 9, 2011
  29. René ScharfeAug 9, 2011
  30. Jeff KingAug 9, 2011
  31. Erik Faye-LundSep 29, 2011
  32. René ScharfeSep 29, 2011
  33. Erik Faye-LundSep 29, 2011

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.