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

[PATCH 3/3] t3600: test rm of path with changed leading symlinks

From
Jeff King <peff@peff.net>
Date
Apr 4, 2013, 19:06 UTC
Message-ID
<20130404190621.GA7484@sigill.intra.peff.net>
In-Reply-To
<20130404190211.GA15912@sigill.intra.peff.net>

If we have a path "d/f" but replace "d" with a symlink to a new directory "e", how should we handle "git rm d/f"?

It may seem at first like we need new protections to make sure that we do not delete random content from "e/f". However, we are already covered by git-rm's existing protections: it is happy if the working tree file is either already deleted, or if its content matches that of the index and HEAD (and otherwise requires "-f").

Let's add some tests to make sure that these protections remain in place when used across symlinks. We also want to make sure that neither the symlink nor the pointed-to directory is accidentally removed in an attempt to clean up empty elements of the leading path.

Signed-off-by: Jeff King <peff@peff.net>
---
 t/t3600-rm.sh | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index a2e1a03..9eaec08 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -659,4 +659,47 @@ test_expect_success 'rm of file when it has become a directory' '
 	test_path_is_file d/f
 '
 
+test_expect_success 'set up commit with d/f' '
+	rm -rf d e &&
+	mkdir d &&
+	echo content >d/f &&
+	git add d &&
+	git commit -m d
+'
+
+test_expect_success SYMLINKS 'replace dir with symlink to dir (file missing)' '
+	git reset --hard &&
+	rm -rf d e &&
+	mkdir e &&
+	ln -s e d &&
+	git rm d/f &&
+	test_must_fail git rev-parse --verify :d/f &&
+	test -h d &&
+	test_path_is_dir e
+'
+
+test_expect_success SYMLINKS 'replace dir with symlink to dir (same content)' '
+	git reset --hard &&
+	rm -rf d e &&
+	mkdir e &&
+	echo content >e/f &&
+	ln -s e d &&
+	git rm d/f &&
+	test_must_fail git rev-parse --verify :d/f &&
+	test -h d &&
+	test_path_is_dir e
+'
+
+test_expect_success SYMLINKS 'replace dir with symlink to dir (new content)' '
+	git reset --hard &&
+	rm -rf d e &&
+	mkdir e &&
+	echo changed >e/f &&
+	ln -s e d &&
+	test_must_fail git rm d/f &&
+	git rev-parse --verify :d/f &&
+	test -h d &&
+	test_path_is_file e/f
+'
+
 test_done
-- 
1.8.2.rc0.33.gd915649
Previous: Jeff KingNext: Junio C Hamano
Message 8 of 18 in “Behavior of git rm”
  1. jpinheiroApr 3, 2013
  2. Jeff KingApr 3, 2013
  3. Junio C HamanoApr 3, 2013
  4. Jeff KingApr 3, 2013
  5. Jeff KingApr 4, 2013
  6. 1/3 rm: do not complain about d/f conflicts during deletionJeff King, Apr 4, 2013
  7. 2/3 t3600: test behavior of reverse-d/f conflictJeff King, Apr 4, 2013
  8. 3/3 t3600: test rm of path with changed leading symlinksJeff King, Apr 4, 2013
  9. Junio C HamanoApr 4, 2013
  10. Jeff KingApr 4, 2013
  11. Junio C HamanoApr 4, 2013
  12. Jeff KingApr 4, 2013
  13. Junio C HamanoApr 4, 2013
  14. Jeff KingApr 4, 2013
  15. Junio C HamanoApr 4, 2013
  16. Jeff KingApr 5, 2013
  17. Junio C HamanoApr 5, 2013
  18. Jeff KingApr 5, 2013

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.