Subject: Re: [PATCH RFC v4 0/9] Introduce Rust and announce that it will become mandatory

From: SZEDER Gábor <[email-masked]>
Date: Fri, 12 Sep 2025 17:45:16 +0200

On Wed, Sep 10, 2025 at 05:35:46PM +0200, Patrick Steinhardt wrote:
> Hi,
> 
> this small patch series introduces Rust into the core of Git. This patch
> series is designed as a test balloon, similar to how we introduced test
> balloons for C99 features in the past. The goal is threefold:
> 
>   - Give us some time to experiment with Rust and introduce proper build
>     infrastructure.
> 
>   - Give distributors time to ease into the new toolchain requirements.
>     Introducing Rust is impossible for some platforms and hard for
>     others.
> 
>   - Announce that Git 3.0 will make Rust a mandatory part of our build
>     infrastructure.
> 
> The test balloon itself is quite uninteresting: I've chosen to convert
> the "varint.c" subsystem, mostly because it is trivial and does not have
> any dependencies. But it does allow us to verify that C to Rust interop
> works as expected, and to play around with tooling. All tests pass with
> the "varint.rs" implementation.
> 
> For now, the series only contains support for Meson. If we agree to go
> down this route I'll also introduce support for Rust into our Makefiles
> at a later point in time.
> 
> Furthermore missing is additional tooling:
> 
>   - At least one CI job to verify that Rust builds and works as
>     expected.
> 
>   - Tooling and CI jobs to ensure that we have consistent formatting via
>     `cargo format`.
> 
> And probably lots more. As said, the entire goal is for us to have an
> easy playground that we can experiment on and develop the infrastructure
> incrementally without yet having to commit to anything.
> 
> I'm mostly splitting out the topic of introducing Rust from the larger
> series that introduce it into xdiff so that we can focus more on the
> actual process of introducing Rust into Git and less on the potential
> features that we want to build on top of it.
> 
> Changes in v2:
>   - Introduce support for building the Rust library via our Makefile.
>   - Introduce a '-DWITH_RUST' define. This define is used to print
>     whether or not Git is built with Rust via `git version
>     --build-options`.
>   - Adjust Meson to not depend on v1.9.0 and newer anymore.
>   - Introduce a roadmap into our BreakingChanges document to explain how
>     we'll iterate towards mandatory Rust support.
>   - Rework the Fedora job to do a full compile-and-test run with Meson
>     and breaking changes enabled.
>   - Adapt our breaking-changes jobs to enable Rust support.
>   - Link to v1: https://lore.kernel.org/r/[email-masked]
> 
> Changes in v3:
>   - Reorder all uses of `WITH_RUST` after the include of "config.mak".
>   - Add a test to verify overflow behaviour in Rust and explicitly use
>     `add_wrapping()`.
>   - Use explicit dependencies for the Rust library in our Makefile.
>   - Fix Alma Linux CI job.
>   - Stop tying maintenance of our LTS release to the availability of
>     gcc-rs.
>   - Add a fallback to Meson to use cargo directly.
>   - I've fixed the Rust edition to 2018 for now. This is intentionally
>     conservative so that we might be able to use Rust 1.49. For now, we
>     don't have any reason to use a newer edition, either. So let's take
>     the oldest version we can live with for now and then bump it as
>     required.
>   - Link to v2: https://lore.kernel.org/r/[email-masked]
> 
> Changes in v4:
>   - Convert "varint.c" to use explicit integer width so that we don't
>     need to use C types in Rust.
>   - Adapt Meson to unconditionally use Cargo.
>   - Don't use the unstable `--out-dir` option in Cargo. Instead, we
>     resort to a wrapper script in Meson.
>   - Shorten the timeline a bit to drop the extra step that ties Rust
>     support to `-Dbreaking_changes=true`. This accelerates the timeline
>     until distros are made forcibly aware of the upcoming changes in
>     Rust.
>   - Link to v3: https://lore.kernel.org/r/[email-masked]
> 
> Thanks!
> 
> Patrick
> 
> ---
> Patrick Steinhardt (9):
>       meson: add infrastructure to build internal Rust library
>       Makefile: reorder sources after includes
>       Makefile: introduce infrastructure to build internal Rust library
>       help: report on whether or not Rust is enabled
>       varint: use explicit width for integers
>       varint: reimplement as test balloon for Rust
>       BreakingChanges: announce Rust becoming mandatory
>       ci: convert "pedantic" job into full build with breaking changes
>       ci: enable Rust for breaking-changes jobs
> 
>  .github/workflows/main.yml         |   4 +-
>  .gitignore                         |   2 +
>  .gitlab-ci.yml                     |   4 +-
>  Cargo.toml                         |   9 ++
>  Documentation/BreakingChanges.adoc |  36 +++++++
>  Makefile                           | 214 ++++++++++++++++++++++---------------
>  ci/install-dependencies.sh         |   8 +-
>  ci/run-build-and-tests.sh          |  31 ++----
>  dir.c                              |  18 ++--
>  help.c                             |   6 ++
>  meson.build                        |  15 ++-
>  meson_options.txt                  |   2 +
>  read-cache.c                       |   6 +-
>  shared.mak                         |   1 +
>  src/cargo-meson.sh                 |  32 ++++++
>  src/lib.rs                         |   1 +
>  src/meson.build                    |  41 +++++++
>  src/varint.rs                      |  92 ++++++++++++++++
>  varint.c                           |   6 +-
>  varint.h                           |   4 +-
>  20 files changed, 401 insertions(+), 131 deletions(-)
> 
> Range-diff versus v3:
> 
>  1:  a25408af71 <  -:  ---------- meson: add infrastructure to build internal Rust library
>  -:  ---------- >  1:  ccdb7e264d meson: add infrastructure to build internal Rust library
>  2:  a9c639b0f3 =  2:  b88c80f7e9 Makefile: reorder sources after includes
>  3:  ccac54a247 !  3:  873f9d82f5 Makefile: introduce infrastructure to build internal Rust library
>     @@ .gitignore
>      @@
>       /fuzz_corpora
>      +/target/
>     ++/Cargo.lock

The Cargo.lock build artifact is back in .gitignore in this version of
the patch series, but the 'clean' target is not updated accordingly to
remove it.

>       /GIT-BUILD-DIR
>       /GIT-BUILD-OPTIONS
>       /GIT-CFLAGS
>  4:  b357ff9463 =  4:  4e70509175 help: report on whether or not Rust is enabled