summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/utils.c31
2 files changed, 32 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index a549e1112..a6e3514fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-11 Peter Stephenson <p.stephenson@samsung.com>
+
+ * 37946: Src/utils.c: make rm * warnings more informative about
+ files being deleted.
+
2016-02-09 Peter Stephenson <p.stephenson@samsung.com>
* 37893: Doc/Zsh/builtins.yo: document behaviour of typeset -U
diff --git a/Src/utils.c b/Src/utils.c
index de4af5a51..12911d3f4 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -2634,13 +2634,36 @@ zsleep_random(long max_us, time_t end_time)
int
checkrmall(char *s)
{
+ DIR *rmd;
+ int count = 0;
if (!shout)
return 1;
- fprintf(shout, "zsh: sure you want to delete all the files in ");
if (*s != '/') {
- nicezputs(pwd[1] ? pwd : "", shout);
- fputc('/', shout);
- }
+ if (pwd[1])
+ s = zhtricat(pwd, "/", s);
+ else
+ s = dyncat("/", s);
+ }
+ const int max_count = 100;
+ if ((rmd = opendir(unmeta(s)))) {
+ int ignoredots = !isset(GLOBDOTS);
+ while (zreaddir(rmd, ignoredots)) {
+ count++;
+ if (count > max_count)
+ break;
+ }
+ closedir(rmd);
+ }
+ if (count > max_count)
+ fprintf(shout, "zsh: sure you want to delete more than %d files in ",
+ max_count);
+ else if (count == 1)
+ fprintf(shout, "zsh: sure you want to delete the only file in ");
+ else if (count > 0)
+ fprintf(shout, "zsh: sure you want to delete all %d files in ",
+ count);
+ else
+ fprintf(shout, "zsh: sure you want to delete all the files in ");
nicezputs(s, shout);
if(isset(RMSTARWAIT)) {
fputs("? (waiting ten seconds)", shout);