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/portage:master commit in: lib/portage/tests/emerge/
Date: Mon, 30 Oct 2023 03:14:29 +0000 (UTC)	[thread overview]
Message-ID: <1698635665.10e6a558c4404d6a0fa8c92634747a1105db6997.sam@gentoo> (raw)

commit:     10e6a558c4404d6a0fa8c92634747a1105db6997
Author:     David Palao <david.palao <AT> gmail <DOT> com>
AuthorDate: Fri Oct 13 15:16:41 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Oct 30 03:14:25 2023 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=10e6a558

tests/emerge: test_simple.py, conftest.py: Refactor

Refactor. Removed comments and changed simple -> baseline.

Signed-off-by: David Palao <david.palao <AT> gmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 lib/portage/tests/emerge/conftest.py               | 178 +--------------------
 .../emerge/{test_simple.py => test_baseline.py}    |  15 +-
 2 files changed, 11 insertions(+), 182 deletions(-)

diff --git a/lib/portage/tests/emerge/conftest.py b/lib/portage/tests/emerge/conftest.py
index 693ae0e6a6..aaa603f731 100644
--- a/lib/portage/tests/emerge/conftest.py
+++ b/lib/portage/tests/emerge/conftest.py
@@ -182,8 +182,6 @@ _INSTALLED_EBUILDS = {
 _BASELINE_COMMAND_SEQUENCE = [
     "emerge -1 dev-libs/A -v dev-libs/B",
     "emerge with quickpkg direct",
-    # "emerge --root --quickpkg-direct-root",
-    # "emerge --quickpkg-direct-root",
     "env-update",
     "portageq envvar",
     "etc-update",
@@ -193,85 +191,8 @@ _BASELINE_COMMAND_SEQUENCE = [
     "emerge --info --verbose",
     "emerge --list-sets",
     "emerge --check-news",
-    #
-    # # "rm -rf {cachedir}",
-    # # "rm -rf {cachedir_pregen}",
-    # "emerge --regen",
-    # # "rm -rf {cachedir}",
-    # "FEATURES=metadata-transfer emerge --regen",
-    # # "rm -rf {cachedir}",
-    # "FEATURES=metadata-transfer emerge --regen",  # is this second test case needed?
-    # # "rm -rf {cachedir}",
-    # "egencache --update",
-    # "FEATURES=metadata-transfer emerge --metadata",
-    # # "rm -rf {cachedir}",
-    # "FEATURES=metadata-transfer emerge --metadata (2)",
-    # "emerge --metadata",
-    # # "rm -rf {cachedir}",
-    # "emerge --oneshot virtual/foo",
-    # # "foo pkg missing",
-    # "FEATURES=unmerge-backup emerge --unmerge virtual/foo",
-    # # "foo pkg exists",
-    # "emerge --pretend dev-libs/A",
-    # Sequence:
     "emerge --regen/--metadata",
-    #
-    # "ebuild dev-libs/A-1 manifest clean package merge",
-    # "emerge --pretend --tree --complete-graph dev-libs/A",
-    # "emerge -p dev-libs/B",
-    # "emerge -p --newrepo dev-libs/B",
-    # "emerge -B dev-libs/B",
-    # "emerge -1k dev-libs/B",
-    # "ebuild dev-libs/A-1 unpack",
-    # "emerge -1 dev-libs/A",
-    # "emerge -n dev-libs/A",
-    # "emerge --config dev-libs/A",
-    # "emerge --info dev-libs/A dev-libs/B",
-    # "emerge -pcv dev-libs/B",
-    # "emerge -pc",
-    # "emerge -c",
-    # "quickpkg --include-config y dev-libs/A",
-    # # "no protected files",
-    # # "rm /etc/A-0",
-    # "emerge -K dev-libs/A",
-    # # "one protected file",
-    # "emaint --check all",
-    # "emaint --fix all",
-    # "fixpackages",
-    # "regenworld",
-    # "portageq match {eroot} dev-libs/A",
-    # "portageq best_visible {eroot} dev-libs/A",
-    # "portageq best_visible {eroot} binary dev-libs/A",
-    # "portageq contents {eroot} dev-libs/A-1",
-    # "portageq metadata {eroot} ebuild dev-libs/A-1 EAPI IUSE RDEPEND",
-    # "portageq metadata {eroot} binary dev-libs/A-1 EAPI USE RDEPEND",
-    # "portageq metadata {eroot} installed dev-libs/A-1 EAPI USE RDEPEND",
-    # "portageq owners {eroot} {eroot}usr",
-    # "emerge -p {eroot}usr",
-    # "emerge -pCq {eroot}usr",
-    # "emerge -Cq dev-libs/A",
-    # "emerge -Cq dev-libs/B",
     "misc package operations",
-    # (
-    #     "EMERGE_DEFAULT_OPTS=--autounmask=n "
-    #     "emerge --autounmask --autounmask-continue dev-libs/C"
-    # ),
-    # "portageq match {eroot} dev-libs/D[flag]",
-    # "EPREFIX={cross_prefix} emerge dev-libs/C",
-    # "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/C",
-    # "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/D",
-    # "ROOT={cross_root} emerge dev-libs/D",
-    # "portageq has_version {cross_eroot} dev-libs/D",
-    # "EPREFIX={cross_prefix} emerge -K dev-libs/A",
-    # "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/A",
-    # "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/B",
-    # "EPREFIX={cross_prefix} emerge -Cq dev-libs/B",
-    # "EPREFIX={cross_prefix} emerge -Cq dev-libs/A",
-    # "EPREFIX={cross_prefix} emerge dev-libs/A",
-    # "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/A",
-    # "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/B",
-    # "ROOT={cross_root} emerge dev-libs/B",
-    # "portageq has_version {cross_eroot} dev-libs/B",
     "binhost emerge",
 ]
 
@@ -572,7 +493,6 @@ def _generate_all_baseline_commands(playground, binhost):
 
     test_commands = {}
 
-    ###
     if hasattr(argparse.ArgumentParser, "parse_intermixed_args"):
         parse_intermixed_command = Emerge(
             "--oneshot",
@@ -583,10 +503,8 @@ def _generate_all_baseline_commands(playground, binhost):
     else:
         parse_intermixed_command = Noop()
     test_commands["emerge -1 dev-libs/A -v dev-libs/B"] = parse_intermixed_command
-    ###
 
     quickpkg_direct_seq = [
-        # test_commands["emerge --root --quickpkg-direct-root"] =
         Emerge(
             "--usepkgonly",
             "--root",
@@ -597,7 +515,6 @@ def _generate_all_baseline_commands(playground, binhost):
             "dev-libs/A",
         ),
         # v needs ^
-        # test_commands["emerge --quickpkg-direct-root"] =
         Emerge(
             "--usepkgonly",
             "--quickpkg-direct=y",
@@ -610,9 +527,7 @@ def _generate_all_baseline_commands(playground, binhost):
         *quickpkg_direct_seq
     )
 
-    ###
     test_commands["env-update"] = EnvUpdate()
-    ###
     test_commands["portageq envvar"] = Portageq(
         "envvar",
         "-v",
@@ -622,22 +537,14 @@ def _generate_all_baseline_commands(playground, binhost):
         "PORTAGE_TMPDIR",
         "USERLAND",
     )
-    ###
     test_commands["etc-update"] = EtcUpdate()
-    ###
     test_commands["dispatch-conf"] = DispatchConf()
-    ###
     test_commands["emerge --version"] = Emerge("--version")
-    ###
     test_commands["emerge --info"] = Emerge("--info")
-    ###
     test_commands["emerge --info --verbose"] = Emerge("--info", "--verbose")
-    ###
     test_commands["emerge --list-sets"] = Emerge("--list-sets")
-    ###
     test_commands["emerge --check-news"] = Emerge("--check-news")
 
-    ###
     def _rm_cachedir():
         shutil.rmtree(cachedir)
 
@@ -683,7 +590,6 @@ def _generate_all_baseline_commands(playground, binhost):
     ]
     test_commands["emerge --regen/--metadata"] = PortageCommandSequence(*regen_seq)
 
-    # test_commands["ebuild dev-libs/A-1 manifest clean package merge"] =
     abcd_seq = [
         Ebuild(
             test_ebuild,
@@ -692,64 +598,50 @@ def _generate_all_baseline_commands(playground, binhost):
             "package",
             "merge",
         ),
-        # test_commands["emerge --pretend --tree --complete-graph dev-libs/A"] =
         Emerge(
             "--pretend",
             "--tree",
             "--complete-graph",
             "dev-libs/A",
         ),
-        # test_commands["emerge -p dev-libs/B"] =
         Emerge("-p", "dev-libs/B"),
-        # test_commands["emerge -p --newrepo dev-libs/B"] =
         Emerge(
             "-p",
             "--newrepo",
             "dev-libs/B",
         ),
-        # test_commands["emerge -B dev-libs/B"] =
         Emerge("-B", "dev-libs/B"),
-        # test_commands["emerge -1k dev-libs/B"] =
         Emerge(
             "--oneshot",
             "--usepkg",
             "dev-libs/B",
         ),
         # trigger clean prior to pkg_pretend as in bug #390711
-        # test_commands["ebuild dev-libs/A-1 unpack"] =
         Ebuild(test_ebuild, "unpack"),
-        # test_commands["emerge -1 dev-libs/A"] =
         Emerge("--oneshot", "dev-libs/A"),
-        # test_commands["emerge -n dev-libs/A"] =
         Emerge("--noreplace", "dev-libs/A"),
-        # test_commands["emerge --config dev-libs/A"] =
         Emerge(
             "--config",
             "dev-libs/A",
         ),
-        # test_commands["emerge --info dev-libs/A dev-libs/B"] =
         Emerge(
             "--info",
             "dev-libs/A",
             "dev-libs/B",
         ),
-        # test_commands["emerge -pcv dev-libs/B"] =
         Emerge(
             "--pretend",
             "--depclean",
             "--verbose",
             "dev-libs/B",
         ),
-        # test_commands["emerge -pc"] =
         Emerge("--pretend", "--depclean"),
-        # test_commands["emerge -c"] =
         Emerge(
             "--depclean",
         ),
         # Test bug #523684, where a file renamed or removed by the
         # admin forces replacement files to be merged with config
         # protection.
-        # test_commands["quickpkg --include-config y dev-libs/A"] =
         Quickpkg(
             "--include-config",
             "y",
@@ -758,14 +650,7 @@ def _generate_all_baseline_commands(playground, binhost):
                 0, eroot, settings["CONFIG_PROTECT"]
             ),
         ),
-        # Another "it is not a test command" case; actually setup:
-        # test_commands["rm /etc/A-0"] = lambda: os.unlink(
-        #     os.path.join(eprefix, "etc", "A-0")
-        # )
-        # emerge_noreplace_A =
         Emerge("--noreplace", "dev-libs/A"),
-        # test_commands["emerge -K dev-libs/A"] = PortageCommandSequence(
-        #    emerge_noreplace_A,
         Emerge(
             "--usepkgonly",
             "dev-libs/A",
@@ -774,42 +659,31 @@ def _generate_all_baseline_commands(playground, binhost):
                 1, eroot, settings["CONFIG_PROTECT"]
             ),
         ),
-        # test_commands["emaint --check all"] =
         Emaint("--check", "all"),
-        # test_commands["emaint --fix all"] =
         Emaint("--fix", "all"),
-        # test_commands["fixpackages"] =
         Fixpackages(),
-        # test_commands["regenworld"] =
         Regenworld(),
-        # test_commands["portageq match {eroot} dev-libs/A"] =
         Portageq(
             "match",
             eroot,
             "dev-libs/A",
         ),
-        # test_commands["portageq best_visible {eroot} dev-libs/A"] =
         Portageq(
             "best_visible",
             eroot,
             "dev-libs/A",
         ),
-        # test_commands["portageq best_visible {eroot} binary dev-libs/A"] =
         Portageq(
             "best_visible",
             eroot,
             "binary",
             "dev-libs/A",
         ),
-        # test_commands["portageq contents {eroot} dev-libs/A-1"] =
         Portageq(
             "contents",
             eroot,
             "dev-libs/A-1",
         ),
-        # test_commands[
-        #     "portageq metadata {eroot} ebuild dev-libs/A-1 EAPI IUSE RDEPEND"
-        # ] =
         Portageq(
             "metadata",
             eroot,
@@ -819,9 +693,6 @@ def _generate_all_baseline_commands(playground, binhost):
             "IUSE",
             "RDEPEND",
         ),
-        # test_commands[
-        #     "portageq metadata {eroot} binary dev-libs/A-1 EAPI USE RDEPEND"
-        # ] =
         Portageq(
             "metadata",
             eroot,
@@ -831,9 +702,6 @@ def _generate_all_baseline_commands(playground, binhost):
             "USE",
             "RDEPEND",
         ),
-        # test_commands[
-        #     "portageq metadata {eroot} installed dev-libs/A-1 EAPI USE RDEPEND"
-        # ] =
         Portageq(
             "metadata",
             eroot,
@@ -843,28 +711,23 @@ def _generate_all_baseline_commands(playground, binhost):
             "USE",
             "RDEPEND",
         ),
-        # test_commands["portageq owners {eroot} {eroot}usr"] =
         Portageq(
             "owners",
             eroot,
             eroot + "usr",
         ),
-        # test_commands["emerge -p {eroot}usr"] =
         Emerge("-p", eroot + "usr"),
-        # test_commands["emerge -pCq {eroot}usr"] =
         Emerge(
             "-p",
             "--unmerge",
             "-q",
             eroot + "usr",
         ),
-        # test_commands["emerge -Cq dev-libs/A"] =
         Emerge(
             "--unmerge",
             "--quiet",
             "dev-libs/A",
         ),
-        # test_commands["emerge -Cq dev-libs/B"] =
         Emerge(
             "-C",
             "--quiet",
@@ -873,10 +736,6 @@ def _generate_all_baseline_commands(playground, binhost):
         # autounmask:
         # If EMERGE_DEFAULT_OPTS contains --autounmask=n, then --autounmask
         # must be specified with --autounmask-continue.
-        # test_commands[
-        #     "EMERGE_DEFAULT_OPTS=--autounmask=n "
-        #     "emerge --autounmask --autounmask-continue dev-libs/C"
-        # ] =
         Emerge(
             "--autounmask",
             "--autounmask-continue",
@@ -885,7 +744,6 @@ def _generate_all_baseline_commands(playground, binhost):
         ),
         # Verify that the above --autounmask-continue command caused
         # USE=flag to be applied correctly to dev-libs/D.
-        # test_commands["portageq match {eroot} dev-libs/D[flag]"] =
         Portageq(
             "match",
             eroot,
@@ -897,53 +755,32 @@ def _generate_all_baseline_commands(playground, binhost):
     cross_prefix_seq = [
         # Test cross-prefix usage, including chpathtool for binpkgs.
         # EAPI 7
-        # test_commands["EPREFIX={cross_prefix} emerge dev-libs/C"] =
         Emerge("dev-libs/C", env_mod={"EPREFIX": cross_prefix}),
-        # test_commands[
-        #     "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/C"
-        # ] =
         Portageq(
             "has_version", cross_prefix, "dev-libs/C", env_mod={"EPREFIX": cross_prefix}
         ),
-        # test_commands[
-        #     "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/D"
-        # ] =
         Portageq(
             "has_version", cross_prefix, "dev-libs/D", env_mod={"EPREFIX": cross_prefix}
         ),
-        # test_commands["ROOT={cross_root} emerge dev-libs/D"] =
         Emerge("dev-libs/D", env_mod={"ROOT": cross_root}),
-        # test_commands["portageq has_version {cross_eroot} dev-libs/D"] =
         Portageq(
             "has_version",
             cross_eroot,
             "dev-libs/D",
         ),
         # EAPI 5
-        # test_commands["EPREFIX={cross_prefix} emerge -K dev-libs/A"] =
         Emerge("--usepkgonly", "dev-libs/A", env_mod={"EPREFIX": cross_prefix}),
-        # test_commands[
-        #     "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/A"
-        # ] =
         Portageq(
             "has_version", cross_prefix, "dev-libs/A", env_mod={"EPREFIX": cross_prefix}
         ),
-        # test_commands[
-        #     "EPREFIX={cross_prefix} portageq has_version {cross_prefix} dev-libs/B"
-        # ] =
         Portageq(
             "has_version", cross_prefix, "dev-libs/B", env_mod={"EPREFIX": cross_prefix}
         ),
-        # test_commands["EPREFIX={cross_prefix} emerge -Cq dev-libs/B"] =
         Emerge("-C", "--quiet", "dev-libs/B", env_mod={"EPREFIX": cross_prefix}),
-        # test_commands["EPREFIX={cross_prefix} emerge -Cq dev-libs/A"] =
         Emerge("-C", "--quiet", "dev-libs/A", env_mod={"EPREFIX": cross_prefix}),
-        # test_commands["EPREFIX={cross_prefix} emerge dev-libs/A"] =
         Emerge("dev-libs/A", env_mod={"EPREFIX": cross_prefix}),
         # Test ROOT support
-        # test_commands["ROOT={cross_root} emerge dev-libs/B"] =
         Emerge("dev-libs/B", env_mod={"ROOT": cross_root}),
-        # test_commands["portageq has_version {cross_eroot} dev-libs/B"] =
         Portageq(
             "has_version",
             cross_eroot,
@@ -966,13 +803,8 @@ def _generate_all_baseline_commands(playground, binhost):
 
     if fetch_bin is None:
         test_commands["binhost emerge"] = Noop()
-        # for command_name in _BASELINE_COMMAND_FETCHCOMMAND_SEQUENCE:
-        #     test_commands[command_name] = Noop()
     else:
-        # test_commands["mv {pkgdir} {binhost_dir}"] = lambda: os.rename(
-        #     pkgdir, binhost_dir
-        # )
-        # test_commands["emerge -eG dev-libs/A"] =
+        # The next emerge has been added to split this test from the rest:
         make_package = Emerge("--buildpkg", "dev-libs/A")
         getbinpkgonly = Emerge(
             "-e",
@@ -980,19 +812,13 @@ def _generate_all_baseline_commands(playground, binhost):
             "dev-libs/A",
             preparation=lambda: os.rename(pkgdir, binhost_dir),
         )
-        # test_commands["rm -R {pkgdir}"] = lambda: shutil.rmtree(pkgdir)
-        # test_commands["mv {binhost_dir} {pkgdir}"] = lambda: os.rename(
-        #     binhost_dir, pkgdir
-        # )
-        # Remove binrepos.conf and test PORTAGE_BINHOST.
 
-        # test_commands["rm {binrepos_conf_file}"] = lambda: os.unlink(binrepos_conf_file)
+        # Remove binrepos.conf and test PORTAGE_BINHOST.
         def _replace_pkgdir_and_rm_binrepos_conf_file():
             shutil.rmtree(pkgdir)
             os.rename(binhost_dir, pkgdir)
             os.unlink(binrepos_conf_file)
 
-        # test_commands["PORTAGE_BINHOST={binhost_uri} emerge -feG dev-libs/A"] =
         getbinpkgonly_fetchonly = Emerge(
             "-fe",
             "--getbinpkgonly",

diff --git a/lib/portage/tests/emerge/test_simple.py b/lib/portage/tests/emerge/test_baseline.py
similarity index 95%
rename from lib/portage/tests/emerge/test_simple.py
rename to lib/portage/tests/emerge/test_baseline.py
index b23e10ddfd..55722d900e 100644
--- a/lib/portage/tests/emerge/test_simple.py
+++ b/lib/portage/tests/emerge/test_baseline.py
@@ -4,7 +4,7 @@
 """This module defines a baseline for portage's functionality.
 
 Multiple portage commands are executed in a sequence in a playground
-(see the ``simple_command`` fixture in ``conftest.py``).
+(see the ``baseline_command`` fixture in ``conftest.py``).
 
 All the commands are triggered from the ``test_portage_baseline`` test.
 That test is marked with::
@@ -16,7 +16,12 @@ so that it can selected with that marker, i.e.::
   pytest -m ft
 
 ``ft`` stands for *functional test*, since that's what it is, a
-functional or end-to-end test.
+functional or end-to-end test, ensuring some functionality of portage.
+
+The test also works with pytest-xdist, e.g.::
+
+  pytest -m ft -n 8
+
 """
 
 import subprocess
@@ -60,7 +65,7 @@ move dev-util/git dev-vcs/git
 def test_portage_baseline(async_loop, playground, binhost, baseline_command):
     async_loop.run_until_complete(
         asyncio.ensure_future(
-            _async_test_simple(
+            _async_test_baseline(
                 playground,
                 binhost,
                 baseline_command,
@@ -70,14 +75,12 @@ def test_portage_baseline(async_loop, playground, binhost, baseline_command):
     )
 
 
-async def _async_test_simple(playground, binhost, commands):
+async def _async_test_baseline(playground, binhost, commands):
     debug = playground.debug
     settings = playground.settings
     trees = playground.trees
     eprefix = settings["EPREFIX"]
 
-    # test_commands = make_test_commands(settings, trees, binhost["uri"])
-
     test_repo_location = settings.repositories["test_repo"].location
     var_cache_edb = os.path.join(eprefix, "var", "cache", "edb")
     cachedir = os.path.join(var_cache_edb, "dep")


             reply	other threads:[~2023-10-30  3:14 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-30  3:14 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-02-25  8:25 [gentoo-commits] proj/portage:master commit in: lib/portage/tests/emerge/ Sam James
2024-02-24  3:36 Zac Medico
2024-01-03 19:59 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-05-26 15:45 Sam James
2023-05-26 15:45 Sam James
2022-09-25 19:12 Mike Gilbert
2021-01-18 12:20 Zac Medico
2020-10-17  9:21 Zac Medico
2020-10-12 18:03 Zac Medico
2020-08-03 23:28 Zac Medico
2020-08-03 19:30 Zac Medico
2020-03-08 22:29 Zac Medico
2020-03-08  7:33 Zac Medico

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=1698635665.10e6a558c4404d6a0fa8c92634747a1105db6997.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