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

[PATCH v3 01/11] t2501: add various tests for removing the current working directory

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Nov 26, 2021, 22:40 UTC
Message-ID
<4b0044656b0ebe81db60f605a184948f728c4b9d.1637966463.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1140.v3.git.git.1637966463.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

Numerous commands will remove directories left empty as a "convenience" after removing files within them. That is normally fine, but removing the current working directory can be rather inconvenient since it can cause confusion for the user when they run subsequent commands. For example, after one git process has removed the current working directory, git status/log/diff will all abort with the message:

    fatal: Unable to read current working directory: No such file or directory
We also have code paths that, when a file needs to be placed where a
directory is (due to e.g. checkout, merge, reset, whatever), will check
if this is okay and error out if not.  These rules include:
  * all tracked files under that directory are intended to be removed by
    the operation
  * none of the tracked files under that directory have uncommitted
    modification
  * there are no untracked files under that directory
However, if we end up remove the current working directory, we can cause
user confusion when they run subsequent commands, so we would prefer if
there was a fourth rule added to this list: avoid removing the current
working directory.

Since there are several code paths that can result in the current working directory being removed, add several tests of various different codepaths. To make it clearer what the difference between the current behavior and the behavior at the end of the series, code both of them into the tests and have the appropriate behavior be selected by a flag. Subsequent commits will toggle the flag from current to desired behavior.

Also add a few tests suggested during the review of earlier rounds of this patch series.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t2501-cwd-empty.sh | 333 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 333 insertions(+)
 create mode 100755 t/t2501-cwd-empty.sh
diff --git a/t/t2501-cwd-empty.sh b/t/t2501-cwd-empty.sh
new file mode 100755
index 00000000000..67feb6fd200
--- /dev/null
+++ b/t/t2501-cwd-empty.sh
@@ -0,0 +1,333 @@
+#!/bin/sh
+
+test_description='Test handling of the current working directory becoming empty'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	test_commit init &&
+
+	git branch fd_conflict &&
+
+	mkdir -p foo/bar &&
+	test_commit foo/bar/baz &&
+
+	git revert HEAD &&
+	git tag reverted &&
+
+	git checkout fd_conflict &&
+	mkdir dirORfile &&
+	test_commit dirORfile/foo &&
+
+	git rm -r dirORfile &&
+	echo not-a-directory >dirORfile &&
+	git add dirORfile &&
+	git commit -m dirORfile &&
+
+	git switch -c df_conflict HEAD~1 &&
+	test_commit random_file &&
+
+	git switch -c undo_fd_conflict fd_conflict &&
+	git revert HEAD
+'
+
+test_incidental_dir_removal () {
+	works=$1 &&
+	shift &&
+
+	test_when_finished "git reset --hard" &&
+
+	git checkout foo/bar/baz^{commit} &&
+	test_path_is_dir foo/bar &&
+
+	(
+		cd foo &&
+		"$@" &&
+
+		# Although we want pwd & git status to pass, test for existing
+		# rather than desired behavior.
+		if [[ $works == "success" ]]; then
+			pwd -P &&
+			git status --porcelain
+		else
+			! pwd -P &&
+			test_might_fail git status --porcelain
+		fi
+	) &&
+	test_path_is_missing foo/bar/baz &&
+	test_path_is_missing foo/bar &&
+
+	# Although we want dir to be present, test for existing rather
+	# than desired behavior.
+	if [[ $works == "success" ]]; then
+		test_path_is_dir foo
+	else
+		test_path_is_missing foo
+	fi
+}
+
+test_required_dir_removal () {
+	works=$1 &&
+	shift &&
+
+	git checkout df_conflict^{commit} &&
+	test_when_finished "git clean -fdx" &&
+
+	(
+		cd dirORfile &&
+
+		# We'd like for the command to fail (much as it would if there
+		# was an untracked file there), and for pwd & git status to
+		# succeed afterwards.  But test for existing rather than
+		# desired behavior.
+		if [[ $works == "success" ]]; then
+			test_must_fail "$@" 2>../error &&
+			grep "Refusing to remove.*current working directory" ../error &&
+			pwd -P &&
+			git status --porcelain
+		else
+			"$@" &&
+			! pwd -P &&
+			test_might_fail git status --porcelain
+		fi
+	) &&
+
+	# Although we want dirORfile to be present, test for existing rather
+	# than desired behavior.
+	if [[ $works == "success" ]]; then
+		test_path_is_dir dirORfile
+	else
+		test_path_is_file dirORfile
+	fi
+}
+
+test_expect_success 'checkout does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git checkout init
+'
+
+test_expect_success 'checkout fails if cwd needs to be removed' '
+	test_required_dir_removal failure git checkout fd_conflict
+'
+
+test_expect_success 'reset --hard does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git reset --hard init
+'
+
+test_expect_success 'reset --hard fails if cwd needs to be removed' '
+	test_required_dir_removal failure git reset --hard fd_conflict
+'
+
+test_expect_success 'merge does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git merge reverted
+'
+
+# This file uses some simple merges where
+#   Base: 'dirORfile/' exists
+#   Side1: random other file changed
+#   Side2: 'dirORfile/' removed, 'dirORfile' added
+# this should resolve cleanly, but merge-recursive throws merge conflicts
+# because it's dumb.  Add a special test for checking merge-recursive (and
+# merge-ort), then after this just hard require ort for all remaining tests.
+#
+test_expect_success 'merge fails if cwd needs to be removed; recursive friendly' '
+	git checkout foo/bar/baz &&
+	test_when_finished "git clean -fdx" &&
+
+	mkdir dirORfile &&
+	(
+		cd dirORfile &&
+
+		# We would rather this failed, but we test for existing
+		# rather than desired behavior
+		git merge fd_conflict 2>../error
+	) &&
+
+	## Here is the behavior we would rather have:
+	#test_path_is_dir dirORfile &&
+	#grep "Refusing to remove the current working directory" error
+	## But instead we test for existing behavior
+	test_path_is_file dirORfile &&
+	test_must_be_empty error
+'
+
+GIT_TEST_MERGE_ALGORITHM=ort
+
+test_expect_success 'merge fails if cwd needs to be removed' '
+	test_required_dir_removal failure git merge fd_conflict
+'
+
+test_expect_success 'cherry-pick does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git cherry-pick reverted
+'
+
+test_expect_success 'cherry-pick fails if cwd needs to be removed' '
+	test_required_dir_removal failure git cherry-pick fd_conflict
+'
+
+test_expect_success 'rebase does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git rebase reverted
+'
+
+test_expect_success 'rebase fails if cwd needs to be removed' '
+	test_required_dir_removal failure git rebase fd_conflict
+'
+
+test_expect_success 'revert does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git revert HEAD
+'
+
+test_expect_success 'revert fails if cwd needs to be removed' '
+	test_required_dir_removal failure git revert undo_fd_conflict
+'
+
+test_expect_success 'rm does not clean cwd incidentally' '
+	test_incidental_dir_removal failure git rm bar/baz.t
+'
+
+test_expect_success 'apply does not remove cwd incidentally' '
+	git diff HEAD HEAD~1 >patch &&
+	test_incidental_dir_removal failure git apply ../patch
+'
+
+test_incidental_untracked_dir_removal () {
+	works=$1 &&
+	shift &&
+
+	test_when_finished "git reset --hard" &&
+
+	git checkout foo/bar/baz^{commit} &&
+	mkdir -p untracked &&
+	mkdir empty
+	>untracked/random &&
+
+	(
+		cd untracked &&
+		"$@" &&
+
+		# Although we want pwd & git status to pass, test for existing
+		# rather than desired behavior.
+		if [[ $works == "success" ]]; then
+			pwd -P &&
+			git status --porcelain
+		else
+			! pwd -P &&
+			test_might_fail git status --porcelain
+		fi
+	) &&
+	test_path_is_missing empty &&
+	test_path_is_missing untracked/random &&
+
+	# Although we want dir to be present, test for existing rather
+	# than desired behavior.
+	if [[ $works == "success" ]]; then
+		test_path_is_dir untracked
+	else
+		test_path_is_missing untracked
+	fi
+}
+
+test_expect_success 'clean does not remove cwd incidentally' '
+	test_incidental_untracked_dir_removal failure \
+		git -C .. clean -fd -e warnings . >warnings
+'
+
+test_expect_success 'stash does not remove cwd incidentally' '
+	test_incidental_untracked_dir_removal failure \
+		git stash --include-untracked
+'
+
+test_expect_success '`rm -rf dir` only removes a subset of dir' '
+	test_when_finished "rm -rf a/" &&
+
+	mkdir -p a/b/c &&
+	>a/b/c/untracked &&
+	>a/b/c/tracked &&
+	git add a/b/c/tracked &&
+
+	(
+		cd a/b &&
+		git rm -rf ../b
+	) &&
+
+	test_path_is_dir a/b &&
+	test_path_is_missing a/b/c/tracked &&
+	test_path_is_file a/b/c/untracked
+'
+
+test_expect_success '`rm -rf dir` even with only tracked files will remove something else' '
+	test_when_finished "rm -rf a/" &&
+
+	mkdir -p a/b/c &&
+	>a/b/c/tracked &&
+	git add a/b/c/tracked &&
+
+	(
+		cd a/b &&
+		git rm -rf ../b
+	) &&
+
+	test_path_is_missing a/b/c/tracked &&
+	## We would prefer if a/b was still present, though empty, since it
+	## was the current working directory
+	#test_path_is_dir a/b
+	## But the current behavior is that it not only deletes the directory
+	## a/b as requested, but also goes and deletes a
+	test_path_is_missing a
+'
+
+test_expect_success 'git version continues working from a deleted dir' '
+	mkdir tmp &&
+	(
+		cd tmp &&
+		rm -rf ../tmp &&
+		git version
+	)
+'
+
+test_submodule_removal () {
+	path_status=$1 &&
+	shift &&
+
+	test_status=
+	test $path_status = dir && test_status=test_must_fail
+
+	# Actually, while path_status == dir && test_status=test_must_fail
+	# reflect our desired behavior, current behavior is:
+	path_status=missing
+	test_status=
+
+	test_when_finished "git reset --hard HEAD~1" &&
+	test_when_finished "rm -rf .git/modules/my_submodule" &&
+
+	git checkout foo/bar/baz &&
+
+	git init my_submodule &&
+	touch my_submodule/file &&
+	git -C my_submodule add file &&
+	git -C my_submodule commit -m "initial commit" &&
+	git submodule add ./my_submodule &&
+	git commit -m "Add the submodule" &&
+
+	(
+		cd my_submodule &&
+		$test_status "$@"
+	) &&
+
+	test_path_is_${path_status} my_submodule
+}
+
+test_expect_success 'rm -r with -C leaves submodule if cwd inside' '
+	test_submodule_removal dir git -C .. rm -r my_submodule/
+'
+
+test_expect_success 'rm -r leaves submodule if cwd inside' '
+	test_submodule_removal dir \
+		git --git-dir=../.git --work-tree=.. rm -r ../my_submodule/
+'
+
+test_expect_success 'rm -rf removes submodule even if cwd inside' '
+	test_submodule_removal missing \
+		git --git-dir=../.git --work-tree=.. rm -rf ../my_submodule/
+'
+
+test_done
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Ævar Arnfjörð Bjarmason
Message 76 of 163 in “Avoid removing the current working directory, even if it becomes empty”
  1. 0/8 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 21, 2021
  2. 2/8 repository, setup: introduce the_cwdElijah Newren via GitGitGadget, Nov 21, 2021
  3. Junio C HamanoNov 21, 2021
  4. Elijah NewrenNov 22, 2021
  5. René ScharfeNov 21, 2021
  6. Elijah NewrenNov 22, 2021
  7. 1/8 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  8. Ævar Arnfjörð BjarmasonNov 21, 2021
  9. Elijah NewrenNov 23, 2021
  10. Ævar Arnfjörð BjarmasonNov 23, 2021
  11. Elijah NewrenNov 23, 2021
  12. Ævar Arnfjörð BjarmasonNov 25, 2021
  13. 4/8 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 21, 2021
  14. 3/8 unpack-trees: refuse to remove the current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  15. 7/8 stash: do not attempt to remove current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  16. 6/8 clean: do not attempt to remove current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  17. Ævar Arnfjörð BjarmasonNov 21, 2021
  18. Elijah NewrenNov 23, 2021
  19. 5/8 symlinks: do not include current working directory in dir removalElijah Newren via GitGitGadget, Nov 21, 2021
  20. René ScharfeNov 21, 2021
  21. Elijah NewrenNov 23, 2021
  22. 8/8 dir: avoid removing the current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  23. Glen ChooNov 23, 2021
  24. Elijah NewrenNov 23, 2021
  25. Glen ChooNov 23, 2021
  26. Elijah NewrenNov 23, 2021
  27. Glen ChooNov 23, 2021
  28. Junio C HamanoNov 23, 2021
  29. Elijah NewrenNov 23, 2021
  30. Junio C HamanoNov 24, 2021
  31. Elijah NewrenNov 23, 2021
  32. Glen ChooNov 24, 2021
  33. Junio C HamanoNov 24, 2021
  34. Ævar Arnfjörð BjarmasonNov 24, 2021
  35. Elijah NewrenNov 24, 2021
  36. Ævar Arnfjörð BjarmasonNov 24, 2021
  37. Philip OakleyNov 24, 2021
  38. Junio C HamanoNov 24, 2021
  39. Philip OakleyNov 25, 2021
  40. Ævar Arnfjörð BjarmasonNov 25, 2021
  41. Ævar Arnfjörð BjarmasonNov 24, 2021
  42. Elijah NewrenNov 25, 2021
  43. Ævar Arnfjörð BjarmasonNov 25, 2021
  44. The overhead of bin-wrappers/ (was: [PATCH 8/8] dir: avoid removing the current working directory)Ævar Arnfjörð Bjarmason, Nov 26, 2021
  45. Elijah NewrenNov 25, 2021
  46. Junio C HamanoNov 24, 2021
  47. Junio C HamanoNov 21, 2021
  48. 0/9 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 25, 2021
  49. 1/9 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 25, 2021
  50. Ævar Arnfjörð BjarmasonNov 25, 2021
  51. 2/9 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  52. Ævar Arnfjörð BjarmasonNov 25, 2021
  53. Elijah NewrenNov 26, 2021
  54. Junio C HamanoNov 26, 2021
  55. Elijah NewrenNov 26, 2021
  56. Derrick StoleeNov 29, 2021
  57. Junio C HamanoNov 29, 2021
  58. Elijah NewrenNov 29, 2021
  59. Derrick StoleeNov 29, 2021
  60. 3/9 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  61. Ævar Arnfjörð BjarmasonNov 25, 2021
  62. Elijah NewrenNov 26, 2021
  63. Derrick StoleeNov 29, 2021
  64. Elijah NewrenNov 29, 2021
  65. 4/9 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 25, 2021
  66. Derrick StoleeNov 29, 2021
  67. Elijah NewrenNov 29, 2021
  68. 5/9 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Nov 25, 2021
  69. 7/9 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  70. Ævar Arnfjörð BjarmasonNov 25, 2021
  71. Elijah NewrenNov 26, 2021
  72. 6/9 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  73. 8/9 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Nov 25, 2021
  74. 9/9 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  75. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 26, 2021
  76. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 26, 2021
  77. Ævar Arnfjörð BjarmasonNov 27, 2021
  78. Elijah NewrenNov 27, 2021
  79. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  80. Ævar Arnfjörð BjarmasonNov 27, 2021
  81. Elijah NewrenNov 27, 2021
  82. Ævar Arnfjörð BjarmasonNov 27, 2021
  83. Elijah NewrenNov 27, 2021
  84. Ævar Arnfjörð BjarmasonNov 28, 2021
  85. Elijah NewrenNov 29, 2021
  86. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  87. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 26, 2021
  88. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Nov 26, 2021
  89. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  90. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  91. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  92. Derrick StoleeNov 29, 2021
  93. Elijah NewrenNov 29, 2021
  94. Derrick StoleeNov 29, 2021
  95. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Nov 26, 2021
  96. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  97. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Nov 26, 2021
  98. Derrick StoleeNov 29, 2021
  99. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 29, 2021
  100. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  101. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 29, 2021
  102. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  103. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Nov 29, 2021
  104. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  105. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  106. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  107. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Nov 29, 2021
  108. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 29, 2021
  109. Junio C HamanoNov 30, 2021
  110. Elijah NewrenNov 30, 2021
  111. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Nov 29, 2021
  112. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  113. Eric SunshineNov 29, 2021
  114. Elijah NewrenNov 30, 2021
  115. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Dec 1, 2021
  116. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Dec 1, 2021
  117. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  118. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  119. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Dec 1, 2021
  120. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Dec 1, 2021
  121. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  122. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  123. [Bug] Rebase from worktree subdir is broken (was Re: [PATCH v5 07/11] rebase: do not attempt to remove startup_info->original_cwd)Glen Choo, Jan 25, 2022
  124. Elijah NewrenJan 25, 2022
  125. Glen ChooJan 26, 2022
  126. Elijah NewrenJan 26, 2022
  127. Eric SunshineJan 26, 2022
  128. Eric SunshineJan 26, 2022
  129. Elijah NewrenJan 26, 2022
  130. Glen ChooJan 26, 2022
  131. Elijah NewrenJan 26, 2022
  132. Phillip WoodJan 26, 2022
  133. Eric SunshineJan 26, 2022
  134. Phillip WoodJan 27, 2022
  135. Elijah NewrenJan 27, 2022
  136. Eric SunshineFeb 5, 2022
  137. Eric SunshineFeb 5, 2022
  138. Elijah NewrenFeb 5, 2022
  139. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  140. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Dec 1, 2021
  141. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  142. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Dec 1, 2021
  143. Derrick StoleeDec 7, 2021
  144. Ævar Arnfjörð BjarmasonDec 7, 2021
  145. Derrick StoleeDec 7, 2021
  146. Ævar Arnfjörð BjarmasonDec 8, 2021
  147. Elijah NewrenDec 7, 2021
  148. Derrick StoleeDec 7, 2021
  149. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Dec 9, 2021
  150. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Dec 9, 2021
  151. Ævar Arnfjörð BjarmasonMar 11, 2022
  152. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  153. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  154. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Dec 9, 2021
  155. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  156. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Dec 9, 2021
  157. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  158. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  159. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Dec 9, 2021
  160. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  161. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Dec 9, 2021
  162. Phillip WoodNov 30, 2021
  163. Elijah NewrenDec 1, 2021

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.