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/20250904-b4-pks-rust-breaking-change-v1-0-3af1d25e0be9@xxxxxx > > 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/20250905-b4-pks-rust-breaking-change-v2-0-6939cbf4a0b8@xxxxxx > > 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/20250908-b4-pks-rust-breaking-change-v3-0-1cd7189fed3b@xxxxxx > > 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