#ast-grep #patch #cargo-patch

bin+lib cargo-stitch

A Cargo subcommand that applies source-level patches and ast-grep rules to workspace crates before compilation

4 releases (2 breaking)

Uses new Rust 2024

0.3.0 Mar 2, 2026
0.2.1 Feb 25, 2026
0.2.0 Feb 24, 2026
0.1.0 Feb 23, 2026

#209 in Cargo plugins

MIT/Apache

45KB
949 lines

cargo-stitch

Crates.io Docs.rs CI codecov License

A Cargo subcommand that applies source-level patches and ast-grep rules to workspace crates before compilation.

It intercepts rustc invocations via RUSTC_WORKSPACE_WRAPPER, copies crate sources to target/cargo-stitch/<pkg>/, applies patches and ast-grep rules from stitches/<pkg>/, then compiles the patched sources.

Install

Using cargo binstall (recommended, downloads prebuilt binaries):

cargo binstall cargo-stitch

Using cargo install (builds from source):

cargo install cargo-stitch

From GitHub Releases: download a prebuilt binary for your platform, extract, and place it on your PATH.

From source:

git clone https://github.com/romac/cargo-stitch
cd cargo-stitch
cargo install --path .

Requires patch (usually preinstalled) and ast-grep (sg) if using ast-grep rules.

Usage

cargo stitch build
cargo stitch test
cargo stitch check
# any cargo subcommand works

Stitch files

Place stitch files in stitches/<crate-name>/ at the workspace root:

  • .patch -- unified diff format, applied with patch -p1
  • .yaml / .yml -- ast-grep rule files, applied with sg scan -r <rule> --update-all

All stitch files are applied in filename order regardless of type. Use numeric prefixes for ordering:

stitches/
  some-crate/
    001-fix-thing.patch
    002-rename-fn.yaml

If no stitches/<crate-name>/ directory exists for a crate, it compiles normally.

Acknowledgements

Inspired by cargo-fixup.

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Dependencies

~0.8–1.7MB
~34K SLoC