Github messages for mblaze
 help / color / mirror / Atom feed
From: nmeum <nmeum@users.noreply.github.com>
To: ml@inbox.vuxu.org
Subject: [PR PATCH] Exit with a non-zero exit status if a given mail does not exist
Date: Tue, 08 Oct 2024 21:12:46 +0200	[thread overview]
Message-ID: <gh-mailinglist-notifications-fa6558a0-26e0-48f6-803f-f5a8af34f6a8-mblaze-265@inbox.vuxu.org> (raw)

[-- 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 ]'
 
 )

             reply	other threads:[~2024-10-08 19:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-08 19:12 nmeum [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=gh-mailinglist-notifications-fa6558a0-26e0-48f6-803f-f5a8af34f6a8-mblaze-265@inbox.vuxu.org \
    --to=nmeum@users.noreply.github.com \
    --cc=ml@inbox.vuxu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).