[PATCH] git-clean: handle errors if removing files fails
From: Miklos Vajna <hidden>
Date: 2016-06-15 22:44:15
Subsystem:
the rest · Maintainer:
Linus Torvalds
Consider the following case: $ sudo mkdir foo $ sudo touch foo/bar This is the old output: $ git clean -f -d Removing foo/ No error message. This is the new output: $ ~/git/git/git clean -f -d Removing foo/ fatal: failed to remove 'foo/' Signed-off-by: Miklos Vajna <redacted> --- builtin-clean.c | 14 ++++++++------ t/t7300-clean.sh | 9 +++++++++ 2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/builtin-clean.c b/builtin-clean.c
index eb853a3..c8753a5 100644
--- a/builtin-clean.c
+++ b/builtin-clean.c@@ -137,12 +137,13 @@ int cmd_clean(int argc, const char **argv, const char *prefix) if (show_only && (remove_directories || matches)) { printf("Would remove %s\n", directory.buf + prefix_offset); - } else if (quiet && (remove_directories || matches)) { - remove_dir_recursively(&directory, 0); } else if (remove_directories || matches) { - printf("Removing %s\n", - directory.buf + prefix_offset); - remove_dir_recursively(&directory, 0); + if (!quiet) + printf("Removing %s\n", + directory.buf + prefix_offset); + if (remove_dir_recursively(&directory, 0) != 0) + die("failed to remove '%s'", + directory.buf + prefix_offset); } else if (show_only) { printf("Would not remove %s\n", directory.buf + prefix_offset);
@@ -162,7 +163,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix) printf("Removing %s\n", ent->name + prefix_offset); } - unlink(ent->name); + if (unlink(ent->name) != 0) + die("failed to remove '%s'", ent->name); } } free(seen);
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index dfd1188..bd0a814 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh@@ -316,4 +316,13 @@ test_expect_success 'core.excludesfile' ' ' +test_expect_success 'removal failure' ' + + mkdir foo && + touch foo/bar && + chmod 0 foo && + ! git clean -f -d + +' + test_done
--
1.5.4.1