All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matthew Rogers via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Matthew Rogers <mattr94@gmail.com>
Subject: [PATCH v7 00/10] config: allow user to know scope of config options
Date: Mon, 10 Feb 2020 00:30:49 +0000	[thread overview]
Message-ID: <pull.478.v7.git.1581294660.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.478.v6.git.1580268865.gitgitgadget@gmail.com>

This was originally a pull request to the git-for-windows repository
[https://github.com/git-for-windows/git/pull/2399]. It adds a new option
--show-scope which would allow a user to see what scope a given
configuration value has (sytem, local, global, etc.).

changes since v6: Split patch 6: config: add '--show-scope'... into several
parts, including moving the exposure of config_scope_name into its own
commit earlier in the series.

Matthew Rogers (10):
  config: fix typo in variable name
  t1300: fix over-indented HERE-DOCs
  t1300: create custom config file without special characters
  config: make scope_name non-static and rename it
  config: split repo scope to local and worktree
  config: clarify meaning of command line scoping
  config: preserve scope in do_git_config_sequence
  config: teach git_config_source to remember its scope
  submodule-config: add subomdule config scope
  config: add '--show-scope' to print the scope of a config value

 Documentation/git-config.txt |  15 ++-
 builtin/config.c             |  46 +++++--
 config.c                     |  35 ++++-
 config.h                     |  20 +--
 remote.c                     |   3 +-
 submodule-config.c           |   4 +-
 t/helper/test-config.c       |  17 +--
 t/t1300-config.sh            | 240 ++++++++++++++++++++++-------------
 t/t1308-config-set.sh        |   4 +-
 upload-pack.c                |   3 +-
 10 files changed, 248 insertions(+), 139 deletions(-)


base-commit: de93cc14ab7e8db7645d8dbe4fd2603f76d5851f
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-478%2FROGERSM94%2Fadd-config-flags-v7
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-478/ROGERSM94/add-config-flags-v7
Pull-Request: https://github.com/gitgitgadget/git/pull/478

Range-diff vs v6:

  1:  18f92f70cf =  1:  1c4faa7a36 config: fix typo in variable name
  2:  dc7b3f3b96 =  2:  2c38c72f89 t1300: fix over-indented HERE-DOCs
  3:  975e652368 =  3:  c832293ca7 t1300: create custom config file without special characters
  -:  ---------- >  4:  14b0f27819 config: make scope_name non-static and rename it
  4:  1e406ba430 !  5:  1af0237b8e config: split repo scope to local and worktree
     @@ -45,6 +45,19 @@
       	if (!opts->ignore_worktree && repository_format_worktree_config) {
       		char *path = git_pathdup("config.worktree");
       		if (!access_or_die(path, R_OK, 0))
     +@@
     + 		return "system";
     + 	case CONFIG_SCOPE_GLOBAL:
     + 		return "global";
     +-	case CONFIG_SCOPE_REPO:
     +-		return "repo";
     ++	case CONFIG_SCOPE_LOCAL:
     ++		return "local";
     ++	case CONFIG_SCOPE_WORKTREE:
     ++		return "worktree";
     + 	case CONFIG_SCOPE_CMDLINE:
     + 		return "command line";
     + 	default:
      
       diff --git a/config.h b/config.h
       --- a/config.h
     @@ -58,7 +71,7 @@
      +	CONFIG_SCOPE_WORKTREE,
       	CONFIG_SCOPE_CMDLINE,
       };
     - 
     + const char *config_scope_name(enum config_scope scope);
      
       diff --git a/remote.c b/remote.c
       --- a/remote.c
     @@ -74,23 +87,6 @@
       	if (!strcmp(subkey, "mirror"))
       		remote->mirror = git_config_bool(key, value);
      
     - diff --git a/t/helper/test-config.c b/t/helper/test-config.c
     - --- a/t/helper/test-config.c
     - +++ b/t/helper/test-config.c
     -@@
     - 		return "system";
     - 	case CONFIG_SCOPE_GLOBAL:
     - 		return "global";
     --	case CONFIG_SCOPE_REPO:
     --		return "repo";
     -+	case CONFIG_SCOPE_LOCAL:
     -+		return "local";
     -+	case CONFIG_SCOPE_WORKTREE:
     -+		return "worktree";
     - 	case CONFIG_SCOPE_CMDLINE:
     - 		return "cmdline";
     - 	default:
     -
       diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
       --- a/t/t1308-config-set.sh
       +++ b/t/t1308-config-set.sh
  5:  936ce91c62 !  6:  64c20d0556 config: clarify meaning of command line scoping
     @@ -26,6 +26,17 @@
       	if (!opts->ignore_cmdline && git_config_from_parameters(fn, data) < 0)
       		die(_("unable to parse command-line config"));
       
     +@@
     + 		return "local";
     + 	case CONFIG_SCOPE_WORKTREE:
     + 		return "worktree";
     +-	case CONFIG_SCOPE_CMDLINE:
     +-		return "command line";
     ++	case CONFIG_SCOPE_COMMAND:
     ++		return "command";
     + 	default:
     + 		return "unknown";
     + 	}
      
       diff --git a/config.h b/config.h
       --- a/config.h
     @@ -37,23 +48,8 @@
      -	CONFIG_SCOPE_CMDLINE,
      +	CONFIG_SCOPE_COMMAND,
       };
     + const char *config_scope_name(enum config_scope scope);
       
     - enum config_scope current_config_scope(void);
     -
     - diff --git a/t/helper/test-config.c b/t/helper/test-config.c
     - --- a/t/helper/test-config.c
     - +++ b/t/helper/test-config.c
     -@@
     - 		return "local";
     - 	case CONFIG_SCOPE_WORKTREE:
     - 		return "worktree";
     --	case CONFIG_SCOPE_CMDLINE:
     --		return "cmdline";
     -+	case CONFIG_SCOPE_COMMAND:
     -+		return "command";
     - 	default:
     - 		return "unknown";
     - 	}
      
       diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
       --- a/t/t1308-config-set.sh
     @@ -62,7 +58,7 @@
       	value=from-cmdline
       	origin=command line
       	name=
     --	scope=cmdline
     +-	scope=command line
      +	scope=command
       	EOF
       	GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config iterate >actual &&
  -:  ---------- >  7:  f61985375c config: preserve scope in do_git_config_sequence
  -:  ---------- >  8:  6c59c5cace config: teach git_config_source to remember its scope
  -:  ---------- >  9:  dd376246ec submodule-config: add subomdule config scope
  6:  fc141e8689 ! 10:  f76463ee90 config: add '--show-scope' to print the scope of a config value
     @@ -12,7 +12,6 @@
          parsing the '.gitmodules' file.
      
          Signed-off-by: Matthew Rogers <mattr94@gmail.com>
     -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
      
       diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
       --- a/Documentation/git-config.txt
     @@ -108,212 +107,6 @@
       	if (show_origin)
       		show_config_origin(buf);
       	if (show_keys)
     -@@
     - 			!strcmp(given_config_source.file, "-")) {
     - 		given_config_source.file = NULL;
     - 		given_config_source.use_stdin = 1;
     -+		given_config_source.scope = CONFIG_SCOPE_COMMAND;
     - 	}
     - 
     - 	if (use_global_config) {
     -@@
     - 			 */
     - 			die(_("$HOME not set"));
     - 
     -+		given_config_source.scope = CONFIG_SCOPE_GLOBAL;
     -+
     - 		if (access_or_warn(user_config, R_OK, 0) &&
     - 		    xdg_config && !access_or_warn(xdg_config, R_OK, 0)) {
     - 			given_config_source.file = xdg_config;
     -@@
     - 			free(xdg_config);
     - 		}
     - 	}
     --	else if (use_system_config)
     -+	else if (use_system_config) {
     - 		given_config_source.file = git_etc_gitconfig();
     --	else if (use_local_config)
     -+		given_config_source.scope = CONFIG_SCOPE_SYSTEM;
     -+	} else if (use_local_config) {
     - 		given_config_source.file = git_pathdup("config");
     --	else if (use_worktree_config) {
     -+		given_config_source.scope = CONFIG_SCOPE_LOCAL;
     -+	} else if (use_worktree_config) {
     - 		struct worktree **worktrees = get_worktrees(0);
     - 		if (repository_format_worktree_config)
     - 			given_config_source.file = git_pathdup("config.worktree");
     -@@
     - 			      "section in \"git help worktree\" for details"));
     - 		else
     - 			given_config_source.file = git_pathdup("config");
     -+		given_config_source.scope = CONFIG_SCOPE_LOCAL;
     - 		free_worktrees(worktrees);
     - 	} else if (given_config_source.file) {
     - 		if (!is_absolute_path(given_config_source.file) && prefix)
     - 			given_config_source.file =
     - 				prefix_filename(prefix, given_config_source.file);
     -+		given_config_source.scope = CONFIG_SCOPE_COMMAND;
     -+	} else if (given_config_source.blob) {
     -+		given_config_source.scope = CONFIG_SCOPE_COMMAND;
     - 	}
     - 
     -+
     - 	if (respect_includes_opt == -1)
     - 		config_options.respect_includes = !given_config_source.file;
     - 	else
     -
     - diff --git a/config.c b/config.c
     - --- a/config.c
     - +++ b/config.c
     -@@
     - 	char *xdg_config = xdg_config_home("config");
     - 	char *user_config = expand_user_path("~/.gitconfig", 0);
     - 	char *repo_config;
     -+	enum config_scope prev_parsing_scope = current_parsing_scope;
     - 
     - 	if (opts->commondir)
     - 		repo_config = mkpathdup("%s/config", opts->commondir);
     -@@
     - 	if (!opts->ignore_cmdline && git_config_from_parameters(fn, data) < 0)
     - 		die(_("unable to parse command-line config"));
     - 
     --	current_parsing_scope = CONFIG_SCOPE_UNKNOWN;
     -+	current_parsing_scope = prev_parsing_scope;
     - 	free(xdg_config);
     - 	free(user_config);
     - 	free(repo_config);
     -@@
     - 		data = &inc;
     - 	}
     - 
     -+	if (config_source)
     -+		current_parsing_scope = config_source->scope;
     -+
     - 	/*
     - 	 * If we have a specific filename, use it. Otherwise, follow the
     - 	 * regular lookup sequence.
     -@@
     - 	}
     - }
     - 
     -+const char *config_scope_name(enum config_scope scope)
     -+{
     -+	switch (scope) {
     -+	case CONFIG_SCOPE_SYSTEM:
     -+		return "system";
     -+	case CONFIG_SCOPE_GLOBAL:
     -+		return "global";
     -+	case CONFIG_SCOPE_LOCAL:
     -+		return "local";
     -+	case CONFIG_SCOPE_WORKTREE:
     -+		return "worktree";
     -+	case CONFIG_SCOPE_COMMAND:
     -+		return "command";
     -+	case CONFIG_SCOPE_SUBMODULE:
     -+		return "submodule";
     -+	default:
     -+		return "unknown";
     -+	}
     -+}
     -+
     - const char *current_config_name(void)
     - {
     - 	const char *name;
     -
     - diff --git a/config.h b/config.h
     - --- a/config.h
     - +++ b/config.h
     -@@
     - 
     - #define CONFIG_REGEX_NONE ((void *)1)
     - 
     -+enum config_scope {
     -+	CONFIG_SCOPE_UNKNOWN = 0,
     -+	CONFIG_SCOPE_SYSTEM,
     -+	CONFIG_SCOPE_GLOBAL,
     -+	CONFIG_SCOPE_LOCAL,
     -+	CONFIG_SCOPE_WORKTREE,
     -+	CONFIG_SCOPE_COMMAND,
     -+	CONFIG_SCOPE_SUBMODULE,
     -+};
     -+const char *config_scope_name(enum config_scope scope);
     -+
     - struct git_config_source {
     - 	unsigned int use_stdin:1;
     - 	const char *file;
     - 	const char *blob;
     -+	enum config_scope scope;
     - };
     - 
     - enum config_origin_type {
     -@@
     - 
     - int git_config_parse_parameter(const char *, config_fn_t fn, void *data);
     - 
     --enum config_scope {
     --	CONFIG_SCOPE_UNKNOWN = 0,
     --	CONFIG_SCOPE_SYSTEM,
     --	CONFIG_SCOPE_GLOBAL,
     --	CONFIG_SCOPE_LOCAL,
     --	CONFIG_SCOPE_WORKTREE,
     --	CONFIG_SCOPE_COMMAND,
     --};
     --
     - enum config_scope current_config_scope(void);
     - const char *current_config_origin_type(void);
     - const char *current_config_name(void);
     -
     - diff --git a/submodule-config.c b/submodule-config.c
     - --- a/submodule-config.c
     - +++ b/submodule-config.c
     -@@
     - static void config_from_gitmodules(config_fn_t fn, struct repository *repo, void *data)
     - {
     - 	if (repo->worktree) {
     --		struct git_config_source config_source = { 0 };
     -+		struct git_config_source config_source = {
     -+			0, .scope = CONFIG_SCOPE_SUBMODULE
     -+		};
     - 		const struct config_options opts = { 0 };
     - 		struct object_id oid;
     - 		char *file;
     -
     - diff --git a/t/helper/test-config.c b/t/helper/test-config.c
     - --- a/t/helper/test-config.c
     - +++ b/t/helper/test-config.c
     -@@
     -  *
     -  */
     - 
     --static const char *scope_name(enum config_scope scope)
     --{
     --	switch (scope) {
     --	case CONFIG_SCOPE_SYSTEM:
     --		return "system";
     --	case CONFIG_SCOPE_GLOBAL:
     --		return "global";
     --	case CONFIG_SCOPE_LOCAL:
     --		return "local";
     --	case CONFIG_SCOPE_WORKTREE:
     --		return "worktree";
     --	case CONFIG_SCOPE_COMMAND:
     --		return "command";
     --	default:
     --		return "unknown";
     --	}
     --}
     - static int iterate_cb(const char *var, const char *value, void *data)
     - {
     - 	static int nr;
     -@@
     - 	printf("value=%s\n", value ? value : "(null)");
     - 	printf("origin=%s\n", current_config_origin_type());
     - 	printf("name=%s\n", current_config_name());
     --	printf("scope=%s\n", scope_name(current_config_scope()));
     -+	printf("scope=%s\n", config_scope_name(current_config_scope()));
     - 
     - 	return 0;
     - }
      
       diff --git a/t/t1300-config.sh b/t/t1300-config.sh
       --- a/t/t1300-config.sh

-- 
gitgitgadget

  parent reply	other threads:[~2020-02-10  0:31 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-18  1:11 [PATCH 0/1] config: allow user to know scope of config options Matthew Rogers via GitGitGadget
2019-12-18  1:11 ` [PATCH 1/1] " Matthew Rogers via GitGitGadget
2019-12-18 19:46   ` Junio C Hamano
2019-12-19  5:05     ` Jeff King
2019-12-19 17:51       ` Junio C Hamano
2019-12-18 22:45   ` Philip Oakley
2019-12-19  0:12     ` mattr94
2019-12-19 17:56       ` Junio C Hamano
2019-12-20 22:58         ` Matt Rogers
2019-12-21  2:37           ` Junio C Hamano
2019-12-21  3:08             ` Matt Rogers
2019-12-21 23:47               ` Junio C Hamano
2020-01-09 10:16 ` [PATCH v2 0/4] " Matthew Rogers via GitGitGadget
2020-01-09 10:16   ` [PATCH v2 1/4] config: fix typo in variable name Matthew Rogers via GitGitGadget
2020-01-09 19:07     ` Junio C Hamano
2020-01-09 23:22       ` Matt Rogers
2020-01-10 11:55     ` Jeff King
2020-01-09 10:16   ` [PATCH v2 2/4] config: fix config scope enum Matthew Rogers via GitGitGadget
2020-01-09 19:06     ` Junio C Hamano
2020-01-09 23:29       ` Matt Rogers
2020-01-09 10:16   ` [PATCH v2 3/4] config: clarify meaning of command line scoping Matthew Rogers via GitGitGadget
2020-01-09 19:13     ` Junio C Hamano
2020-01-09 23:41       ` Matt Rogers
2020-01-09 10:16   ` [PATCH v2 4/4] config: add '--show-scope' to print the scope of a config value Matthew Rogers via GitGitGadget
2020-01-09 19:50     ` Junio C Hamano
2020-01-09 23:47       ` Matt Rogers
2020-01-17 15:31   ` [PATCH v3 0/4] config: allow user to know scope of config options Matthew Rogers via GitGitGadget
2020-01-17 15:31     ` [PATCH v3 1/4] config: fix typo in variable name Matthew Rogers via GitGitGadget
2020-01-17 15:31     ` [PATCH v3 2/4] config: refine config scope enum Matthew Rogers via GitGitGadget
2020-01-17 20:44       ` Junio C Hamano
2020-01-18 15:27         ` Matt Rogers
2020-01-18 18:09           ` Junio C Hamano
2020-01-17 15:31     ` [PATCH v3 3/4] config: clarify meaning of command line scoping Matthew Rogers via GitGitGadget
2020-01-17 21:00       ` Junio C Hamano
2020-01-18 15:33         ` Matt Rogers
2020-01-17 15:31     ` [PATCH v3 4/4] config: add '--show-scope' to print the scope of a config value Matthew Rogers via GitGitGadget
2020-01-17 21:21       ` Junio C Hamano
2020-01-17 21:26         ` Bert Wesarg
2020-01-18 15:42         ` Matt Rogers
2020-01-24  0:21     ` [PATCH v4 0/6] config: allow user to know scope of config options Matthew Rogers via GitGitGadget
2020-01-24  0:21       ` [PATCH v4 1/6] config: fix typo in variable name Matthew Rogers via GitGitGadget
2020-01-24  0:21       ` [PATCH v4 2/6] t1300: fix over-indented HERE-DOCs Matthew Rogers via GitGitGadget
2020-01-24 18:43         ` Junio C Hamano
2020-01-24  0:21       ` [PATCH v4 3/6] t1300: create custom config file without special characters Matthew Rogers via GitGitGadget
2020-01-24 18:45         ` Junio C Hamano
2020-01-24  0:21       ` [PATCH v4 4/6] config: split repo scope to local and worktree Matthew Rogers via GitGitGadget
2020-01-24 18:49         ` Junio C Hamano
2020-01-24 19:09         ` Junio C Hamano
2020-01-24  0:21       ` [PATCH v4 5/6] config: clarify meaning of command line scoping Matthew Rogers via GitGitGadget
2020-01-24  0:21       ` [PATCH v4 6/6] config: add '--show-scope' to print the scope of a config value Matthew Rogers via GitGitGadget
2020-01-24 19:18         ` Junio C Hamano
2020-01-24 20:22         ` Junio C Hamano
2020-01-24 20:49           ` Matt Rogers
2020-01-25  0:10             ` Junio C Hamano
2020-01-24 19:22       ` [PATCH v4 0/6] config: allow user to know scope of config options Junio C Hamano
2020-01-25  0:39       ` [PATCH v5 " Matthew Rogers via GitGitGadget
2020-01-25  0:39         ` [PATCH v5 1/6] config: fix typo in variable name Matthew Rogers via GitGitGadget
2020-01-25  0:39         ` [PATCH v5 2/6] t1300: fix over-indented HERE-DOCs Matthew Rogers via GitGitGadget
2020-01-25  0:39         ` [PATCH v5 3/6] t1300: create custom config file without special characters Matthew Rogers via GitGitGadget
2020-01-25  0:39         ` [PATCH v5 4/6] config: split repo scope to local and worktree Matthew Rogers via GitGitGadget
2020-01-27 23:09           ` Junio C Hamano
2020-01-25  0:39         ` [PATCH v5 5/6] config: clarify meaning of command line scoping Matthew Rogers via GitGitGadget
2020-01-25  0:39         ` [PATCH v5 6/6] config: add '--show-scope' to print the scope of a config value Matthew Rogers via GitGitGadget
2020-01-27 23:12           ` Junio C Hamano
2020-01-28  1:31             ` Matt Rogers
2020-01-29  3:34         ` [PATCH v6 0/6] config: allow user to know scope of config options Matthew Rogers via GitGitGadget
2020-01-29  3:34           ` [PATCH v6 1/6] config: fix typo in variable name Matthew Rogers via GitGitGadget
2020-01-29  3:34           ` [PATCH v6 2/6] t1300: fix over-indented HERE-DOCs Matthew Rogers via GitGitGadget
2020-01-29  3:34           ` [PATCH v6 3/6] t1300: create custom config file without special characters Matthew Rogers via GitGitGadget
2020-01-29  3:34           ` [PATCH v6 4/6] config: split repo scope to local and worktree Matthew Rogers via GitGitGadget
2020-01-29  3:34           ` [PATCH v6 5/6] config: clarify meaning of command line scoping Matthew Rogers via GitGitGadget
2020-01-29  3:34           ` [PATCH v6 6/6] config: add '--show-scope' to print the scope of a config value Matthew Rogers via GitGitGadget
2020-01-29  9:08             ` Bert Wesarg
2020-01-29 23:03               ` Matt Rogers
2020-02-05 19:01                 ` Junio C Hamano
2020-01-29  5:29           ` [PATCH v6 0/6] config: allow user to know scope of config options Junio C Hamano
2020-02-10  0:30           ` Matthew Rogers via GitGitGadget [this message]
2020-02-10  0:30             ` [PATCH v7 01/10] config: fix typo in variable name Matthew Rogers via GitGitGadget
2020-02-10  0:30             ` [PATCH v7 02/10] t1300: fix over-indented HERE-DOCs Matthew Rogers via GitGitGadget
2020-02-10  0:30             ` [PATCH v7 03/10] t1300: create custom config file without special characters Matthew Rogers via GitGitGadget
2020-02-10  0:30             ` [PATCH v7 04/10] config: make scope_name non-static and rename it Matthew Rogers via GitGitGadget
2020-02-10 18:02               ` Junio C Hamano
2020-02-10 21:25                 ` Junio C Hamano
2020-02-11  0:30                 ` Matt Rogers
2020-02-11  1:58                   ` Emily Shaffer
2020-02-11  6:10                   ` Junio C Hamano
2020-02-11 12:37                     ` Matt Rogers
2020-02-10  0:30             ` [PATCH v7 05/10] config: split repo scope to local and worktree Matthew Rogers via GitGitGadget
2020-02-10 18:07               ` Junio C Hamano
2020-02-10  0:30             ` [PATCH v7 06/10] config: clarify meaning of command line scoping Matthew Rogers via GitGitGadget
2020-02-10 18:10               ` Junio C Hamano
2020-02-10  0:30             ` [PATCH v7 07/10] config: preserve scope in do_git_config_sequence Matthew Rogers via GitGitGadget
2020-02-10 18:11               ` Junio C Hamano
2020-02-10  0:30             ` [PATCH v7 08/10] config: teach git_config_source to remember its scope Matthew Rogers via GitGitGadget
2020-02-10 18:14               ` Junio C Hamano
2020-02-10  0:30             ` [PATCH v7 09/10] submodule-config: add subomdule config scope Matthew Rogers via GitGitGadget
2020-02-10 18:15               ` Junio C Hamano
2020-02-10  0:30             ` [PATCH v7 10/10] config: add '--show-scope' to print the scope of a config value Matthew Rogers via GitGitGadget

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=pull.478.v7.git.1581294660.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=mattr94@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.