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 <vmiklos@xxxxxxxxxxxxxx> --- 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 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html