public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gentoo-functions:master commit in: /
Date: Mon,  8 Jul 2024 02:31:17 +0000 (UTC)	[thread overview]
Message-ID: <1720395507.8ac82c7c7923954765b994de841f82ec2d5456b7.sam@gentoo> (raw)

commit:     8ac82c7c7923954765b994de841f82ec2d5456b7
Author:     Kerin Millar <kfm <AT> plushkava <DOT> net>
AuthorDate: Sun Jul  7 23:16:44 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun Jul  7 23:38:27 2024 +0000
URL:        https://gitweb.gentoo.org/proj/gentoo-functions.git/commit/?id=8ac82c7c

Correct the implementation of contains_all()

It was not translating IFS to FS correctly. Have it do so and extend the
test suite accordingly.

Signed-off-by: Kerin Millar <kfm <AT> plushkava.net>

 functions.sh   |  36 +++++++++++++----
 test-functions | 126 ++++++++++++++++++++++++++++++++++++++++++---------------
 2 files changed, 122 insertions(+), 40 deletions(-)

diff --git a/functions.sh b/functions.sh
index cfaddc3..ccd0d1d 100644
--- a/functions.sh
+++ b/functions.sh
@@ -61,21 +61,41 @@ chdir()
 #
 contains_all()
 {
-	[ "$#" -ge 2 ] && IFS=${IFS} awk -f - -- "$@" <<-'EOF'
+	# shellcheck disable=2097,2098
+	[ "$#" -ge 2 ] &&
+	IFS=${IFS} awk -v ifs_set=${IFS+1} -f - -- "$@" <<-'EOF'
 	BEGIN {
-		ifs = ENVIRON["IFS"]
 		haystack = ARGV[1]
 		argc = ARGC
 		ARGC = 1
+		if (ifs_set) {
+			ifs = ENVIRON["IFS"]
+		} else {
+			ifs = " \t\n"
+		}
+		# Translate IFS to FS, in accordance with section 2.6.5.
 		if (length(ifs) == 0) {
 			FS = "^"
-		} else if (length(ifs) != 3 || ifs ~ /[^ \t\n]/) {
-			# Split by the first character of IFS.
-			FS = "[" substr(ifs, 1, 1) "]"
 		} else {
-			# Mimic default field splitting behaviour, per section 2.6.5.
-			FS = "[ \t\n]+"
-			sub("^" FS, "", haystack)
+			whitespace = ""
+			FS = "("
+			for (i = 1; i <= length(ifs); i++) {
+				char = substr(ifs, i, 1)
+				if (seen[char]++) {
+					continue
+				} else if (char ~ /[ \t\n]/) {
+					whitespace = whitespace char
+					FS = FS "[" char "]+|"
+				} else {
+					FS = FS "[" char "]|"
+				}
+			}
+			sub(/\|$/, "", FS)
+			FS = FS ")"
+		}
+		# Leading whitespace characters must be removed.
+		if (length(whitespace) > 0) {
+			sub("^[" whitespace "]+", "", haystack)
 		}
 		# In sh, fields are terminated, not separated.
 		sub(FS "$", "", haystack)

diff --git a/test-functions b/test-functions
index 59c0b29..dab0aea 100755
--- a/test-functions
+++ b/test-functions
@@ -721,43 +721,105 @@ test_substr() {
 
 test_contains_all() {
 	set -- \
-		ge  1  N/A         N/A         N/A         N/A  \
-		ge  1  'foo  bar'  ''          N/A         N/A  \
-		ge  1  'foo  bar'  ''          ' '         N/A  \
-		ge  1  'foo  bar'  ''          ' bar'      N/A  \
-		ge  1  'foo  bar'  ''          ' bar'      N/A  \
-		ge  1  'foo  bar'  ''          'foo '      N/A  \
-		ge  1  'foo  bar'  ''          'foo  bar'  N/A  \
-		ge  1  'foo  bar'  ' '         ''          N/A  \
-		ge  1  'foo  bar'  ' '         ' '         N/A  \
-		ge  1  'foo  bar'  ' '         N/A         N/A  \
-		ge  1  'foo  bar'  ' bar'      ''          N/A  \
-		ge  1  'foo  bar'  ' bar'      N/A         N/A  \
-		ge  1  'foo  bar'  'foo '      ''          N/A  \
-		ge  1  'foo  bar'  'foo '      ' bar'      N/A  \
-		ge  1  'foo  bar'  'foo '      N/A         N/A  \
-		ge  1  'foo  bar'  'foo  bar'  ''          N/A  \
-		ge  1  'foo  bar'  'foo  bar'  N/A         N/A  \
-		ge  1  'foo  bar'  N/A         N/A         N/A  \
-		ge  1  'foo  bar'  bar         foo         ''   \
-		ge  1  'foo  bar'  bar         foo         ' '  \
-		ge  1  'foo  bar'  baz         bar         foo  \
-		ge  1  'foo  bar'  fo          ba          N/A  \
-		ge  1  'foo  bar'  foo         bar         ''   \
-		ge  1  'foo  bar'  foo         bar         ' '  \
-		ge  1  'foo  bar'  foo         bar         baz  \
-		ge  1  'foo  bar'  o           a           N/A  \
-		ge  1  'foo  bar'  oo          ar          N/A  \
-		eq  0  'foo  bar'  foo         bar         N/A  \
-		eq  0  'foo  bar'  bar         foo         N/A
+		ge  1  default  N/A           N/A         N/A         N/A  \
+		ge  1  default  ' foo  bar '  ''          N/A         N/A  \
+		ge  1  default  ' foo  bar '  ''          ' '         N/A  \
+		ge  1  default  ' foo  bar '  ''          ' bar'      N/A  \
+		ge  1  default  ' foo  bar '  ''          'foo '      N/A  \
+		ge  1  default  ' foo  bar '  ''          'foo  bar'  N/A  \
+		ge  1  default  ' foo  bar '  ' '         ''          N/A  \
+		ge  1  default  ' foo  bar '  ' '         ' '         N/A  \
+		ge  1  default  ' foo  bar '  ' '         N/A         N/A  \
+		ge  1  default  ' foo  bar '  ' bar'      ''          N/A  \
+		ge  1  default  ' foo  bar '  ' bar'      N/A         N/A  \
+		ge  1  default  ' foo  bar '  'foo '      ''          N/A  \
+		ge  1  default  ' foo  bar '  'foo '      ' bar'      N/A  \
+		ge  1  default  ' foo  bar '  'foo '      N/A         N/A  \
+		ge  1  default  ' foo  bar '  'foo  bar'  ''          N/A  \
+		ge  1  default  ' foo  bar '  'foo  bar'  N/A         N/A  \
+		ge  1  default  ' foo  bar '  N/A         N/A         N/A  \
+		ge  1  default  ' foo  bar '  bar         foo         ''   \
+		ge  1  default  ' foo  bar '  bar         foo         ' '  \
+		ge  1  default  ' foo  bar '  baz         bar         foo  \
+		ge  1  default  ' foo  bar '  fo          ba          N/A  \
+		ge  1  default  ' foo  bar '  foo         bar         ''   \
+		ge  1  default  ' foo  bar '  foo         bar         ' '  \
+		ge  1  default  ' foo  bar '  foo         bar         baz  \
+		ge  1  default  ' foo  bar '  o           a           N/A  \
+		ge  1  default  ' foo  bar '  oo          ar          N/A  \
+		eq  0  default  ' foo  bar '  foo         bar         N/A  \
+		eq  0  default  ' foo  bar '  bar         foo         N/A  \
+		ge  1  ', '     N/A           N/A         N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  ''          N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  ''          ' '         N/A  \
+		ge  1  ', '     ' foo ,bar, ' ''          ','         N/A  \
+		ge  1  ', '     ' foo  bar '  ''          ' bar'      N/A  \
+		ge  1  ', '     ' foo ,bar '  ''          ',bar'      N/A  \
+		ge  1  ', '     ' foo  bar '  ''          'foo '      N/A  \
+		ge  1  ', '     ' foo, bar '  ''          'foo,'      N/A  \
+		ge  1  ', '     ' foo  bar '  ''          'foo  bar'  N/A  \
+		ge  1  ', '     ' foo  bar '  ' '         ''          N/A  \
+		ge  1  ', '     ' foo,bar, '  ','         ''          N/A  \
+		ge  1  ', '     ' foo  bar '  ' '         ' '         N/A  \
+		ge  1  ', '     ',foo,,bar,'  ','         ','         N/A  \
+		ge  1  ', '     ' foo  bar '  ' '         N/A         N/A  \
+		ge  1  ', '     ',foo,,bar,'  ','         N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  ' bar'      ''          N/A  \
+		ge  1  ', '     'foo,bar,'    ',bar'      ''          N/A  \
+		ge  1  ', '     ' foo  bar '  ' bar'      N/A         N/A  \
+		ge  1  ', '     ',foo,,bar,'  ',bar'      N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  'foo '      ''          N/A  \
+		ge  1  ', '     'foo,bar,'    'foo,'      ''          N/A  \
+		ge  1  ', '     ' foo  bar '  'foo '      ' bar'      N/A  \
+		ge  1  ', '     ',foo,,bar,'  'foo,'      ',bar'      N/A  \
+		ge  1  ', '     ' foo  bar '  'foo '      N/A         N/A  \
+		ge  1  ', '     ',foo,,bar,'  'foo,'      N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  'foo  bar'  ''          N/A  \
+		ge  1  ', '     'foo,bar,'    'foo,bar'   ''          N/A  \
+		ge  1  ', '     ' foo  bar '  'foo  bar'  N/A         N/A  \
+		ge  1  ', '     ',foo,,bar,'  'foo,,bar'  N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  N/A         N/A         N/A  \
+		ge  1  ', '     ' foo  bar '  bar         foo         ''   \
+		ge  1  ', '     ' foo,bar  '  bar         foo         ''   \
+		ge  1  ', '     ' foo  bar '  bar         foo         ' '  \
+		ge  1  ', '     ' foo,,bar '  bar         foo         ','  \
+		ge  1  ', '     ' foo  bar '  baz         bar         foo  \
+		ge  1  ', '     ',foo,,bar,'  baz         bar         foo  \
+		ge  1  ', '     ' foo  bar '  fo          ba          N/A  \
+		ge  1  ', '     ',foo,,bar,'  fo          ba          N/A  \
+		ge  1  ', '     ' foo  bar '  foo         bar         ''   \
+		ge  1  ', '     ' foo,bar '   foo         bar         ''   \
+		ge  1  ', '     ' foo  bar '  foo         bar         ' '  \
+		ge  1  ', '     ' foo,,bar '  foo         bar         ','  \
+		ge  1  ', '     ' foo  bar '  foo         bar         baz  \
+		ge  1  ', '     ',foo,,bar,'  foo         bar         baz  \
+		ge  1  ', '     ' foo  bar '  o           a           N/A  \
+		ge  1  ', '     ',foo,,bar,'  o           a           N/A  \
+		ge  1  ', '     ' foo  bar '  oo          ar          N/A  \
+		ge  1  ', '     ',foo,,bar,'  oo          ar          N/A  \
+		eq  0  ', '     ' foo  bar '  foo         bar         N/A  \
+		eq  0  ', '     ',foo  bar,'  foo         bar         N/A  \
+		eq  0  ', '     ' foo,,bar '  foo         bar         N/A  \
+		eq  0  ', '     ',foo,,bar,'  foo         bar         N/A  \
+		eq  0  ', '     ' foo  bar '  bar         foo         N/A  \
+		eq  0  ', '     ',foo  bar,'  bar         foo         N/A  \
+		eq  0  ', '     ' foo,,bar '  bar         foo         N/A  \
+		eq  0  ', '     ',foo,,bar,'  bar         foo         N/A
 
 	callback() {
 		shift
-		test_description="contains_all $(quote_args "$@")"
-		contains_all "$@"
+		ifs=$1
+		shift
+		if [ "${ifs}" = "default" ]; then
+			test_description="contains_all $(quote_args "$@")"
+			contains_all "$@"
+		else
+			test_description="IFS='${ifs}' contains_all $(quote_args "$@")"
+			IFS=${ifs} contains_all "$@"
+		fi
 	}
 
-	iterate_tests 6 "$@"
+	iterate_tests 7 "$@"
 }
 
 test_contains_any() {


             reply	other threads:[~2024-07-08  2:31 UTC|newest]

Thread overview: 281+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-08  2:31 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-10-05  7:25 [gentoo-commits] proj/gentoo-functions:master commit in: / Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-10-05  4:15 Sam James
2024-08-11 10:23 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-11 10:11 Sam James
2024-08-05 20:39 Sam James
2024-08-05 20:39 Sam James
2024-08-05  2:03 Sam James
2024-08-05  2:02 Sam James
2024-08-05  2:02 Sam James
2024-08-05  2:02 Sam James
2024-08-05  2:02 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-08-02 23:14 Sam James
2024-07-08  3:00 Sam James
2024-07-08  2:31 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-07-07  5:55 Sam James
2024-06-25  4:06 Sam James
2024-06-25  4:06 Sam James
2024-06-25  4:06 Sam James
2024-06-25  4:06 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-06-21 13:14 Sam James
2024-05-24  6:05 Sam James
2024-05-24  1:18 Sam James
2024-05-24  1:18 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-22  1:12 Sam James
2024-05-19 15:27 Sam James
2024-05-19 15:27 Sam James
2024-05-19 15:27 Sam James
2024-05-19 15:27 Sam James
2024-05-18 16:07 Sam James
2024-05-18 16:06 Sam James
2024-05-18 16:06 Sam James
2024-05-18 15:34 Sam James
2024-05-18 15:32 Sam James
2024-05-18 15:32 Sam James
2024-05-18 14:04 Sam James
2024-05-18 14:04 Sam James
2024-05-18 14:04 Sam James
2024-05-18 14:04 Sam James
2024-05-18 14:04 Sam James
2024-05-18 14:04 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-17  4:03 Sam James
2024-05-15 10:28 Sam James
2024-05-15 10:28 Sam James
2024-05-14  0:18 Sam James
2024-05-14  0:15 Sam James
2024-05-14  0:12 Sam James
2024-05-14  0:12 Sam James
2024-05-14  0:08 Sam James
2024-05-14  0:08 Sam James
2024-05-14  0:05 Sam James
2024-05-14  0:05 Sam James
2024-05-14  0:05 Sam James
2024-05-14  0:05 Sam James
2024-05-14  0:05 Sam James
2024-02-16 21:35 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-11 16:47 Sam James
2023-06-10  7:23 Sam James
2023-06-10  7:23 Sam James
2023-06-10  6:04 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-10  4:22 Sam James
2023-06-09 11:17 Sam James
2023-06-09 11:11 Sam James
2023-06-09 11:02 Sam James
2023-06-09 11:02 Sam James
2023-06-09 11:02 Sam James
2023-06-09 11:02 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-06-07 11:13 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-19 16:14 Sam James
2023-02-17  7:44 Sam James
2023-02-17  7:44 Sam James
2023-02-17  7:44 Sam James
2023-02-17  1:33 Sam James
2023-02-17  1:33 Sam James
2023-02-17  1:33 Sam James
2023-02-15  8:18 Sam James
2023-02-15  7:48 Sam James
2023-02-15  7:46 Sam James
2023-02-15  7:46 Sam James
2023-02-15  7:46 Sam James
2023-02-15  7:46 Sam James
2023-02-15  7:46 Sam James
2023-02-15  7:46 Sam James
2023-02-15  2:24 Sam James
2023-02-15  2:24 Sam James
2023-02-15  2:24 Sam James
2023-02-14  3:40 Sam James
2023-02-14  3:40 Sam James
2023-02-14  3:40 Sam James
2023-02-14  3:40 Sam James
2023-02-14  0:09 Sam James
2023-02-14  0:09 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-13 21:37 Sam James
2023-02-12 18:53 Sam James
2023-02-12 18:53 Sam James
2023-02-12  6:53 Sam James
2023-02-12  6:53 Sam James
2023-02-12  6:53 Sam James
2023-02-11  1:43 Sam James
2023-02-11  1:43 Sam James
2023-02-10  6:09 Sam James
2023-02-10  6:09 Sam James
2023-02-10  6:09 Sam James
2023-02-09  3:54 Sam James
2023-02-09  3:54 Sam James
2023-02-08  3:37 Sam James
2023-02-08  1:06 Sam James
2023-02-08  0:03 Sam James
2023-02-08  0:03 Sam James
2023-02-07 23:47 Sam James
2023-02-07 23:42 Sam James
2023-02-07 23:42 Sam James
2023-02-07 23:42 Sam James
2023-02-07 23:42 Sam James
2023-02-07  1:08 Sam James
2023-02-07  1:08 Sam James
2023-02-06 13:47 Sam James
2023-02-06  4:32 Sam James
2023-02-06  4:23 Sam James
2023-02-06  4:19 Sam James
2023-02-06  4:10 Sam James
2023-02-06  4:10 Sam James
2023-02-06  3:59 Sam James
2023-02-06  3:59 Sam James
2023-02-06  3:59 Sam James
2022-07-30  5:48 Sam James
2022-07-29  2:03 Sam James
2022-07-29  2:03 Sam James
2022-07-29  2:03 Sam James
2021-08-30 21:14 Mike Gilbert
2021-08-30 21:14 Mike Gilbert
2020-11-19 18:20 Mike Gilbert
2020-11-19 18:20 Mike Gilbert
2020-11-19 18:20 Mike Gilbert
2020-01-26 23:19 Mike Gilbert

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=1720395507.8ac82c7c7923954765b994de841f82ec2d5456b7.sam@gentoo \
    --to=sam@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.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