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

Re: [PATCH] stash: fix handling removed files with --keep-index

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 11, 2019, 21:23 UTC
Message-ID
<xmqqims8qn8f.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<20190711174828.GF15477@hank.intra.tgummerer.com>
Thomas Gummerer <t.gummerer@gmail.com> writes:
> Fix that behaviour by using 'git restore' which can faithfully restore
> the index and working tree.  This also simplifies the code.

Hmph. I would have preferred to see we stayed away from 'restore' (and used 'checkout' instead, if you must use a Porcelain command), so that the "fix" can go to maintenance tracks, if distro packagers choose to backport it.

Isn't the machinery for "git status" (in wt-status.c) mature enough to allow us to learn what got changed all in-core, without spawning an external process these days, though?

Show 54 quoted lines
>  		if (keep_index == 1 && !is_null_oid(&info.i_tree)) {
> -			struct child_process cp_ls = CHILD_PROCESS_INIT;
> -			struct child_process cp_checkout = CHILD_PROCESS_INIT;
> -			struct strbuf out = STRBUF_INIT;
> -
> -			if (reset_tree(&info.i_tree, 0, 1)) {
> -				ret = -1;
> -				goto done;
> -			}
> -
> -			cp_ls.git_cmd = 1;
> -			argv_array_pushl(&cp_ls.args, "ls-files", "-z",
> -					 "--modified", "--", NULL);
> -
> -			add_pathspecs(&cp_ls.args, ps);
> -			if (pipe_command(&cp_ls, NULL, 0, &out, 0, NULL, 0)) {
> -				ret = -1;
> -				goto done;
> -			}
> -
> -			cp_checkout.git_cmd = 1;
> -			argv_array_pushl(&cp_checkout.args, "checkout-index",
> -					 "-z", "--force", "--stdin", NULL);
> -			if (pipe_command(&cp_checkout, out.buf, out.len, NULL,
> -					 0, NULL, 0)) {
> +			struct child_process cp_restore = CHILD_PROCESS_INIT;
> +
> +			cp_restore.git_cmd = 1;
> +			argv_array_pushl(&cp_restore.args, "restore", "--source", oid_to_hex(&info.i_tree),
> +					 "--staged", "--worktree", NULL);
> +			if (!ps->nr)
> +				argv_array_push(&cp_restore.args, ".");
> +			else
> +				add_pathspecs(&cp_restore.args, ps);
> +			if (run_command(&cp_restore)) {
>  				ret = -1;
>  				goto done;
>  			}
> diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
> index b22e671608..b8e337893f 100755
> --- a/t/t3903-stash.sh
> +++ b/t/t3903-stash.sh
> @@ -1234,4 +1234,11 @@ test_expect_success 'stash works when user.name and user.email are not set' '
>  	)
>  '
>  
> +test_expect_success 'stash --keep-index with file deleted in index does not resurrect it on disk' '
> +	test_commit to-remove to-remove &&
> +	git rm to-remove &&
> +	git stash --keep-index &&
> +	test_path_is_missing to-remove
> +'
> +
>  test_done
Previous: Thomas GummererNext: Thomas Gummerer
Message 3 of 7 in “Bug with deleted files and stash-push --keep-idex”
  1. Martin NicolayJul 11, 2019
  2. stash: fix handling removed files with --keep-indexThomas Gummerer, Jul 11, 2019
  3. Junio C HamanoJul 11, 2019
  4. Thomas GummererJul 16, 2019
  5. Junio C HamanoJul 16, 2019
  6. stash: fix handling removed files with --keep-indexThomas Gummerer, Jul 16, 2019
  7. Junio C HamanoJul 16, 2019

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.