Tarantool development patches archive
 help / color / mirror / Atom feed
From: Evgeniy Temirgaleev via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: "Sergey Bronnikov" <sergeyb@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches]  [PATCH luajit v3 2/3] ci: enabled sanitizer tests for macOS
Date: Fri, 28 Aug 2026 18:12:04 +0300	[thread overview]
Message-ID: <1787929924.462961851@f483.i.mail.ru> (raw)
In-Reply-To: <5798e367-3daa-4fe1-b9e0-5fec24d52082@tarantool.org>

[-- Attachment #1: Type: text/plain, Size: 18198 bytes --]

Hi, Sergey! Thanks for review!
Please, see my answers below.
Fixes applied and the branch is force pushed.

> 
> From: Sergey Bronnikov <sergeyb@tarantool.org>
> To: Evgeniy Temirgaleev <e.temirgaleev@tarantool.org>, Sergey Kaplun <skaplun@tarantool.org
> >
> Cc: tarantool-patches@dev.tarantool.org
> Date: Thursday, August 27, 2026 3:07 PM +03:00
> 
> 
> Hi, Evgeniy,
> 
> 
> 
> thanks for the patch! See my comments below.
> 
> 
> 
> Sergey
> 
> On 8/6/26 15:47, Evgeniy Temirgaleev wrote:
> 
>> From: Temir Galeev <temir.galeev@bk.ru> ( temir.galeev@bk.ru )
>> 
>> The arm64
>> and x86_64 architectures with clang/gcc compiler were added
>> to the matrix.
>> ---
>>  .../README.md                                 |   0
>>  .../action.yml  
>> |   8 +-
>>  .../actions/setup-sanitizers-macos/README.md  |  15 +++
>> 
>> .../actions/setup-sanitizers-macos/action.yml |  73 +++++++++++++
>> 
>> .github/workflows/sanitizers-testing.yml      | 101 ++++++++++++++++--
>>  5
>> files changed, 186 insertions(+), 11 deletions(-)
>>  rename
>> .github/actions/{setup-sanitizers => setup-sanitizers-linux}/README.md
>> (100%)
>>  rename .github/actions/{setup-sanitizers =>
>> setup-sanitizers-linux}/action.yml (76%)
>>  create mode 100644
>> .github/actions/setup-sanitizers-macos/README.md
>>  create mode 100644
>> .github/actions/setup-sanitizers-macos/action.yml
>> 
>> diff --git
>> a/.github/actions/setup-sanitizers/README.md
>> b/.github/actions/setup-sanitizers-linux/README.md
>> similarity index 100%
>> rename from .github/actions/setup-sanitizers/README.md
>> rename to
>> .github/actions/setup-sanitizers-linux/README.md
>> diff --git
>> a/.github/actions/setup-sanitizers/action.yml
>> b/.github/actions/setup-sanitizers-linux/action.yml
>> similarity index 76%
>> rename from .github/actions/setup-sanitizers/action.yml
>> rename to
>> .github/actions/setup-sanitizers-linux/action.yml
>> index 8642d553..18f5a75d
>> 100644
>> --- a/.github/actions/setup-sanitizers/action.yml
>> +++
>> b/.github/actions/setup-sanitizers-linux/action.yml
>> @@ -20,13 +20,17 @@
>> runs:
>>      - name: Install build and test dependencies
>>        run: |
>>      
>> apt -y update
>> +        echo Available compilers:
>> +        export
>> CC_FAMILY=`echo ${CC_NAME} | sed 's/-.*$//'`
>> +        apt list | grep -Pe
>> "^${CC_FAMILY}-[0-9]+/"
>> +        # Try to install
> 
> 
> 
> Honestly, I don't get why we should available compilers on each run.
> 
> 
> 

I think this information is important for some cases to have it on hand. The example was present in the thread above: https://lists.tarantool.org/pipermail/tarantool-patches/2026-August/030774.html

> 
> 
> 
> Why we cannot
> 
> 
> 
> hardcode compiler here?
> 
> 
> 

This patch is not intended to refactor linux sanitizers action, so the existing solution is used.

Only info about available compilers was added:

«Also, the 'setup-sanitizers-macos' action supplied with
the 'list available compilers' commands in one of it's job.
It helps to get the answer to the question:
'Which compiler we can select just now with our current environment?'

The 'setup-sanitizers-linux' build job extended with such commands also.»

> 
> 
>>          apt -y install ${CC_NAME} libstdc++-10-dev cmake ninja-build make
>> perl
>>        shell: bash
>>        env:
>>          CC_NAME: ${{ inputs.cc_name
>> }}
>> -    - name: Set specific C compiler as a default toolchain
>> +    -
>> name: Set specific C compiler as a default toolchain for cmake
> 
> s/cmake/CMake/?
> 

Fixed.

> 
> 
>>        run: |
>> -        echo CC=${CC_NAME} | tee -a $GITHUB_ENV
>> +       
>> echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV
> 
> s/tee -a/>>/ (feel free to ignore, previously tee was used)
> 

The ‘tee -a’ method allows the programmer to see the step’s result of the env definition. It’s used in the ‘setup’, ‘setup-linux’, ‘setup-macos’ actions and some workflows already. I think it’s a good approach to use. Also, there is an empty grep for the ‘>> $GITHUB_ENV’ method in our scripts.

If there are the strong reasons to change it, I think it must be done in all places and in the separate refactoring patch.

> 
> 
>>        shell: bash
>>        env:
>>          CC_NAME: ${{ inputs.cc_name }}
>> diff --git a/.github/actions/setup-sanitizers-macos/README.md
>> b/.github/actions/setup-sanitizers-macos/README.md
>> new file mode 100644
>> index 00000000..9ac5eb38
>> --- /dev/null
>> +++
>> b/.github/actions/setup-sanitizers-macos/README.md
>> @@ -0,0 +1,15 @@
>> +#
>> Setup environment for sanitizers on macOS
>> +
>> +Action setups the environment
>> on macOS runners (install requirements, setup the
>> +workflow environment,
>> etc) for testing with sanitizers enabled.
>> +
>> +Requires input:
>> +- cc_name as
>> versioned C compiler: gcc-ver or clang-ver.
>> +
>> +## How to use Github Action
>> from Github workflow
>> +
>> +Add the following code to the running steps before
>> LuaJIT configuration:
>> +```
>> +- uses:
>> ./.github/actions/setup-sanitizers-macos
>> +  if: ${{ matrix.OS == 'macOS'
>> }}
>> +```
>> diff --git a/.github/actions/setup-sanitizers-macos/action.yml
>> b/.github/actions/setup-sanitizers-macos/action.yml
>> new file mode 100644
>> index 00000000..9836ea03
>> --- /dev/null
>> +++
>> b/.github/actions/setup-sanitizers-macos/action.yml
>> @@ -0,0 +1,73 @@
>> +name: Setup CI environment for testing with sanitizers on macOS
>> +description: Common part to tweak macOS CI runner environment for
>> sanitizers
>> +inputs:
>> +  cc_name:
>> +    description: C compiler name (for
>> example, gcc-12)
>> +    required: false
>> +    default: clang-21
>> +runs:
>> + 
>> using: composite
>> +  steps:
>> +    - name: Get compiler version from cc_name
>> +      shell: bash
>> +      env:
>> +        CC_NAME: ${{ inputs.cc_name }}
>> +  
>> run: |
>> +        echo CC_VERSION=`echo ${CC_NAME} | sed 's/.*-//'` | tee -a
>> $GITHUB_ENV
>> +    - name: Get brew formula from cc_name
>> +      shell: bash
>> +      env:
>> +        CC_FORMULA_NAME: |-
>> +          ${{ case(
>> +           
>> startsWith(inputs.cc_name, 'gcc'), 'gcc',
>> +           
>> startsWith(inputs.cc_name, 'clang'), 'llvm',
>> +            'MISCONFIG'
>> +   
>> ) }}
>> +      run: |
>> +        echo
>> CC_FORMULA=${CC_FORMULA_NAME}@${CC_VERSION} | tee -a $GITHUB_ENV
>> +       
>> echo Available formulas: `brew search ${CC_FORMULA_NAME}`
>> +    - name:
>> Setup CI environment
>> +      uses: ./.github/actions/setup
>> +    - name: Set
>> CMAKE_BUILD_PARALLEL_LEVEL
>> +      shell: bash
>> +      run: |
>> +        # Set
>> CMAKE_BUILD_PARALLEL_LEVEL environment variable to
>> +        # limit the
>> number of parallel jobs for build/test step.
>> +        NPROC=$(sysctl -n
>> hw.logicalcpu 2>/dev/null)
>> +        echo
>> CMAKE_BUILD_PARALLEL_LEVEL=$(($NPROC + 1)) | tee -a $GITHUB_ENV
>> +    -
>> name: Set MACOSX_DEPLOYMENT_TARGERT
>> +      shell: bash
>> +      run: |
>> +    
>> # Set required MACOSX_DEPLOYMENT_TARGERT environment
>> +        # variable
>> for Makefile.original build.
>> +        # See https://github.com/LuaJIT/LuaJIT/issues/484,
>> +        # https://github.com/LuaJIT/LuaJIT/issues/653.
>> +        echo
>> MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion) | tee -a $GITHUB_ENV
>> +
>> - name: Install build and test dependencies
>> +      shell: bash
>> +      run:
>> |
>> +        # Install brew using the command from Homebrew repository
>> +    
>> # instructions: https://github.com/Homebrew/install.
>> +        # XXX:
>> 'echo' command below is required since brew
>> +        # installation script
>> obliges the one to enter a newline
>> +        # for confirming the
>> installation via Ruby script.
>> +        brew update ||
>> +          echo |
>> /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install
>> )"
>> +        # Try to install the packages either upgrade it to avoid
>> +    
>> # of fails if the package already exists with the previous
>> +        #
>> version.
>> +        brew install --force ${CC_FORMULA} cmake make ninja perl
>> ||
>> +          brew upgrade ${CC_FORMULA} cmake make ninja perl
>> +    -
>> name: Set specific C compiler as a default toolchain for cmake
>> +     
>> shell: bash
>> +      env:
>> +        CC_NAME: ${{ inputs.cc_name }}
>> +     
>> run: |
>> +        echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV
>> +   
>> echo CMAKE_PREFIX_PATH="`brew --prefix ${CC_FORMULA}`" | tee -a
>> $GITHUB_ENV
>> +    - name: Log installed compilers
>> +      shell: bash
>> +     
>> run: |
>> +        echo default clang: `clang --version`
>> +        echo
>> default gcc: `gcc --version`
>> +        echo cmake compiler:
>> `${CMAKE_PREFIX_PATH}/bin/${CMAKE_C_COMPILER} --version`
>> diff --git
>> a/.github/workflows/sanitizers-testing.yml
>> b/.github/workflows/sanitizers-testing.yml
>> index 4bf7d023..fe550b81 100644
>> --- a/.github/workflows/sanitizers-testing.yml
>> +++
>> b/.github/workflows/sanitizers-testing.yml
>> @@ -31,17 +31,41 @@ jobs:
>>     
>> strategy:
>>        fail-fast: false
>>        matrix:
>> -        # XXX: Let's
>> start with only Linux/x86_64
>> +        ARCH: [ARM64, x86_64]
>>         
>> BUILDTYPE: [Debug, Release]
>> -        CC: [gcc-10, clang-11]
>> +        OS:
>> [Linux, macOS]
>> +        # There are different top-level versions available
>> for Linux and macOS runners.
>> +        CC: [gcc-10, clang-11, gcc-15,
>> clang-21]
>>          include:
>>            - BUILDTYPE: Debug
>>             
>> CMAKEFLAGS: -DCMAKE_BUILD_TYPE=Debug -DLUA_USE_ASSERT=ON
>> -DLUA_USE_APICHECK=ON
>>            - BUILDTYPE: Release
>>             
>> CMAKEFLAGS: -DCMAKE_BUILD_TYPE=RelWithDebInfo
>> -    runs-on: [self-hosted,
>> regular, Linux, x86_64]
>> +        exclude:
>> +          # On current runners
>> with Linux/ARM64 environment and
>> +          # with LUAJIT_USE_SYSMALLOC=ON
>> the system allocator returns addresses
>> +          # with 48-bit set. Thus
>> checkptrGC() fails with new Lua state pointer
>> +          # and luajit
>> fails to start with 'cannot create state: not enough memory'
>> +          #
>> error. So, we exclude these cases.
>> +          - ARCH: ARM64
>> +           
>> OS: Linux
>> +          # Exclude nonsuitable OS/compiler pairs.
>> +          -
>> OS: macOS
>> +            CC: gcc-10
>> +          - OS: macOS
>> +            CC:
>> clang-11
>> +          - OS: Linux
>> +            CC: gcc-15
>> +          - OS:
>> Linux
>> +            CC: clang-21
>> +          # Exclude macOS/ARM64/gcc case
>> due to some tests are failed.
>> +          # Details: https://github.com/tarantool/tarantool/issues/13018
>> +          - ARCH: ARM64
>> +            OS: macOS
>> +            CC: gcc-15
>> + 
>> runs-on: [self-hosted, regular, '${{ matrix.OS }}', '${{ matrix.ARCH }}']
>> 
>> name: >
>> -      LuaJIT with ASan and UBSan (Linux/x86_64)
>> +      LuaJIT
>> with ASan and UBSan (${{ matrix.OS }}/${{ matrix.ARCH }})
>>        ${{
>> matrix.BUILDTYPE }}
>>        CC:${{ matrix.CC }}
>>        GC64:ON SYSMALLOC:ON
>> @@ -51,7 +75,13 @@ jobs:
>>            fetch-depth: 0
>>            submodules:
>> recursive
>>        - name: setup Linux for sanitizers
>> -        uses:
>> ./.github/actions/setup-sanitizers
>> +        if: ${{ matrix.OS == 'Linux'
>> }}
>> +        uses: ./.github/actions/setup-sanitizers-linux
>> +        with:
>> +          cc_name: ${{ matrix.CC }}
>> +      - name: setup macOS for
>> sanitizers
>> +        if: ${{ matrix.OS == 'macOS' }}
>> +        uses:
>> ./.github/actions/setup-sanitizers-macos
>>          with:
>>           
>> cc_name: ${{ matrix.CC }}
>>        - name: configure
>> @@ -70,18 +100,46 @@
>> jobs:
>>            cmake -S . -B ${{ env.BUILDDIR }}
>>            -G Ninja
>>    
>> ${{ matrix.CMAKEFLAGS }}
>> +          -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
>> +          -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
>>           
>> -DLUAJIT_ENABLE_GC64=ON
>>            -DLUAJIT_USE_ASAN=ON
>>           
>> -DLUAJIT_USE_SYSMALLOC=ON
>>            -DLUAJIT_USE_UBSAN=ON
>> +      - name:
>> Check for possible compiler misconfig
>> +        working-directory: ${{
>> env.BUILDDIR }}
>> +        env:
>> +          CC_NAME: ${{ matrix.CC }}
>> +      
>> run: grep CMakeCache.txt -e CMAKE_C_COMPILER:STRING | grep ${CC_NAME}
>>     
>> - name: build
>>          run: cmake --build . --parallel
>>         
>> working-directory: ${{ env.BUILDDIR }}
>> -      - name: test
>> +
>> +      #
>> Enable as much checks as possible. See more info here:
> 
> 
> 
> You say about enabling ASAN features, but some features are disabled
> below,
> 
> 
> 
> please explain why these features are disabled.
> 
> 
> 

> 
> 
>> +      # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags,
>> +      # https://github.com/google/sanitizers/wiki/SanitizerCommonFlags.
>> +
>> - name: setup sanitizer options for Linux
>> +        if: ${{ matrix.OS ==
>> 'Linux' }}
>> +        env:
>> +          ASAN_OPTIONS: "                    \
>> +
>> detect_invalid_pointer_pairs=1:  \
>> +            detect_leaks=1:           
>> \
> 
> already enabled by default
>> +            detect_stack_use_after_return=1: \
>> +           
>> dump_instruction_bytes=1:        \
>> +            heap_profile=0:           
>> \
> 
> disabled by default
>> +            print_suppressions=0:            \
> 
> Why disabled?
>> +            symbolize=1:                     \
> 
> enabled by default
> 

The patch doesn’t enable ASAN for Linux, so this part isn’t changed: the ASAN options for Linux is used as is.

The ASAN options for macOS is just a copy of the Linux options with one exception. The detect_leaks was disabled with the explanation in a comment.

The full option investigation and selection in not the main goal of the patch. The patch enables ASAN for macOS and it’s truly enabled for the options selected.

I agree that the actualization of options for both Linux and macOS is a valuable job. I suggest to make a ticket for it.

> 
> 
>> +            unmap_shadow_on_exit=1:          \
>> +          "
>> +         
>> UBSAN_OPTIONS: "
>> +            print_stacktrace=1 \
>> +          "
>> +       
>> run: |
>> +          echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV
>> +
>> echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV
> 
> s/tee -a/>>/ (the same thing but usually used in Github documentation)
> 

Answered above.

> 
> 
>> +      - name: setup sanitizer options for macOS (common)
>> +        if: ${{
>> matrix.OS == 'macOS' && matrix.ARCH != 'ARM64' && matrix.CC != 'clang-21'
>> }}
>>          env:
>> -          # Enable as much checks as possible. See more
>> info here:
>> -          # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
>> ,
>> -          # https://github.com/google/sanitizers/wiki/SanitizerCommonFlags
>> .
>>            ASAN_OPTIONS: "                    \
>>             
>> detect_invalid_pointer_pairs=1:  \
>>              detect_leaks=1:           
>> \
>> @@ -95,5 +153,30 @@ jobs:
>>            UBSAN_OPTIONS: "
>>             
>> print_stacktrace=1 \
>>            "
>> +        run: |
>> +          echo
>> ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV
>> +          echo
>> UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV
> 
> s/tee -a/>>/
> 

The same.

> 
> 
>> +      - name: setup sanitizer options for macOS (ARM64/clang-21)
>> +       
>> if: ${{ matrix.OS == 'macOS' && matrix.ARCH == 'ARM64' && matrix.CC ==
>> 'clang-21' }}
>> +        # detect_leaks is disabled due to some tests build
>> is failed.
>> +        # Details: https://github.com/tarantool/tarantool/issues/13019
>> + 
>> env:
>> +          ASAN_OPTIONS: "                    \
>> +           
>> detect_invalid_pointer_pairs=1:  \
>> +            detect_leaks=0:           
>> \
>> +            detect_stack_use_after_return=1: \
>> +           
>> dump_instruction_bytes=1:        \
>> +            heap_profile=0:           
>> \
>> +            print_suppressions=0:            \
>> +           
>> symbolize=1:                     \
>> +            unmap_shadow_on_exit=1:   
>> \
> 
> the same questions as above. Also, can we avoid duplication?
> 

May be we can use the file to accumulate the options and to update it in a specific steps. I suggest this task to the new ticket ‘ci: actualization of the ASAN options for Linux and macOS’ also.

> 
> 
>> +          "
>> +          UBSAN_OPTIONS: "
>> +            print_stacktrace=1 \
>> +          "
>> +        run: |
>> +          echo ASAN_OPTIONS=${ASAN_OPTIONS}
>> | tee -a $GITHUB_ENV
>> +          echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee
>> -a $GITHUB_ENV
> 
> s/tee -a/>>/
> 

Answered above.

> 
> 
>> +      - name: test
>>          run: cmake --build . --parallel --target
>> LuaJIT-test
>>          working-directory: ${{ env.BUILDDIR }}
>> 
> 
> 
> 

The changes applied:
diff --git a/.github/actions/setup-sanitizers-linux/action.yml b/.github/actions/setup-sanitizers-linux/action.yml
index 9744e5dd..19314dca 100644
--- a/.github/actions/setup-sanitizers-linux/action.yml
+++ b/.github/actions/setup-sanitizers-linux/action.yml
@@ -28,7 +28,7 @@ runs:
shell: bash
env:
CC_NAME: ${{ inputs.cc_name }}
-    - name: Set specific C compiler as a default toolchain for cmake
+    - name: Set specific C compiler as a default toolchain for CMake.
run: |
echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV
shell: bash
diff --git a/.github/actions/setup-sanitizers-macos/action.yml b/.github/actions/setup-sanitizers-macos/action.yml
index d2160faa..740943af 100644
--- a/.github/actions/setup-sanitizers-macos/action.yml
+++ b/.github/actions/setup-sanitizers-macos/action.yml
@@ -35,7 +35,7 @@ runs:
# of fails if the package already exists with the previous
# version.
brew install --force ${CC_FORMULA} || brew upgrade ${CC_FORMULA}
-    - name: Set specific C compiler as a default toolchain for cmake
+    - name: Set specific C compiler as a default toolchain for CMake.
shell: bash
env:
CC_NAME: ${{ inputs.cc_name }}
--
Best regards,
Evgeniy Temirgaleev

[-- Attachment #2: Type: text/html, Size: 24347 bytes --]

  reply	other threads:[~2026-08-28 15:12 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-06 12:47 [Tarantool-patches] [PATCH luajit v3 0/3] build: fixed making tests with ASAN on OSX Evgeniy Temirgaleev via Tarantool-patches
2026-08-06 12:47 ` [Tarantool-patches] [PATCH luajit v3 1/3] test: " Evgeniy Temirgaleev via Tarantool-patches
2026-08-18 10:24   ` Sergey Kaplun via Tarantool-patches
2026-08-18 19:23     ` Evgeniy Temirgaleev via Tarantool-patches
2026-08-27 11:53   ` Sergey Bronnikov via Tarantool-patches
2026-08-28 11:14     ` Evgeniy Temirgaleev via Tarantool-patches
2026-08-06 12:47 ` [Tarantool-patches] [PATCH luajit v3 2/3] ci: enabled sanitizer tests for macOS Evgeniy Temirgaleev via Tarantool-patches
2026-08-18 10:47   ` Sergey Kaplun via Tarantool-patches
2026-08-18 20:35     ` Evgeniy Temirgaleev via Tarantool-patches
2026-08-19  7:30       ` Sergey Kaplun via Tarantool-patches
2026-08-20  7:53         ` Evgeniy Temirgaleev via Tarantool-patches
2026-08-27 12:07   ` Sergey Bronnikov via Tarantool-patches
2026-08-28 15:12     ` Evgeniy Temirgaleev via Tarantool-patches [this message]
2026-08-06 12:47 ` [Tarantool-patches] [PATCH luajit v3 3/3] ci: added a common way to disable perf workflow Evgeniy Temirgaleev via Tarantool-patches
2026-08-18 10:25   ` Sergey Kaplun via Tarantool-patches
2026-08-27 12:16   ` Sergey Bronnikov via Tarantool-patches

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=1787929924.462961851@f483.i.mail.ru \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=e.temirgaleev@tarantool.org \
    --cc=sergeyb@tarantool.org \
    --subject='Re: [Tarantool-patches]  [PATCH luajit v3 2/3] ci: enabled sanitizer tests for macOS' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox