From: <rsbecker@nexbridge.com>
To: "'Jeff King'" <peff@peff.net>, "'Adam Johnson'" <me@adamj.eu>
Cc: <git@vger.kernel.org>
Subject: RE: Bug: 'git stash --staged' crashes with binary files
Date: Wed, 11 Oct 2023 14:23:05 -0400 [thread overview]
Message-ID: <046101d9fc6f$fd812910$f8837b30$@nexbridge.com> (raw)
In-Reply-To: <20231011181733.GA514244@coredump.intra.peff.net>
On Wednesday, October 11, 2023 2:18 PM, Peff wrote:
>On Thu, Jun 01, 2023 at 10:26:13PM +0100, Adam Johnson wrote:
>
>> Stage a binary file and run 'git stash --staged'. The stash is created
>> but the command fails to remove changes from the index:
>>
>> $ echo -n "\0" >file
>>
>> $ git add file
>>
>> $ git stash --staged
>> Saved working directory and index state WIP on main: e7911b6 Whatever
>> error: cannot apply binary patch to 'file' without full index line
>> error: file: patch does not apply
>> Cannot remove worktree changes
>>
>> $ git status
>> ...
>> Changes to be committed:
>> new file: file
>>
>> The "remove from the index" step seems not to be binary-compatible.
>
>This seems like a bug. It looks like stash does pass "--binary" in some cases, but not
>all. So it's probably a matter of finding the right invocation and adding it.
>
>> The below patch adds a reproducing test.
>
>I think finding the bug and writing the test is probably 75% of the work. :)
>
>> diff --git t/t3903-stash.sh t/t3903-stash.sh index
>> 376cc8f4ab..5e3ea64f38 100755
>> --- t/t3903-stash.sh
>> +++ t/t3903-stash.sh
>> @@ -392,6 +392,13 @@ setup_stash()
>> git stash pop &&
>> test bar,bar4 = $(cat file),$(cat file2) '
>> +test_expect_success 'stash --staged with binary file' '
>> + echo -n "\0" >file &&
>
>Unfortunately "echo -n" isn't portable. But you can use:
>
> printf "\0" >file
>
>instead.
>
>> + git add file &&
>> + git stash --staged &&
>> + git stash pop &&
>> + test "\0" = $(cat file)
>> +'
>
>I doubt this "test" will work, as the shell won't interpolate that into a NUL (and
>anyway, I think having NULs in shell variables isn't portable). You could perhaps do:
>
> printf "\0" >expect &&
> test_cmp expect file
Agreed. The specific test construct does not appear portable, but piping printf "\0" to expect works.
/home/randall: test "\0" != `printf "\0"`
bash: warning: command substitution: ignored null byte in input
bash: test: \0: unary operator expected
--Randall
prev parent reply other threads:[~2023-10-11 18:23 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-01 21:26 Bug: 'git stash --staged' crashes with binary files Adam Johnson
2023-10-11 18:17 ` Jeff King
2023-10-11 18:23 ` rsbecker [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='046101d9fc6f$fd812910$f8837b30$@nexbridge.com' \
--to=rsbecker@nexbridge.com \
--cc=git@vger.kernel.org \
--cc=me@adamj.eu \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.