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@frugalware.org> --- builtin-clean.c | 14 ++++++++------ t/t7300-clean.sh | 9 +++++++++ 2 files changed, 17 insertions(+), 6 deletions(-)
Show changes to 2 files +17 −6
builtin-clean.c, t/t7300-clean.sh
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