From: Toon Claes <toon@iotcl•com>
To: Patrick Steinhardt <ps@pks•im>, git@vger•kernel.org
Cc: Derrick Stolee <stolee@gmail•com>,
Junio C Hamano <gitster@pobox•com>,
Justin Tobler <jltobler@gmail•com>
Subject: Re: [PATCH v4 01/17] object-store: rename `raw_object_store` to `object_database`
Date: Wed, 04 Jun 2025 10:55:40 +0200 [thread overview]
Message-ID: <87a56n3myb.fsf@iotcl.com> (raw)
In-Reply-To: <20250602-pks-object-store-wo-the-repository-v4-1-e986804a7c62@pks.im>
Patrick Steinhardt <ps@pks•im> writes:
> The `raw_object_store` structure is the central entry point for reading
> and writing objects in a repository. The main purpose of this structure
> is to manage object directories and provide an interface to access and
> write objects in those object directories.
>
> Right now, many of the functions associated with the raw object store
> implicitly rely on `the_repository` to get access to its `objects`
> pointer, which is the `raw_object_store`. As we want to generally get
> rid of using `the_repository` across our codebase we will have to
> convert this implicit dependency on this global variable into an
> explicit parameter.
>
> This conversion can be done by simply passing in an explicit pointer to
> a repository and then using its `->objects` pointer. But there is a
> second effort underway, which is to make the object subsystem more
> selfcontained so that we can eventually have pluggable object backends.
> As such, passing in a repository wouldn't make a ton of sense, and the
> goal is to convert the object store interfaces such that we always pass
> in a reference to the `raw_object_store` instead.
>
> This will expose the `raw_object_store` type to a lot more callers
> though, which surfaces that this type is named somewhat awkwardly. The
> "raw_" prefix makes readers wonder whether there is a non-raw variant of
> the object store, but there isn't. Furthermore, we nowadays want to name
> functions in a way that they can be clearly attributed to a specific
> subsystem, but calling them e.g. `raw_object_store_has_object()` is just
> too unwieldy, even when dropping the "raw_" prefix.
>
> Instead, rename the structure to `object_database`. This term is already
> used a lot throughout our codebase, and it cannot easily be mistaken for
> "object directories", either. Furthermore, its acronym ODB is already
> well-known and works well as part of a function's name, like for example
> `odb_has_object()`.
>
> Signed-off-by: Patrick Steinhardt <ps@pks•im>
> ---
> commit-graph.c | 2 +-
> commit-graph.h | 4 ++--
> object-store.c | 12 ++++++------
> object-store.h | 11 ++++++++---
> packfile.c | 2 +-
> packfile.h | 4 ++--
> repository.c | 4 ++--
> repository.h | 4 ++--
> 8 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/commit-graph.c b/commit-graph.c
> index ad3943b6906..905fcbdf0e8 100644
> --- a/commit-graph.c
> +++ b/commit-graph.c
> @@ -829,7 +829,7 @@ struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r)
> return NULL;
> }
>
> -void close_commit_graph(struct raw_object_store *o)
> +void close_commit_graph(struct object_database *o)
> {
> if (!o->commit_graph)
> return;
> diff --git a/commit-graph.h b/commit-graph.h
> index 13f662827d4..20d38c100ce 100644
> --- a/commit-graph.h
> +++ b/commit-graph.h
> @@ -26,7 +26,7 @@ void git_test_write_commit_graph_or_die(void);
> struct commit;
> struct bloom_filter_settings;
> struct repository;
> -struct raw_object_store;
> +struct object_database;
> struct string_list;
>
> char *get_commit_graph_filename(struct object_directory *odb);
> @@ -186,7 +186,7 @@ int write_commit_graph(struct object_directory *odb,
>
> int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags);
>
> -void close_commit_graph(struct raw_object_store *);
> +void close_commit_graph(struct object_database *);
> void free_commit_graph(struct commit_graph *);
>
> /*
> diff --git a/object-store.c b/object-store.c
> index 58cde0313a5..f4e8f99d90f 100644
> --- a/object-store.c
> +++ b/object-store.c
> @@ -44,7 +44,7 @@ struct cached_object_entry {
> } value;
> };
>
> -static const struct cached_object *find_cached_object(struct raw_object_store *object_store,
> +static const struct cached_object *find_cached_object(struct object_database *object_store,
> const struct object_id *oid)
> {
> static const struct cached_object empty_tree = {
> @@ -86,7 +86,7 @@ int odb_mkstemp(struct strbuf *temp_filename, const char *pattern)
> /*
> * Return non-zero iff the path is usable as an alternate object database.
> */
> -static int alt_odb_usable(struct raw_object_store *o,
> +static int alt_odb_usable(struct object_database *o,
> struct strbuf *path,
> const char *normalized_objdir, khiter_t *pos)
> {
> @@ -950,9 +950,9 @@ void assert_oid_type(const struct object_id *oid, enum object_type expect)
> type_name(expect));
> }
>
> -struct raw_object_store *raw_object_store_new(void)
> +struct object_database *odb_new(void)
> {
> - struct raw_object_store *o = xmalloc(sizeof(*o));
> + struct object_database *o = xmalloc(sizeof(*o));
>
> memset(o, 0, sizeof(*o));
> INIT_LIST_HEAD(&o->packed_git_mru);
> @@ -961,7 +961,7 @@ struct raw_object_store *raw_object_store_new(void)
> return o;
> }
>
> -static void free_object_directories(struct raw_object_store *o)
> +static void free_object_directories(struct object_database *o)
> {
> while (o->odb) {
> struct object_directory *next;
> @@ -974,7 +974,7 @@ static void free_object_directories(struct raw_object_store *o)
> o->odb_by_path = NULL;
> }
>
> -void raw_object_store_clear(struct raw_object_store *o)
> +void odb_clear(struct object_database *o)
> {
> FREE_AND_NULL(o->alternate_db);
>
> diff --git a/object-store.h b/object-store.h
> index c5890085352..a3be27d1171 100644
> --- a/object-store.h
> +++ b/object-store.h
> @@ -87,7 +87,12 @@ struct packed_git;
> struct multi_pack_index;
> struct cached_object_entry;
>
> -struct raw_object_store {
> +/*
> + * The object database encapsulates access to objects in a repository. It
> + * manages one or more backends that store the actual objects which are
> + * configured via alternates.
This still uses /old/ terminology. I think the "backend" should be
called "source", and we can keep the "alternates"?
--
Cheers,
Toon
next prev parent reply other threads:[~2025-06-04 8:55 UTC|newest]
Thread overview: 166+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-06 11:09 [PATCH 00/17] object-store: carve out the object database subsystem Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 01/17] object-store: rename `raw_object_store` to `object_database` Patrick Steinhardt
2025-05-07 0:47 ` Derrick Stolee
2025-05-07 15:27 ` Junio C Hamano
2025-05-06 11:09 ` [PATCH 02/17] object-store: rename `object_directory` to `odb_backend` Patrick Steinhardt
2025-05-07 0:51 ` Derrick Stolee
2025-05-07 1:00 ` Derrick Stolee
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 03/17] object-store: rename files to "odb.{c,h}" Patrick Steinhardt
2025-05-06 18:06 ` Derrick Stolee
2025-05-06 11:09 ` [PATCH 04/17] odb: introduce parent pointers Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 05/17] odb: get rid of `the_repository` in `find_odb()` Patrick Steinhardt
2025-05-07 1:10 ` Derrick Stolee
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 06/17] odb: get rid of `the_repository` in `assert_oid_type()` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 07/17] " Patrick Steinhardt
2025-05-07 1:12 ` Derrick Stolee
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 08/17] odb: get rid of `the_repository` when handling alternates Patrick Steinhardt
2025-05-07 1:14 ` Derrick Stolee
2025-05-06 11:09 ` [PATCH 09/17] odb: get rid of `the_repository` in `for_each()` functions Patrick Steinhardt
2025-05-07 1:21 ` Derrick Stolee
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-12 18:28 ` Derrick Stolee
2025-05-06 11:09 ` [PATCH 10/17] odb: get rid of `the_repository` when handling the primary backend Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 11/17] odb: get rid of `the_repository` when handling submodule backends Patrick Steinhardt
2025-05-07 1:25 ` Derrick Stolee
2025-05-07 1:29 ` Derrick Stolee
2025-05-06 11:09 ` [PATCH 12/17] odb: trivial refactorings to get rid of `the_repository` Patrick Steinhardt
2025-05-07 1:25 ` Derrick Stolee
2025-05-07 16:38 ` Junio C Hamano
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 13/17] odb: rename `oid_object_info()` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 14/17] odb: rename `repo_read_object_file()` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 15/17] odb: rename `has_object()` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 16/17] odb: rename `pretend_object_file()` Patrick Steinhardt
2025-05-06 11:09 ` [PATCH 17/17] odb: rename `read_object_with_reference()` Patrick Steinhardt
2025-05-07 1:40 ` [PATCH 00/17] object-store: carve out the object database subsystem Derrick Stolee
2025-05-07 17:02 ` Junio C Hamano
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-09 11:25 ` Patrick Steinhardt
2025-05-13 19:28 ` Toon Claes
2025-05-14 4:31 ` Patrick Steinhardt
2025-05-07 23:22 ` Junio C Hamano
2025-05-09 14:12 ` [PATCH v2 " Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 01/17] object-store: rename `raw_object_store` to `object_database` Patrick Steinhardt
2025-05-13 19:27 ` Toon Claes
2025-05-09 14:12 ` [PATCH v2 02/17] object-store: rename `object_directory` to `odb_alternate` Patrick Steinhardt
2025-05-13 19:28 ` Toon Claes
2025-05-14 4:31 ` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 03/17] object-store: rename files to "odb.{c,h}" Patrick Steinhardt
2025-05-13 19:28 ` Toon Claes
2025-05-14 4:31 ` Patrick Steinhardt
2025-05-14 12:58 ` Junio C Hamano
2025-05-09 14:12 ` [PATCH v2 04/17] odb: introduce parent pointers Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 05/17] odb: get rid of `the_repository` in `find_odb()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 06/17] odb: get rid of `the_repository` in `assert_oid_type()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 07/17] odb: get rid of `the_repository` in `odb_mkstemp()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 08/17] odb: get rid of `the_repository` when handling alternates Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 09/17] odb: get rid of `the_repository` in `for_each()` functions Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 10/17] odb: get rid of `the_repository` when handling the primary alternate Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 11/17] odb: get rid of `the_repository` when handling submodule alternates Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 12/17] odb: trivial refactorings to get rid of `the_repository` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 13/17] odb: rename `oid_object_info()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 14/17] odb: rename `repo_read_object_file()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 15/17] odb: rename `has_object()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 16/17] odb: rename `pretend_object_file()` Patrick Steinhardt
2025-05-09 14:12 ` [PATCH v2 17/17] odb: rename `read_object_with_reference()` Patrick Steinhardt
2025-05-09 21:43 ` [PATCH v2 00/17] object-store: carve out the object database subsystem Junio C Hamano
2025-05-12 18:33 ` Derrick Stolee
2025-05-14 5:12 ` [PATCH v3 " Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 01/17] object-store: rename `raw_object_store` to `object_database` Patrick Steinhardt
2025-05-22 21:59 ` Justin Tobler
2025-05-14 5:12 ` [PATCH v3 02/17] object-store: rename `object_directory` to `odb_alternate` Patrick Steinhardt
2025-05-22 22:13 ` Justin Tobler
2025-05-26 5:45 ` Patrick Steinhardt
2025-05-27 16:45 ` Justin Tobler
2025-05-28 13:18 ` Toon Claes
2025-05-30 9:39 ` Patrick Steinhardt
2025-05-30 9:39 ` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 03/17] object-store: rename files to "odb.{c,h}" Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 04/17] odb: introduce parent pointers Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 05/17] odb: get rid of `the_repository` in `find_odb()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 06/17] odb: get rid of `the_repository` in `assert_oid_type()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 07/17] odb: get rid of `the_repository` in `odb_mkstemp()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 08/17] odb: get rid of `the_repository` when handling alternates Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 09/17] odb: get rid of `the_repository` in `for_each()` functions Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 10/17] odb: get rid of `the_repository` when handling the primary alternate Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 11/17] odb: get rid of `the_repository` when handling submodule alternates Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 12/17] odb: trivial refactorings to get rid of `the_repository` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 13/17] odb: rename `oid_object_info()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 14/17] odb: rename `repo_read_object_file()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 15/17] odb: rename `has_object()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 16/17] odb: rename `pretend_object_file()` Patrick Steinhardt
2025-05-14 5:12 ` [PATCH v3 17/17] odb: rename `read_object_with_reference()` Patrick Steinhardt
2025-05-14 14:48 ` [PATCH v3 00/17] object-store: carve out the object database subsystem Toon Claes
2025-05-15 8:22 ` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 " Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 01/17] object-store: rename `raw_object_store` to `object_database` Patrick Steinhardt
2025-06-04 8:55 ` Toon Claes [this message]
2025-06-04 11:52 ` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 02/17] object-store: rename `object_directory` to `odb_source` Patrick Steinhardt
2025-06-04 13:24 ` Toon Claes
2025-06-04 13:55 ` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 03/17] object-store: rename files to "odb.{c,h}" Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 04/17] odb: introduce parent pointers Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 05/17] odb: get rid of `the_repository` in `find_odb()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 06/17] odb: get rid of `the_repository` in `assert_oid_type()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 07/17] odb: get rid of `the_repository` in `odb_mkstemp()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 08/17] odb: get rid of `the_repository` when handling alternates Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 09/17] odb: get rid of `the_repository` in `for_each()` functions Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 10/17] odb: get rid of `the_repository` when handling the primary source Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 11/17] odb: get rid of `the_repository` when handling submodule sources Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 12/17] odb: trivial refactorings to get rid of `the_repository` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 13/17] odb: rename `oid_object_info()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 14/17] odb: rename `repo_read_object_file()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 15/17] odb: rename `has_object()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 16/17] odb: rename `pretend_object_file()` Patrick Steinhardt
2025-06-02 10:27 ` [PATCH v4 17/17] odb: rename `read_object_with_reference()` Patrick Steinhardt
2025-06-02 15:38 ` [PATCH v4 00/17] object-store: carve out the object database subsystem Junio C Hamano
2025-06-05 6:46 ` [PATCH v5 " Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 01/17] object-store: rename `raw_object_store` to `object_database` Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 02/17] object-store: rename `object_directory` to `odb_source` Patrick Steinhardt
2025-06-30 2:02 ` Justin Tobler
2025-07-01 12:17 ` Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 03/17] object-store: rename files to "odb.{c,h}" Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 04/17] odb: introduce parent pointers Patrick Steinhardt
2025-06-30 2:34 ` Justin Tobler
2025-07-01 12:17 ` Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 05/17] odb: get rid of `the_repository` in `find_odb()` Patrick Steinhardt
2025-06-30 2:36 ` Justin Tobler
2025-06-05 6:46 ` [PATCH v5 06/17] odb: get rid of `the_repository` in `assert_oid_type()` Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 07/17] odb: get rid of `the_repository` in `odb_mkstemp()` Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 08/17] odb: get rid of `the_repository` when handling alternates Patrick Steinhardt
2025-06-30 2:56 ` Justin Tobler
2025-07-01 12:18 ` Patrick Steinhardt
2025-06-05 6:46 ` [PATCH v5 09/17] odb: get rid of `the_repository` in `for_each()` functions Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 10/17] odb: get rid of `the_repository` when handling the primary source Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 11/17] odb: get rid of `the_repository` when handling submodule sources Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 12/17] odb: trivial refactorings to get rid of `the_repository` Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 13/17] odb: rename `oid_object_info()` Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 14/17] odb: rename `repo_read_object_file()` Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 15/17] odb: rename `has_object()` Patrick Steinhardt
2025-06-05 6:47 ` [PATCH v5 16/17] odb: rename `pretend_object_file()` Patrick Steinhardt
2025-06-30 3:14 ` Justin Tobler
2025-06-05 6:47 ` [PATCH v5 17/17] odb: rename `read_object_with_reference()` Patrick Steinhardt
2025-06-30 3:15 ` Justin Tobler
2025-07-01 12:22 ` [PATCH v6 00/17] object-store: carve out the object database subsystem Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 01/17] object-store: rename `raw_object_store` to `object_database` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 02/17] object-store: rename `object_directory` to `odb_source` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 03/17] object-store: rename files to "odb.{c,h}" Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 04/17] odb: introduce parent pointers Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 05/17] odb: get rid of `the_repository` in `find_odb()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 06/17] odb: get rid of `the_repository` in `assert_oid_type()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 07/17] odb: get rid of `the_repository` in `odb_mkstemp()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 08/17] odb: get rid of `the_repository` when handling alternates Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 09/17] odb: get rid of `the_repository` in `for_each()` functions Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 10/17] odb: get rid of `the_repository` when handling the primary source Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 11/17] odb: get rid of `the_repository` when handling submodule sources Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 12/17] odb: trivial refactorings to get rid of `the_repository` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 13/17] odb: rename `oid_object_info()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 14/17] odb: rename `repo_read_object_file()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 15/17] odb: rename `has_object()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 16/17] odb: rename `pretend_object_file()` Patrick Steinhardt
2025-07-01 12:22 ` [PATCH v6 17/17] odb: rename `read_object_with_reference()` Patrick Steinhardt
2025-07-01 14:26 ` [PATCH v6 00/17] object-store: carve out the object database subsystem Justin Tobler
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=87a56n3myb.fsf@iotcl.com \
--to=toon@iotcl$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=gitster@pobox$(echo .)com \
--cc=jltobler@gmail$(echo .)com \
--cc=ps@pks$(echo .)im \
--cc=stolee@gmail$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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