zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: rm * with count
@ 2016-02-10 16:41 Peter Stephenson
  2016-02-10 21:20 ` Bart Schaefer
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Stephenson @ 2016-02-10 16:41 UTC (permalink / raw)
  To: Zsh Hackers' List

Faced with a "rm *" prompt, it occurred to me it might be a little bit
more helpful to decide if something has gone really horribly wrong if we
made the easy tweak to count the number of files in the directory.

Any comments on the following?

pws

diff --git a/Src/utils.c b/Src/utils.c
index de4af5a..362bd17 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -2634,13 +2634,27 @@ 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);
+    }
+    if ((rmd = opendir(unmeta(s)))) {
+	int ignoredots = !isset(GLOBDOTS);
+	while (zreaddir(rmd, ignoredots))
+	    count++;
+	closedir(rmd);
     }
+    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);


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: PATCH: rm * with count
  2016-02-10 16:41 PATCH: rm * with count Peter Stephenson
@ 2016-02-10 21:20 ` Bart Schaefer
  2016-02-11 11:50   ` Peter Stephenson
  0 siblings, 1 reply; 3+ messages in thread
From: Bart Schaefer @ 2016-02-10 21:20 UTC (permalink / raw)
  To: Zsh Hackers' List

On Feb 10,  4:41pm, Peter Stephenson wrote:
} Subject: PATCH: rm * with count
}
} Faced with a "rm *" prompt, it occurred to me it might be a little bit
} more helpful to decide if something has gone really horribly wrong if we
} made the easy tweak to count the number of files in the directory.
} 
} Any comments on the following?

My only comment would be that this can potentially take a long time if
the number of files in the directory is large.  Perhaps stop after some
number (100?) and prompt with

    "sure you want to delete more than %d files in "

Also if the count is zero maybe the prompt should say something about
"no files to remove" or something.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: PATCH: rm * with count
  2016-02-10 21:20 ` Bart Schaefer
@ 2016-02-11 11:50   ` Peter Stephenson
  0 siblings, 0 replies; 3+ messages in thread
From: Peter Stephenson @ 2016-02-11 11:50 UTC (permalink / raw)
  To: Zsh Hackers' List

On Wed, 10 Feb 2016 13:20:48 -0800
Bart Schaefer <schaefer@brasslantern.com> wrote:
> On Feb 10,  4:41pm, Peter Stephenson wrote:
> } Subject: PATCH: rm * with count
> }
> } Faced with a "rm *" prompt, it occurred to me it might be a little bit
> } more helpful to decide if something has gone really horribly wrong if we
> } made the easy tweak to count the number of files in the directory.
> } 
> } Any comments on the following?
> 
> My only comment would be that this can potentially take a long time if
> the number of files in the directory is large.  Perhaps stop after some
> number (100?) and prompt with
> 
>     "sure you want to delete more than %d files in "

It can certainly be slow if it's on a network, although it's going to
have to do the full glob anyway if it actually executes the command.

> Also if the count is zero maybe the prompt should say something about
> "no files to remove" or something.

I didn't feel it was quite the job of this test to say things like "I
can't actually find that directory" or "I've found it but it's empty";
it was starting to get too fiddly and not really adding to safety, which
was the primary purpose.

pws


diff --git a/Src/utils.c b/Src/utils.c
index de4af5a..12911d3 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);


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-02-11 12:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-10 16:41 PATCH: rm * with count Peter Stephenson
2016-02-10 21:20 ` Bart Schaefer
2016-02-11 11:50   ` Peter Stephenson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).