Github messages for mblaze
 help / color / mirror / Atom feed
* [PR PATCH] Exit with a non-zero exit status if a given mail does not exist
@ 2024-10-08 19:12 nmeum
  2024-10-08 19:13 ` nmeum
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: nmeum @ 2024-10-08 19:12 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1202 bytes --]

There is a new pull request by nmeum against master on the mblaze repository

https://github.com/nmeum/mblaze mblaze-error-handling
https://github.com/leahneukirchen/mblaze/pull/265

Exit with a non-zero exit status if a given mail does not exist
Sadly, the diff is quite large as we will have to change the API of `blaze822_loop` to differentiate the number of processed messages and a status code indicating a missing mail. Note that currently execution is not aborted upon encountering the first non-existent mail; hence, we can't do both via the return value.

Surprisingly, very few utilities actually use the number of processed messages as return by `blaze822_loop`. Therefore, we could reduce the diff quite a bit by differentiating the two use cases through separate function (e.g. `blaze822_loop` and `blaze822_loop_num`), which would allow the API of blaze822_loop to remain largely unchanged.

The new `blaze822_loop` API would also allow us to improve error handling for `blaze822_seq_next` but I haven't done this so far…

There are also some tests, but these should be expanded.

Fixes #264

A patch file from https://github.com/leahneukirchen/mblaze/pull/265.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-mblaze-error-handling-265.patch --]
[-- Type: text/x-diff, Size: 16422 bytes --]

From 900863bf7638c2cedbb5652c2672c043cbcb6c92 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net>
Date: Tue, 8 Oct 2024 23:16:07 +0200
Subject: [PATCH] Exit with a non-zero exit status if a given file does not
 exist

Sadly, the diff is quite large as we will have to change the API
of `blaze822_loop` to differentiate the number of processed messages
and a status code indicating a missing mail. Note that currently
execution is not aborted upon encountering the first non-existent
mail; hence, we can't do both via the return value.

Surprisingly, very few utilities actually use the number of processed
messages as return by `blaze822_loop`. Therefore, we could reduce the
diff quite a bit by differentiating the two use cases through separate
function (e.g. `blaze822_loop` and `blaze822_loop_num`), which would
allow the API of blaze822_loop to remain largely unchanged.

The new `blaze822_loop` API would also allow us to improve error
handling for blaze822_seq_next but I haven't done this so far.

There are also some tests, but these should be expanded.

Fixes #264
---
 blaze822.h       |  4 ++--
 maddr.c          |  6 ++----
 magrep.c         |  4 ++--
 mdeliver.c       |  4 +---
 mexport.c        |  4 ++--
 mflag.c          | 20 +++++++++-----------
 mhdr.c           |  4 ++--
 minc.c           |  2 +-
 mlist.c          |  5 +++--
 mpick.c          |  7 ++++---
 mscan.c          | 12 ++++++------
 msed.c           |  6 ++----
 mseq.c           |  9 +++++----
 mshow.c          | 21 +++++++++++----------
 msort.c          |  7 ++++---
 mthread.c        |  9 +++++----
 seq.c            | 41 ++++++++++++++++++++++++++++-------------
 t/1100-mhdr.t    |  3 ++-
 t/1500-maddr.t   |  3 ++-
 t/1800-mexport.t |  3 ++-
 t/8000-mflag.t   |  3 ++-
 21 files changed, 97 insertions(+), 80 deletions(-)

diff --git a/blaze822.h b/blaze822.h
index 1346345..aeb9c04 100644
--- a/blaze822.h
+++ b/blaze822.h
@@ -85,8 +85,8 @@ struct blaze822_seq_iter {
 };
 
 char *blaze822_seq_next(char *map, char *range, struct blaze822_seq_iter *iter);
-long blaze822_loop(int, char **, void (*)(char *));
-long blaze822_loop1(char *arg, void (*cb)(char *));
+int blaze822_loop(long *num, int, char **, void (*)(char *));
+int blaze822_loop1(long *num, char *arg, void (*cb)(char *));
 char *blaze822_home_file(char *basename);
 
 // filter.c
diff --git a/maddr.c b/maddr.c
index 4982a8c..b534dda 100644
--- a/maddr.c
+++ b/maddr.c
@@ -114,9 +114,7 @@ main(int argc, char *argv[])
 	xpledge("stdio rpath", "");
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", addr);
+		return blaze822_loop1(NULL, ":", addr);
 	else
-		blaze822_loop(argc-optind, argv+optind, addr);
-
-	return 0;
+		return blaze822_loop(NULL, argc-optind, argv+optind, addr);
 }
diff --git a/magrep.c b/magrep.c
index 608048a..03be789 100644
--- a/magrep.c
+++ b/magrep.c
@@ -232,9 +232,9 @@ main(int argc, char *argv[])
 	}
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", magrep);
+		blaze822_loop1(NULL, ":", magrep);
 	else
-		blaze822_loop(argc-optind, argv+optind, magrep);
+		blaze822_loop(NULL, argc-optind, argv+optind, magrep);
 
 	if (cflag && !qflag && !mflag)
 		printf("%ld\n", matches);
diff --git a/mdeliver.c b/mdeliver.c
index 73fac4a..2e11ded 100644
--- a/mdeliver.c
+++ b/mdeliver.c
@@ -331,9 +331,7 @@ main(int argc, char *argv[])
 		if (argc == optind + 1 && isatty(0))
 			goto usage;
 		else
-			blaze822_loop(argc - 1 - optind, argv + optind, refile);
-
-		return 0;
+			return blaze822_loop(NULL, argc - 1 - optind, argv + optind, refile);
 	}
 
 	int c;
diff --git a/mexport.c b/mexport.c
index 0ac490d..fd64e47 100644
--- a/mexport.c
+++ b/mexport.c
@@ -148,9 +148,9 @@ main(int argc, char *argv[])
 	xpledge("stdio rpath", "");
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", export);
+		status |= blaze822_loop1(NULL, ":", export);
 	else
-		blaze822_loop(argc-optind, argv+optind, export);
+		status |= blaze822_loop(NULL, argc-optind, argv+optind, export);
 
 	return status;
 }
diff --git a/mflag.c b/mflag.c
index ae9a9f2..4881737 100644
--- a/mflag.c
+++ b/mflag.c
@@ -141,31 +141,29 @@ main(int argc, char *argv[])
 
 	if (vflag) {
 		if (argc == optind && !isatty(0)) {
-			blaze822_loop(0, 0, flag);  // read from stdin
-			return 0;
+			return blaze822_loop(NULL, 0, 0, flag);  // read from stdin
 		}
 
 		args = calloc(argsalloc, sizeof (char *));
 		if (!args)
 			exit(-1);
 
+		int status;
 		if (argc == optind)
-			blaze822_loop1(".", add);
+			status = blaze822_loop1(NULL, ".", add);
 		else
-			blaze822_loop(argc-optind, argv+optind, add);
+			status = blaze822_loop(NULL, argc-optind, argv+optind, add);
 
 		if (isatty(0))
-			blaze822_loop1(":", flag);
+			status |= blaze822_loop1(NULL, ":", flag);
 		else
-			blaze822_loop(0, 0, flag);
+			status |= blaze822_loop(NULL, 0, 0, flag);
 
-		return 0;
+		return status;
 	}
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(".", flag);
+		return blaze822_loop1(NULL, ".", flag);
 	else
-		blaze822_loop(argc-optind, argv+optind, flag);
-
-	return 0;
+		return blaze822_loop(NULL, argc-optind, argv+optind, flag);
 }
diff --git a/mhdr.c b/mhdr.c
index b6e9fa0..a16d586 100644
--- a/mhdr.c
+++ b/mhdr.c
@@ -250,9 +250,9 @@ main(int argc, char *argv[])
 	xpledge("stdio rpath", "");
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(".", header);
+		status |= blaze822_loop1(NULL, ".", header);
 	else
-		blaze822_loop(argc-optind, argv+optind, header);
+		status |= blaze822_loop(NULL, argc-optind, argv+optind, header);
 
 	return status;
 }
diff --git a/minc.c b/minc.c
index 757c65b..74af291 100644
--- a/minc.c
+++ b/minc.c
@@ -81,7 +81,7 @@ main(int argc, char *argv[])
 	if (optind == argc) {
 		if (isatty(0))
 			goto usage;
-		blaze822_loop(0, 0, inc);
+		status = blaze822_loop(NULL, 0, 0, inc);
 	} else {
 		for (i = optind; i < argc; i++)
 			inc(argv[i]);
diff --git a/mlist.c b/mlist.c
index e0ec42c..b358554 100644
--- a/mlist.c
+++ b/mlist.c
@@ -282,10 +282,11 @@ main(int argc, char *argv[])
 			flagsum++;
 	}
 
+	int status = 0;
 	if (optind == argc) {
 		if (isatty(0))
 			goto usage;
-		blaze822_loop(0, 0, listarg);
+		status = blaze822_loop(NULL, 0, 0, listarg);
 	} else {
 		for (i = optind; i < argc; i++)
 			listarg(argv[i]);
@@ -300,5 +301,5 @@ main(int argc, char *argv[])
 			    tunseen, tflagged, tcount);
 	}
 
-	return 0;
+	return status;
 }
diff --git a/mpick.c b/mpick.c
index 661e472..c158291 100644
--- a/mpick.c
+++ b/mpick.c
@@ -1464,11 +1464,12 @@ main(int argc, char *argv[])
 
 	xpledge("stdio rpath wpath cpath proc exec", 0);
 
+	int status;
 	void (*cb)(char *) = need_thr ? collect : oneline;
 	if (argc == optind && isatty(0))
-		i = blaze822_loop1(":", cb);
+		status = blaze822_loop1(&i, ":", cb);
 	else
-		i = blaze822_loop(argc-optind, argv+optind, cb);
+		status = blaze822_loop(&i, argc-optind, argv+optind, cb);
 
 	/* print and free last thread */
 	if (Tflag && thr)
@@ -1488,5 +1489,5 @@ main(int argc, char *argv[])
 		free(files);
 	}
 
-	return 0;
+	return status;
 }
diff --git a/mscan.c b/mscan.c
index bb6cd9e..4ff1267 100644
--- a/mscan.c
+++ b/mscan.c
@@ -559,10 +559,9 @@ main(int argc, char *argv[])
 
 	if (nflag) {
 		if (argc == optind && isatty(0))
-			blaze822_loop1(":", numline);
+			return blaze822_loop1(NULL, ":", numline);
 		else
-			blaze822_loop(argc-optind, argv+optind, numline);
-		return 0;
+			return blaze822_loop(NULL, argc-optind, argv+optind, numline);
 	}
 
 	now = time(0);
@@ -623,10 +622,11 @@ main(int argc, char *argv[])
 	}
 
 	long i;
+	int status;
 	if (argc == optind && isatty(0))
-		i = blaze822_loop1(":", oneline);
+		status = blaze822_loop1(&i, ":", oneline);
 	else
-		i = blaze822_loop(argc-optind, argv+optind, oneline);
+		status = blaze822_loop(&i, argc-optind, argv+optind, oneline);
 
 	if (pager_pid > 0)
 		pipeclose(pager_pid);
@@ -634,5 +634,5 @@ main(int argc, char *argv[])
 	if (vflag)
 		fprintf(stderr, "%ld mails scanned\n", i);
 
-	return 0;
+	return status;
 }
diff --git a/msed.c b/msed.c
index c545278..ab78300 100644
--- a/msed.c
+++ b/msed.c
@@ -330,9 +330,7 @@ main(int argc, char *argv[])
 	optind++;
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(".", sed);
+		return blaze822_loop1(NULL, ".", sed);
 	else
-		blaze822_loop(argc-optind, argv+optind, sed);
-
-	return 0;
+		return blaze822_loop(NULL, argc-optind, argv+optind, sed);
 }
diff --git a/mseq.c b/mseq.c
index ac3aa19..f653345 100644
--- a/mseq.c
+++ b/mseq.c
@@ -301,12 +301,13 @@ main(int argc, char *argv[])
 
 	xpledge("stdio rpath wpath cpath", "");
 
-	if (cflag)
-		blaze822_loop1(cflag, overridecur);
+	if (cflag) {
+		if (blaze822_loop1(NULL, cflag, overridecur))
+			return 1;
+	}
 
 	if (Cflag) {
-		blaze822_loop1(Cflag, setcur);
-		return 0;
+		return blaze822_loop1(NULL, Cflag, setcur);
 	}
 
 	if (Sflag && optind != argc) {
diff --git a/mshow.c b/mshow.c
index d0871f2..76df723 100644
--- a/mshow.c
+++ b/mshow.c
@@ -587,13 +587,13 @@ extract_cb(char *file)
 	blaze822_walk_mime(msg, 0, extract_mime);
 }
 
-void
+int
 extract(char *file, int argc, char **argv, int use_stdout)
 {
 	extract_argc = argc;
 	extract_argv = argv;
 	extract_stdout = use_stdout;
-	blaze822_loop1(file, extract_cb);
+	return blaze822_loop1(NULL, file, extract_cb);
 }
 
 static char *newcur;
@@ -832,21 +832,22 @@ main(int argc, char *argv[])
 		}
 	}
 
+	int status = 0;
 	if (xflag) { // extract
 		xpledge("stdio rpath wpath cpath", NULL);
-		extract(xflag, argc-optind, argv+optind, 0);
+		status = extract(xflag, argc-optind, argv+optind, 0);
 	} else if (Oflag) { // extract to stdout
 		xpledge("stdio rpath", NULL);
-		extract(Oflag, argc-optind, argv+optind, 1);
+		status = extract(Oflag, argc-optind, argv+optind, 1);
 	} else if (tflag) { // list
 		xpledge("stdio rpath", NULL);
 		if (argc == optind && isatty(0))
-			blaze822_loop1(".", list);
+			status = blaze822_loop1(NULL, ".", list);
 		else
-			blaze822_loop(argc-optind, argv+optind, list);
+			status = blaze822_loop(NULL, argc-optind, argv+optind, list);
 	} else if (Rflag) { // render for reply
 		xpledge("stdio rpath", NULL);
-		blaze822_loop(argc-optind, argv+optind, reply);
+		status = blaze822_loop(NULL, argc-optind, argv+optind, reply);
 	} else { // show
 		/* XXX pledge: still r/w on the whole file-system + fork/exec */
 		if (!(qflag || rflag || Fflag)) {
@@ -857,9 +858,9 @@ main(int argc, char *argv[])
 				filters = blaze822(f);
 		}
 		if (argc == optind && isatty(0))
-			blaze822_loop1(".", show);
+			status = blaze822_loop1(NULL, ".", show);
 		else
-			blaze822_loop(argc-optind, argv+optind, show);
+			status = blaze822_loop(NULL, argc-optind, argv+optind, show);
 		if (!nflag) // don't set cur
 			if (newcur)
 				blaze822_seq_setcur(newcur);
@@ -875,5 +876,5 @@ main(int argc, char *argv[])
 		return 1;
 	}
 
-	return 0;
+	return status;
 }
diff --git a/msort.c b/msort.c
index 55ec6aa..ccb375a 100644
--- a/msort.c
+++ b/msort.c
@@ -323,10 +323,11 @@ main(int argc, char *argv[])
 	if (!mails)
 		exit(-1);
 
+	int status;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", add);
+		status = blaze822_loop1(NULL, ":", add);
 	else
-		blaze822_loop(argc-optind, argv+optind, add);
+		status = blaze822_loop(NULL, argc-optind, argv+optind, add);
 
 	qsort(mails, idx, sizeof (struct mail), order);
 
@@ -337,5 +338,5 @@ main(int argc, char *argv[])
 		for (i = 0; i < idx; i++)
 			printf("%s\n", mails[i].file);
 
-	return 0;
+	return status;
 }
diff --git a/mthread.c b/mthread.c
index 77fb21e..8344b73 100644
--- a/mthread.c
+++ b/mthread.c
@@ -421,7 +421,7 @@ main(int argc, char *argv[])
 
 	while ((c = getopt(argc, argv, "S:prv")) != -1)
 		switch (c) {
-		case 'S': blaze822_loop1(optarg, thread); break;
+		case 'S': blaze822_loop1(NULL, optarg, thread); break;
 		case 'v': vflag = 1; break;
 		case 'p': pflag = 1; break;
 		case 'r': rflag = 1; break;
@@ -432,10 +432,11 @@ main(int argc, char *argv[])
 
 	optional = 0;
 
+	int status;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", thread);
+		status = blaze822_loop1(NULL, ":", thread);
 	else
-		blaze822_loop(argc-optind, argv+optind, thread);
+		status = blaze822_loop(NULL, argc-optind, argv+optind, thread);
 
 	// the tree of all toplevel threads has depth -1,
 	// so toplevel threads have depth 0.
@@ -446,5 +447,5 @@ main(int argc, char *argv[])
 	sort_tree(top, -1);
 	print_tree(top, -1);
 
-	return 0;
+	return status;
 }
diff --git a/seq.c b/seq.c
index 5d98284..d1cebac 100644
--- a/seq.c
+++ b/seq.c
@@ -493,11 +493,13 @@ iterdir(char *dir, void (*cb)(char *))
 		m = "";
 		n = scandir(dir, &namelist, 0, mailsort);
 	}
-		
-	if (n == -1) {	
-		if (errno == ENOTDIR)
+
+	if (n == -1) {
+		if (errno == ENOTDIR) {
 			cb(dir);
-		return 1;
+			return 1;
+		}
+		return 0;
 	}
 
 	long i = 0;
@@ -515,8 +517,8 @@ iterdir(char *dir, void (*cb)(char *))
 	return i;
 }
 
-long
-blaze822_loop(int argc, char *argv[], void (*cb)(char *))
+int
+blaze822_loop(long *num, int argc, char *argv[], void (*cb)(char *))
 {
 	char *line = 0;
 	size_t linelen = 0;
@@ -531,15 +533,25 @@ blaze822_loop(int argc, char *argv[], void (*cb)(char *))
 			i++;
 		}
 		free(line);
-		return i;
+
+		if (num)
+			*num = i;
+		return 0;
 	}
 
 	char *map = 0;
+	int status = 0;
 	int map_opened = 0;
-	int j = 0;
+	long j = 0;
 	for (i = 0; i < argc; i++) {
 		if (strchr(argv[i], '/')) {  // a file name
-			j += iterdir(argv[i], cb);
+			long n = iterdir(argv[i], cb);
+			if (!n) {
+				fprintf(stderr, "mblaze: warning: file '%s' does not exist\n", argv[i]);
+				status = 1;
+			} else {
+				j += n;
+			}
 		} else if (strcmp(argv[i], "-") == 0) {
 			if (isatty(0)) {
 				fprintf(stderr, "mblaze: warning: - now means "
@@ -562,12 +574,15 @@ blaze822_loop(int argc, char *argv[], void (*cb)(char *))
 		}
 	}
 	free(map);
-	return j;
+
+	if (num)
+		*num = j;
+	return status;
 }
 
-long
-blaze822_loop1(char *arg, void (*cb)(char *))
+int
+blaze822_loop1(long *num, char *arg, void (*cb)(char *))
 {
 	char *args[] = { arg };
-	return blaze822_loop(1, args, cb);
+	return blaze822_loop(num, 1, args, cb);
 }
diff --git a/t/1100-mhdr.t b/t/1100-mhdr.t
index 9937041..85128bd 100755
--- a/t/1100-mhdr.t
+++ b/t/1100-mhdr.t
@@ -2,7 +2,7 @@
 cd ${0%/*}
 . ./lib.sh
 
-plan 9
+plan 10
 
 cat <<EOF >tmp
 Header: foo
@@ -24,3 +24,4 @@ check_same 'header-Three' 'mhdr -h header-Three ./tmp' 'echo quux'
 check_same 'header_Four' 'mhdr -h header_Four ./tmp' 'echo ding'
 
 check 'issue 235' 'mhdr ./tmp |grep -i header_four'
+check 'non-existent file' 'mhdr ./does-not-exist ; [ $? -eq 1 ]'
diff --git a/t/1500-maddr.t b/t/1500-maddr.t
index cfca3e7..bccc695 100755
--- a/t/1500-maddr.t
+++ b/t/1500-maddr.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 11
+plan 12
 
 rm -rf test.dir
 mkdir test.dir
@@ -82,5 +82,6 @@ check_same 'long addr' 'maddr -h long 4' 'echo "heeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
 check_same 'decode iso8859' 'maddr -h DecodeISO8859 5' 'echo "Keld Jørn Simonsen <keld@dkuug.dk>"'
 check_same 'decode long iso8859' 'maddr -h DecodeLongISO8859 5' 'echo "\"If you can read this you understand the example. z a b\" <foo@example.com>"'
 check_same 'decode utf8' 'maddr -h DecodeUTF8 5' 'echo "z’z <bar@example.com>"'
+check 'non-existent file' 'maddr -S /does/not/exist ; [ $? -eq 1 ]'
 
 )
diff --git a/t/1800-mexport.t b/t/1800-mexport.t
index c0eadbd..d7192c7 100755
--- a/t/1800-mexport.t
+++ b/t/1800-mexport.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 2
+plan 3
 
 cat <<EOF >tmp.1
 Subject: message 1
@@ -24,3 +24,4 @@ mexport ./tmp.1 ./tmp.2 ./tmp.3 >./tmp.mbox
 
 check 'generated mbox has 16 lines' 'cat ./tmp.mbox | wc -l | grep 16'
 check 'generated mbox has 7 empty lines' 'grep -c "^$" ./tmp.mbox | grep 7'
+check 'non-existent file' 'mexport ./foo-bar ; [ $? -eq 1 ]'
diff --git a/t/8000-mflag.t b/t/8000-mflag.t
index 65562f6..3ae51d3 100644
--- a/t/8000-mflag.t
+++ b/t/8000-mflag.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 16
+plan 17
 
 rm -rf test.dir
 mkdir test.dir
@@ -35,5 +35,6 @@ check 'mark trashed' 'mflag -T 1 && [ -e "inbox/cur/1:2,T" ]'
 check_test 'fix seq' -eq 2 'mseq -f : | mseq -S | wc -l'
 check 'unmark trashed' 'mflag -t 1 && [ -e "inbox/cur/1:2," ]'
 check_test 'fix seq' -eq 2 'mseq -f : | mseq -S | wc -l'
+check 'non-existent file' 'mflag -S /does/not/exist ; [ $? -eq 1 ]'
 
 )

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

* Re: Exit with a non-zero exit status if a given mail does not exist
  2024-10-08 19:12 [PR PATCH] Exit with a non-zero exit status if a given mail does not exist nmeum
@ 2024-10-08 19:13 ` nmeum
  2024-10-09 10:41 ` leahneukirchen
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: nmeum @ 2024-10-08 19:13 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 278 bytes --]

New comment by nmeum on mblaze repository

https://github.com/leahneukirchen/mblaze/pull/265#issuecomment-2400626542

Comment:
Hacked this together rather quickly, let me know if you think it is worthwhile to peruse this approach further or if you prefer an alternative design.

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

* Re: Exit with a non-zero exit status if a given mail does not exist
  2024-10-08 19:12 [PR PATCH] Exit with a non-zero exit status if a given mail does not exist nmeum
  2024-10-08 19:13 ` nmeum
@ 2024-10-09 10:41 ` leahneukirchen
  2024-10-13 11:03 ` [PR PATCH] [Updated] " nmeum
  2024-10-13 11:03 ` nmeum
  3 siblings, 0 replies; 5+ messages in thread
From: leahneukirchen @ 2024-10-09 10:41 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 311 bytes --]

New comment by leahneukirchen on mblaze repository

https://github.com/leahneukirchen/mblaze/pull/265#issuecomment-2401961592

Comment:
I think it should keep going, anyway (compare cp(1) e.g.)

As only mscan and mpick use the count for informative messages, perhaps we could count in the callback instead...

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

* Re: [PR PATCH] [Updated] Exit with a non-zero exit status if a given mail does not exist
  2024-10-08 19:12 [PR PATCH] Exit with a non-zero exit status if a given mail does not exist nmeum
  2024-10-08 19:13 ` nmeum
  2024-10-09 10:41 ` leahneukirchen
@ 2024-10-13 11:03 ` nmeum
  2024-10-13 11:03 ` nmeum
  3 siblings, 0 replies; 5+ messages in thread
From: nmeum @ 2024-10-13 11:03 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1210 bytes --]

There is an updated pull request by nmeum against master on the mblaze repository

https://github.com/nmeum/mblaze mblaze-error-handling
https://github.com/leahneukirchen/mblaze/pull/265

Exit with a non-zero exit status if a given mail does not exist
Sadly, the diff is quite large as we will have to change the API of `blaze822_loop` to differentiate the number of processed messages and a status code indicating a missing mail. Note that currently execution is not aborted upon encountering the first non-existent mail; hence, we can't do both via the return value.

Surprisingly, very few utilities actually use the number of processed messages as returned by `blaze822_loop`. Therefore, we could reduce the diff quite a bit by differentiating the two use cases through separate functions (e.g. `blaze822_loop` and `blaze822_loop_num`), which would allow the API of blaze822_loop to remain largely unchanged.

The new `blaze822_loop` API would also allow us to improve error handling for `blaze822_seq_next` but I haven't done this so far…

There are also some tests, but these should be expanded.

Fixes #264

A patch file from https://github.com/leahneukirchen/mblaze/pull/265.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-mblaze-error-handling-265.patch --]
[-- Type: text/x-diff, Size: 20527 bytes --]

From 531152d1f7295768922140aa4ad620dbd664ccb9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net>
Date: Sun, 13 Oct 2024 17:30:10 +0200
Subject: [PATCH 1/3] mpick/mscan: count seen mails in the callback function

---
 mpick.c | 10 ++++++----
 mscan.c |  9 +++++----
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/mpick.c b/mpick.c
index 661e472..8864094 100644
--- a/mpick.c
+++ b/mpick.c
@@ -190,6 +190,7 @@ static int need_thr;
 
 static long kept;
 static long num;
+static long seen;
 
 static struct expr *expr;
 static long cur_idx;
@@ -1363,6 +1364,7 @@ collect(char *file)
 	struct mlist *ml;
 	char *f;
 
+	seen++;
 	f = xstrdup(file);
 	m = xcalloc(1, sizeof *m);
 	m = mailfile(m, f);
@@ -1409,6 +1411,7 @@ void
 oneline(char *file)
 {
 	struct mailinfo m = { 0 };
+	seen++;
 	m.index = num++;
 	(void) mailfile(&m, file);
 	if (expr && !eval(expr, &m))
@@ -1429,7 +1432,6 @@ oneline(char *file)
 int
 main(int argc, char *argv[])
 {
-	long i;
 	int c;
 	int vflag;
 
@@ -1466,9 +1468,9 @@ main(int argc, char *argv[])
 
 	void (*cb)(char *) = need_thr ? collect : oneline;
 	if (argc == optind && isatty(0))
-		i = blaze822_loop1(":", cb);
+		blaze822_loop1(":", cb);
 	else
-		i = blaze822_loop(argc-optind, argv+optind, cb);
+		blaze822_loop(argc-optind, argv+optind, cb);
 
 	/* print and free last thread */
 	if (Tflag && thr)
@@ -1477,7 +1479,7 @@ main(int argc, char *argv[])
 	freeexpr(expr);
 
 	if (vflag)
-		fprintf(stderr, "%ld mails tested, %ld picked.\n", i, kept);
+		fprintf(stderr, "%ld mails tested, %ld picked.\n", seen, kept);
 
 	for (; files; files = fileq) {
 		fileq = files->next;
diff --git a/mscan.c b/mscan.c
index bb6cd9e..3f5bc71 100644
--- a/mscan.c
+++ b/mscan.c
@@ -30,6 +30,7 @@
 static int cols;
 static wchar_t replacement = L'?';
 static char *cur;
+static long seen;
 
 static char *aliases[32];
 static int alias_idx;
@@ -306,6 +307,7 @@ print_human(intmax_t i, int w)
 void
 oneline(char *file)
 {
+	seen++;
 	if (!init) {
 		// delay loading of the seq until we need to scan the first
 		// file, in case someone in the pipe updated the map before
@@ -622,17 +624,16 @@ main(int argc, char *argv[])
 				fflag = v;
 	}
 
-	long i;
 	if (argc == optind && isatty(0))
-		i = blaze822_loop1(":", oneline);
+		blaze822_loop1(":", oneline);
 	else
-		i = blaze822_loop(argc-optind, argv+optind, oneline);
+		blaze822_loop(argc-optind, argv+optind, oneline);
 
 	if (pager_pid > 0)
 		pipeclose(pager_pid);
 
 	if (vflag)
-		fprintf(stderr, "%ld mails scanned\n", i);
+		fprintf(stderr, "%ld mails scanned\n", seen);
 
 	return 0;
 }

From dc5636c7ff4a78f5d5c9359b623227ed8352b7f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net>
Date: Sun, 13 Oct 2024 14:31:31 +0200
Subject: [PATCH 2/3] blaze822: Use return value of loop functions for error
 handling

Callers which need the number of messages processed need to count
in the callback function now, see the previous commit.
---
 blaze822.h |  4 ++--
 seq.c      | 32 ++++++++++++++++++--------------
 2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/blaze822.h b/blaze822.h
index 1346345..aba23e2 100644
--- a/blaze822.h
+++ b/blaze822.h
@@ -85,8 +85,8 @@ struct blaze822_seq_iter {
 };
 
 char *blaze822_seq_next(char *map, char *range, struct blaze822_seq_iter *iter);
-long blaze822_loop(int, char **, void (*)(char *));
-long blaze822_loop1(char *arg, void (*cb)(char *));
+int blaze822_loop(int, char **, void (*)(char *));
+int blaze822_loop1(char *arg, void (*cb)(char *));
 char *blaze822_home_file(char *basename);
 
 // filter.c
diff --git a/seq.c b/seq.c
index 5d98284..073a58c 100644
--- a/seq.c
+++ b/seq.c
@@ -493,11 +493,13 @@ iterdir(char *dir, void (*cb)(char *))
 		m = "";
 		n = scandir(dir, &namelist, 0, mailsort);
 	}
-		
-	if (n == -1) {	
-		if (errno == ENOTDIR)
+
+	if (n == -1) {
+		if (errno == ENOTDIR) {
 			cb(dir);
-		return 1;
+			return 1;
+		}
+		return 0;
 	}
 
 	long i = 0;
@@ -515,31 +517,34 @@ iterdir(char *dir, void (*cb)(char *))
 	return i;
 }
 
-long
+int
 blaze822_loop(int argc, char *argv[], void (*cb)(char *))
 {
 	char *line = 0;
 	size_t linelen = 0;
 	ssize_t rd;
-	long i = 0;
 
 	if (argc == 0) {
 		while ((rd = getdelim(&line, &linelen, '\n', stdin)) != -1) {
 			if (line[rd-1] == '\n')
 				line[rd-1] = 0;
 			cb(line);
-			i++;
 		}
 		free(line);
-		return i;
+
+		return 0;
 	}
 
 	char *map = 0;
+	int status = 0;
 	int map_opened = 0;
-	int j = 0;
+	long i;
 	for (i = 0; i < argc; i++) {
 		if (strchr(argv[i], '/')) {  // a file name
-			j += iterdir(argv[i], cb);
+			if (!iterdir(argv[i], cb)) {
+				fprintf(stderr, "mblaze: warning: file '%s' does not exist\n", argv[i]);
+				status = 1;
+			}
 		} else if (strcmp(argv[i], "-") == 0) {
 			if (isatty(0)) {
 				fprintf(stderr, "mblaze: warning: - now means "
@@ -547,7 +552,6 @@ blaze822_loop(int argc, char *argv[], void (*cb)(char *))
 				    "use .- to refer to previous mail\n");
 			}
 			cb("/dev/stdin");
-			j++;
 		} else {
 			if (!map_opened) {
 				map = blaze822_seq_open(0);
@@ -557,15 +561,15 @@ blaze822_loop(int argc, char *argv[], void (*cb)(char *))
 			while ((line = blaze822_seq_next(map, argv[i], &iter))) {
 				cb(line);
 				free(line);
-				j++;
 			}
 		}
 	}
 	free(map);
-	return j;
+
+	return status;
 }
 
-long
+int
 blaze822_loop1(char *arg, void (*cb)(char *))
 {
 	char *args[] = { arg };

From 89e7d05e1467b8a4b2597dd7304a69495bad092a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net>
Date: Sun, 13 Oct 2024 19:21:33 +0200
Subject: [PATCH 3/3] Add error handling for blaze822_loop to all callers

---
 maddr.c          |  6 ++----
 magrep.c         |  7 +++++--
 mdeliver.c       |  4 +---
 mexport.c        |  4 ++--
 mflag.c          | 20 +++++++++-----------
 mhdr.c           |  7 +++++--
 minc.c           |  3 ++-
 mlist.c          |  5 +++--
 mpick.c          |  7 ++++---
 mscan.c          | 12 ++++++------
 msed.c           |  6 ++----
 mseq.c           | 10 ++++------
 mshow.c          | 21 +++++++++++----------
 msort.c          |  7 ++++---
 mthread.c        | 12 ++++++++----
 t/1100-mhdr.t    |  4 +++-
 t/1500-maddr.t   |  4 +++-
 t/1700-mshow.t   |  3 ++-
 t/1800-mexport.t |  3 ++-
 t/3000-magrep.t  |  5 ++++-
 t/6000-msort.t   |  4 +++-
 t/8000-mflag.t   |  4 +++-
 22 files changed, 88 insertions(+), 70 deletions(-)

diff --git a/maddr.c b/maddr.c
index 4982a8c..fe9751e 100644
--- a/maddr.c
+++ b/maddr.c
@@ -114,9 +114,7 @@ main(int argc, char *argv[])
 	xpledge("stdio rpath", "");
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", addr);
+		return blaze822_loop1(":", addr);
 	else
-		blaze822_loop(argc-optind, argv+optind, addr);
-
-	return 0;
+		return blaze822_loop(argc-optind, argv+optind, addr);
 }
diff --git a/magrep.c b/magrep.c
index 608048a..2f0b845 100644
--- a/magrep.c
+++ b/magrep.c
@@ -231,10 +231,13 @@ main(int argc, char *argv[])
 		exit(2);
 	}
 
+	int ret;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", magrep);
+		ret = blaze822_loop1(":", magrep);
 	else
-		blaze822_loop(argc-optind, argv+optind, magrep);
+		ret = blaze822_loop(argc-optind, argv+optind, magrep);
+	if (ret)
+		return 2;
 
 	if (cflag && !qflag && !mflag)
 		printf("%ld\n", matches);
diff --git a/mdeliver.c b/mdeliver.c
index 73fac4a..d2cc222 100644
--- a/mdeliver.c
+++ b/mdeliver.c
@@ -331,9 +331,7 @@ main(int argc, char *argv[])
 		if (argc == optind + 1 && isatty(0))
 			goto usage;
 		else
-			blaze822_loop(argc - 1 - optind, argv + optind, refile);
-
-		return 0;
+			return blaze822_loop(argc - 1 - optind, argv + optind, refile);
 	}
 
 	int c;
diff --git a/mexport.c b/mexport.c
index 0ac490d..4ad06a3 100644
--- a/mexport.c
+++ b/mexport.c
@@ -148,9 +148,9 @@ main(int argc, char *argv[])
 	xpledge("stdio rpath", "");
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", export);
+		status |= blaze822_loop1(":", export);
 	else
-		blaze822_loop(argc-optind, argv+optind, export);
+		status |= blaze822_loop(argc-optind, argv+optind, export);
 
 	return status;
 }
diff --git a/mflag.c b/mflag.c
index ae9a9f2..a05e27f 100644
--- a/mflag.c
+++ b/mflag.c
@@ -141,31 +141,29 @@ main(int argc, char *argv[])
 
 	if (vflag) {
 		if (argc == optind && !isatty(0)) {
-			blaze822_loop(0, 0, flag);  // read from stdin
-			return 0;
+			return blaze822_loop(0, 0, flag);  // read from stdin
 		}
 
 		args = calloc(argsalloc, sizeof (char *));
 		if (!args)
 			exit(-1);
 
+		int status;
 		if (argc == optind)
-			blaze822_loop1(".", add);
+			status = blaze822_loop1(".", add);
 		else
-			blaze822_loop(argc-optind, argv+optind, add);
+			status = blaze822_loop(argc-optind, argv+optind, add);
 
 		if (isatty(0))
-			blaze822_loop1(":", flag);
+			status |= blaze822_loop1(":", flag);
 		else
-			blaze822_loop(0, 0, flag);
+			status |= blaze822_loop(0, 0, flag);
 
-		return 0;
+		return status;
 	}
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(".", flag);
+		return blaze822_loop1(".", flag);
 	else
-		blaze822_loop(argc-optind, argv+optind, flag);
-
-	return 0;
+		return blaze822_loop(argc-optind, argv+optind, flag);
 }
diff --git a/mhdr.c b/mhdr.c
index b6e9fa0..2677aa1 100644
--- a/mhdr.c
+++ b/mhdr.c
@@ -249,10 +249,13 @@ main(int argc, char *argv[])
 
 	xpledge("stdio rpath", "");
 
+	int ret;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(".", header);
+		ret = blaze822_loop1(".", header);
 	else
-		blaze822_loop(argc-optind, argv+optind, header);
+		ret = blaze822_loop(argc-optind, argv+optind, header);
+	if (ret)
+		return 2;
 
 	return status;
 }
diff --git a/minc.c b/minc.c
index 757c65b..3ae444e 100644
--- a/minc.c
+++ b/minc.c
@@ -81,7 +81,8 @@ main(int argc, char *argv[])
 	if (optind == argc) {
 		if (isatty(0))
 			goto usage;
-		blaze822_loop(0, 0, inc);
+		if (blaze822_loop(0, 0, inc))
+			return 1;
 	} else {
 		for (i = optind; i < argc; i++)
 			inc(argv[i]);
diff --git a/mlist.c b/mlist.c
index e0ec42c..00a14ec 100644
--- a/mlist.c
+++ b/mlist.c
@@ -282,10 +282,11 @@ main(int argc, char *argv[])
 			flagsum++;
 	}
 
+	int status = 0;
 	if (optind == argc) {
 		if (isatty(0))
 			goto usage;
-		blaze822_loop(0, 0, listarg);
+		status = blaze822_loop(0, 0, listarg);
 	} else {
 		for (i = optind; i < argc; i++)
 			listarg(argv[i]);
@@ -300,5 +301,5 @@ main(int argc, char *argv[])
 			    tunseen, tflagged, tcount);
 	}
 
-	return 0;
+	return status;
 }
diff --git a/mpick.c b/mpick.c
index 8864094..fe21b5a 100644
--- a/mpick.c
+++ b/mpick.c
@@ -1466,11 +1466,12 @@ main(int argc, char *argv[])
 
 	xpledge("stdio rpath wpath cpath proc exec", 0);
 
+	int status;
 	void (*cb)(char *) = need_thr ? collect : oneline;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", cb);
+		status = blaze822_loop1(":", cb);
 	else
-		blaze822_loop(argc-optind, argv+optind, cb);
+		status = blaze822_loop(argc-optind, argv+optind, cb);
 
 	/* print and free last thread */
 	if (Tflag && thr)
@@ -1490,5 +1491,5 @@ main(int argc, char *argv[])
 		free(files);
 	}
 
-	return 0;
+	return status;
 }
diff --git a/mscan.c b/mscan.c
index 3f5bc71..5bf8238 100644
--- a/mscan.c
+++ b/mscan.c
@@ -561,10 +561,9 @@ main(int argc, char *argv[])
 
 	if (nflag) {
 		if (argc == optind && isatty(0))
-			blaze822_loop1(":", numline);
+			return blaze822_loop1(":", numline);
 		else
-			blaze822_loop(argc-optind, argv+optind, numline);
-		return 0;
+			return blaze822_loop(argc-optind, argv+optind, numline);
 	}
 
 	now = time(0);
@@ -624,10 +623,11 @@ main(int argc, char *argv[])
 				fflag = v;
 	}
 
+	int status;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", oneline);
+		status = blaze822_loop1(":", oneline);
 	else
-		blaze822_loop(argc-optind, argv+optind, oneline);
+		status = blaze822_loop(argc-optind, argv+optind, oneline);
 
 	if (pager_pid > 0)
 		pipeclose(pager_pid);
@@ -635,5 +635,5 @@ main(int argc, char *argv[])
 	if (vflag)
 		fprintf(stderr, "%ld mails scanned\n", seen);
 
-	return 0;
+	return status;
 }
diff --git a/msed.c b/msed.c
index c545278..30a1f60 100644
--- a/msed.c
+++ b/msed.c
@@ -330,9 +330,7 @@ main(int argc, char *argv[])
 	optind++;
 
 	if (argc == optind && isatty(0))
-		blaze822_loop1(".", sed);
+		return blaze822_loop1(".", sed);
 	else
-		blaze822_loop(argc-optind, argv+optind, sed);
-
-	return 0;
+		return blaze822_loop(argc-optind, argv+optind, sed);
 }
diff --git a/mseq.c b/mseq.c
index ac3aa19..8a21c2c 100644
--- a/mseq.c
+++ b/mseq.c
@@ -301,13 +301,11 @@ main(int argc, char *argv[])
 
 	xpledge("stdio rpath wpath cpath", "");
 
-	if (cflag)
-		blaze822_loop1(cflag, overridecur);
+	if (cflag && blaze822_loop1(cflag, overridecur))
+		return 1;
 
-	if (Cflag) {
-		blaze822_loop1(Cflag, setcur);
-		return 0;
-	}
+	if (Cflag)
+		return blaze822_loop1(Cflag, setcur);
 
 	if (Sflag && optind != argc) {
 		fprintf(stderr, "error: -S/-A doesn't take arguments.\n");
diff --git a/mshow.c b/mshow.c
index d0871f2..aeb7b40 100644
--- a/mshow.c
+++ b/mshow.c
@@ -587,13 +587,13 @@ extract_cb(char *file)
 	blaze822_walk_mime(msg, 0, extract_mime);
 }
 
-void
+int
 extract(char *file, int argc, char **argv, int use_stdout)
 {
 	extract_argc = argc;
 	extract_argv = argv;
 	extract_stdout = use_stdout;
-	blaze822_loop1(file, extract_cb);
+	return blaze822_loop1(file, extract_cb);
 }
 
 static char *newcur;
@@ -832,21 +832,22 @@ main(int argc, char *argv[])
 		}
 	}
 
+	int status = 0;
 	if (xflag) { // extract
 		xpledge("stdio rpath wpath cpath", NULL);
-		extract(xflag, argc-optind, argv+optind, 0);
+		status = extract(xflag, argc-optind, argv+optind, 0);
 	} else if (Oflag) { // extract to stdout
 		xpledge("stdio rpath", NULL);
-		extract(Oflag, argc-optind, argv+optind, 1);
+		status = extract(Oflag, argc-optind, argv+optind, 1);
 	} else if (tflag) { // list
 		xpledge("stdio rpath", NULL);
 		if (argc == optind && isatty(0))
-			blaze822_loop1(".", list);
+			status = blaze822_loop1(".", list);
 		else
-			blaze822_loop(argc-optind, argv+optind, list);
+			status = blaze822_loop(argc-optind, argv+optind, list);
 	} else if (Rflag) { // render for reply
 		xpledge("stdio rpath", NULL);
-		blaze822_loop(argc-optind, argv+optind, reply);
+		status = blaze822_loop(argc-optind, argv+optind, reply);
 	} else { // show
 		/* XXX pledge: still r/w on the whole file-system + fork/exec */
 		if (!(qflag || rflag || Fflag)) {
@@ -857,9 +858,9 @@ main(int argc, char *argv[])
 				filters = blaze822(f);
 		}
 		if (argc == optind && isatty(0))
-			blaze822_loop1(".", show);
+			status = blaze822_loop1(".", show);
 		else
-			blaze822_loop(argc-optind, argv+optind, show);
+			status = blaze822_loop(argc-optind, argv+optind, show);
 		if (!nflag) // don't set cur
 			if (newcur)
 				blaze822_seq_setcur(newcur);
@@ -875,5 +876,5 @@ main(int argc, char *argv[])
 		return 1;
 	}
 
-	return 0;
+	return status;
 }
diff --git a/msort.c b/msort.c
index 55ec6aa..240f250 100644
--- a/msort.c
+++ b/msort.c
@@ -323,10 +323,11 @@ main(int argc, char *argv[])
 	if (!mails)
 		exit(-1);
 
+	int status;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", add);
+		status = blaze822_loop1(":", add);
 	else
-		blaze822_loop(argc-optind, argv+optind, add);
+		status = blaze822_loop(argc-optind, argv+optind, add);
 
 	qsort(mails, idx, sizeof (struct mail), order);
 
@@ -337,5 +338,5 @@ main(int argc, char *argv[])
 		for (i = 0; i < idx; i++)
 			printf("%s\n", mails[i].file);
 
-	return 0;
+	return status;
 }
diff --git a/mthread.c b/mthread.c
index 77fb21e..87bf269 100644
--- a/mthread.c
+++ b/mthread.c
@@ -421,7 +421,10 @@ main(int argc, char *argv[])
 
 	while ((c = getopt(argc, argv, "S:prv")) != -1)
 		switch (c) {
-		case 'S': blaze822_loop1(optarg, thread); break;
+		case 'S':
+			if (blaze822_loop1(optarg, thread))
+				return 1;
+			break;
 		case 'v': vflag = 1; break;
 		case 'p': pflag = 1; break;
 		case 'r': rflag = 1; break;
@@ -432,10 +435,11 @@ main(int argc, char *argv[])
 
 	optional = 0;
 
+	int status;
 	if (argc == optind && isatty(0))
-		blaze822_loop1(":", thread);
+		status = blaze822_loop1(":", thread);
 	else
-		blaze822_loop(argc-optind, argv+optind, thread);
+		status = blaze822_loop(argc-optind, argv+optind, thread);
 
 	// the tree of all toplevel threads has depth -1,
 	// so toplevel threads have depth 0.
@@ -446,5 +450,5 @@ main(int argc, char *argv[])
 	sort_tree(top, -1);
 	print_tree(top, -1);
 
-	return 0;
+	return status;
 }
diff --git a/t/1100-mhdr.t b/t/1100-mhdr.t
index 9937041..f924419 100755
--- a/t/1100-mhdr.t
+++ b/t/1100-mhdr.t
@@ -2,7 +2,7 @@
 cd ${0%/*}
 . ./lib.sh
 
-plan 9
+plan 10
 
 cat <<EOF >tmp
 Header: foo
@@ -24,3 +24,5 @@ check_same 'header-Three' 'mhdr -h header-Three ./tmp' 'echo quux'
 check_same 'header_Four' 'mhdr -h header_Four ./tmp' 'echo ding'
 
 check 'issue 235' 'mhdr ./tmp |grep -i header_four'
+check 'non-existent mail' 'mhdr ./does-not-exist ; [ $? -eq 2 ]'
+
diff --git a/t/1500-maddr.t b/t/1500-maddr.t
index cfca3e7..bd886a3 100755
--- a/t/1500-maddr.t
+++ b/t/1500-maddr.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 11
+plan 13
 
 rm -rf test.dir
 mkdir test.dir
@@ -82,5 +82,7 @@ check_same 'long addr' 'maddr -h long 4' 'echo "heeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
 check_same 'decode iso8859' 'maddr -h DecodeISO8859 5' 'echo "Keld Jørn Simonsen <keld@dkuug.dk>"'
 check_same 'decode long iso8859' 'maddr -h DecodeLongISO8859 5' 'echo "\"If you can read this you understand the example. z a b\" <foo@example.com>"'
 check_same 'decode utf8' 'maddr -h DecodeUTF8 5' 'echo "z’z <bar@example.com>"'
+check 'non-existent mail' 'maddr -S /does/not/exist ; [ $? -eq 1 ]'
+check_same 'keep going on non-existent mail' 'maddr /does/not/exist 3 /does/not/exist || true' 'echo "rajwinder@example.com"'
 
 )
diff --git a/t/1700-mshow.t b/t/1700-mshow.t
index f974026..31791fa 100755
--- a/t/1700-mshow.t
+++ b/t/1700-mshow.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 2
+plan 3
 
 # Nested MIME where the outer boundary is a prefix of the inner boundary
 cat <<EOF >tmp
@@ -39,3 +39,4 @@ EOF
 
 check 'nested mail has 5 attachments' 'mshow -t ./tmp | wc -l | grep 6'
 check 'nested mail has text/html attachment' 'mshow -t ./tmp | grep text/html'
+check 'non-existent mail' 'mshow ./does-not-exist ; [ $? -eq 1 ]'
diff --git a/t/1800-mexport.t b/t/1800-mexport.t
index c0eadbd..9ee945c 100755
--- a/t/1800-mexport.t
+++ b/t/1800-mexport.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 2
+plan 3
 
 cat <<EOF >tmp.1
 Subject: message 1
@@ -24,3 +24,4 @@ mexport ./tmp.1 ./tmp.2 ./tmp.3 >./tmp.mbox
 
 check 'generated mbox has 16 lines' 'cat ./tmp.mbox | wc -l | grep 16'
 check 'generated mbox has 7 empty lines' 'grep -c "^$" ./tmp.mbox | grep 7'
+check 'non-existent mail' 'mexport ./foo-bar ; [ $? -eq 1 ]'
diff --git a/t/3000-magrep.t b/t/3000-magrep.t
index f20cbb6..4cf4fbd 100644
--- a/t/3000-magrep.t
+++ b/t/3000-magrep.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 10
+plan 12
 
 rm -rf test.dir
 mkdir test.dir
@@ -191,4 +191,7 @@ check_same 'print match only' 'magrep -o subject:nice :' 'cat expect'
 echo 'inbox/cur/3:2,' >expect
 check_same 'multiple subjects' 'magrep subject:multi :' 'cat expect'
 
+check 'non-existent mail' 'magrep subject:nice /does/not/exist ; [ $? -eq 2 ]'
+check 'error take precedence over match' 'magrep subject:nomatch : /does/not/exist ; [ $? -eq 2 ]'
+
 )
diff --git a/t/6000-msort.t b/t/6000-msort.t
index e4fc609..cb9e15d 100644
--- a/t/6000-msort.t
+++ b/t/6000-msort.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 5
+plan 6
 
 rm -rf test.dir
 mkdir test.dir
@@ -85,4 +85,6 @@ inbox/cur/1:2,
 !
 check_same 'subject' 'msort -s :' 'cat expect'
 
+check 'non-existent mail' 'msort -s /does/not/exist ; [ $? -eq 1 ]'
+
 )
diff --git a/t/8000-mflag.t b/t/8000-mflag.t
index 65562f6..7918906 100644
--- a/t/8000-mflag.t
+++ b/t/8000-mflag.t
@@ -1,7 +1,7 @@
 #!/bin/sh -e
 cd ${0%/*}
 . ./lib.sh
-plan 16
+plan 18
 
 rm -rf test.dir
 mkdir test.dir
@@ -35,5 +35,7 @@ check 'mark trashed' 'mflag -T 1 && [ -e "inbox/cur/1:2,T" ]'
 check_test 'fix seq' -eq 2 'mseq -f : | mseq -S | wc -l'
 check 'unmark trashed' 'mflag -t 1 && [ -e "inbox/cur/1:2," ]'
 check_test 'fix seq' -eq 2 'mseq -f : | mseq -S | wc -l'
+check 'non-existent mail' 'mflag -S /does/not/exist ; [ $? -eq 1 ]'
+check 'keep going on non-existent mail' 'mflag -t /does/not/exist 1 ; [ -e "inbox/cur/1:2," ]'
 
 )

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

* Re: Exit with a non-zero exit status if a given mail does not exist
  2024-10-08 19:12 [PR PATCH] Exit with a non-zero exit status if a given mail does not exist nmeum
                   ` (2 preceding siblings ...)
  2024-10-13 11:03 ` [PR PATCH] [Updated] " nmeum
@ 2024-10-13 11:03 ` nmeum
  3 siblings, 0 replies; 5+ messages in thread
From: nmeum @ 2024-10-13 11:03 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 306 bytes --]

New comment by nmeum on mblaze repository

https://github.com/leahneukirchen/mblaze/pull/265#issuecomment-2408932302

Comment:
 > As only mscan and mpick use the count for informative messages, perhaps we could count in the callback instead...

Good idea, updated accordingly. Let me know what you think

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

end of thread, other threads:[~2024-10-13 11:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-08 19:12 [PR PATCH] Exit with a non-zero exit status if a given mail does not exist nmeum
2024-10-08 19:13 ` nmeum
2024-10-09 10:41 ` leahneukirchen
2024-10-13 11:03 ` [PR PATCH] [Updated] " nmeum
2024-10-13 11:03 ` nmeum

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).