summaryrefslogtreecommitdiff
path: root/Documentation/git-sh-setup.txt
diff options
context:
space:
mode:
authorLibravatar Elijah Newren <newren@gmail.com>2020-12-01 22:25:17 +0000
committerLibravatar Junio C Hamano <gitster@pobox.com>2020-12-01 14:39:04 -0800
commitb34ab4a43ba68dd4bba66d765368a37d99890ab2 (patch)
treeb43e18548c88c5094a7f31f790de8411d2a8a92b /Documentation/git-sh-setup.txt
parentt7012: add a testcase demonstrating stash apply bugs in sparse checkouts (diff)
downloadtgif-b34ab4a43ba68dd4bba66d765368a37d99890ab2.tar.xz
stash: remove unnecessary process forking
When stash was converted from shell to a builtin, it merely transliterated the forking of various git commands from shell to a C program that would fork the same commands. Some of those were converted over to actual library calls, but much of the pipeline-of-commands design still remains. Fix some of this by replacing the portion corresponding to git diff-index --cached --name-only --diff-filter=A $CTREE >"$a" git read-tree --reset $CTREE git update-index --add --stdin <"$a" rm -f "$a" into a library function that does the same thing. (The read-tree --reset was already partially converted over to a library call, but as an independent piece.) Note here that this came after a merge operation was performed. The merge machinery always stages anything that cleanly merges, and the above code only runs if there are no conflicts. Its purpose is to make it so that when there are no conflicts, all the changes from the stash are unstaged. However, that causes brand new files from the stash to become untracked, so the code above first saves those files off and then re-adds them afterwards. We replace the whole series of commands with a simple function that will unstage files that are not newly added. This doesn't fix any bugs in the usage of these commands, it simply matches the existing behavior but makes it into a single atomic operation that we can then operate on as a whole. A subsequent commit will take advantage of this to fix issues with these commands in sparse-checkouts. This conversion incidentally fixes t3906.1, because the separate update-index process would die with the following error messages: error: uninitialized_sub: is a directory - add files inside instead fatal: Unable to process path uninitialized_sub The unstaging of the directory as a submodule meant it was no longer tracked, and thus as an uninitialized directory it could not be added back using `git update-index --add`, thus resulting in this error and early abort. Most of the submodule tests in 3906 continue to fail after this change, this change was just enough to push the first of those tests to success. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'Documentation/git-sh-setup.txt')
0 files changed, 0 insertions, 0 deletions