Thread (13 messages) flat view 13 messages, 3 authors, 2016-06-15
STALE3734d

Revision v2 of 2 in this series.

Revisions (2)
  1. v1 [diff vs current]
  2. v2 current

[PATCH v2 4/9] git rm: display a warning for every unremovable file

From: Peter Collingbourne <hidden>
Date: 2016-06-15 22:48:35
Subsystem: the rest · Maintainer: Linus Torvalds

When ‘git rm’ was built in (d9b814cc, 2006-05-19), its
semantics changed: before, it just removed files until it
encountered an error and then would error out, whereas since
then, it makes an attempt to either remove all files or remove
none at all.  In particular, if ‘git rm’ fails to remove a
file after other files have already been removed, it does not
abort but instead silently accepts the error.

Better to warn the user in this case!

This problem is particularly noticeable when dealing with submodules
because the rmdir operation will fail for every initialised submodule.
The removal of the contents of an initialised submodule directory
should always be user controlled, due to the possibility of
unpropagated changes to the submodule.  Therefore, the user should
always be informed of any such removal failures.

Based-on-work-by: Jonathan Nieder [off-list ref]
Signed-off-by: Peter Collingbourne <redacted>
---
 builtin/rm.c  |    2 ++
 t/t3600-rm.sh |   15 +++++++++++++++
 2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/builtin/rm.c b/builtin/rm.c
index f3772c8..05a5158 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -259,6 +259,8 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
 			}
 			if (!removed)
 				die_errno("git rm: '%s'", path);
+			else
+				warning("git rm: '%s': %s", path, strerror(errno));
 		}
 	}
 
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 5186844..ecddd67 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -180,6 +180,21 @@ test_expect_success 'Message when first removal fails' '
 ! test -e plugh || chmod 775 plugh
 rm -fr msg plugh xyzzy
 
+test_expect_success 'Message when second removal fails' '
+	touch plugh &&
+	mkdir -p xyzzy &&
+	touch xyzzy/plugh &&
+	git add plugh xyzzy/plugh &&
+	git commit --allow-empty -a -m "two files to remove" &&
+	chmod a-w xyzzy &&
+
+	git rm plugh xyzzy/plugh 2>msg &&
+
+	grep "git rm: '\''xyzzy/plugh'\'':" msg
+'
+! test -e xyzzy || chmod 775 xyzzy
+rm -fr expect actual plugh xyzzy
+
 test_expect_success '"rm" command printed' '
 	echo frotz > test-file &&
 	git add test-file &&
-- 
1.6.5
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help