Fix formatting drift after rename, and document git-init requirement

Found via an end-to-end test of nix flake init -> rename -> nix flake
check: renaming can reorder `use` statements alphabetically (e.g.
"acme_widget" now sorts before "criterion"), and treefmt's rustfmt
(nixpkgs) disagreed with cargo fmt's rustfmt (fenix toolchain) on
edition-2024 import grouping, so the formatting check failed right
after a clean rename.

- nix/treefmt.nix: pin programs.rustfmt.edition = "2024" to match
  Cargo.toml, so treefmt and cargo fmt agree.
- scripts/rename-project.sh: auto-format (cargo fmt, falling back to
  nix fmt) after renaming, and note that nix commands need git-tracked
  files.
- README.md/CLAUDE.md: document that `nix flake init -t` doesn't
  git-init for you, and every nix command needs `git add` first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018ALEXkc7pTro7tF1WcUuKb
This commit is contained in:
2026-08-11 01:06:58 +08:00
parent c7303154cc
commit f07e0c08c8
4 changed files with 33 additions and 6 deletions
+7 -3
View File
@@ -96,9 +96,13 @@ install, so the LSP sees the same compiler version as the build.
`scripts/rename-project.sh <new_snake_case_name>` replaces every `rust_template` occurrence `scripts/rename-project.sh <new_snake_case_name>` replaces every `rust_template` occurrence
(crate name in `Cargo.toml`, the `pname`/binary name in `nix/rust.nix` and `flake.nix`, and the (crate name in `Cargo.toml`, the `pname`/binary name in `nix/rust.nix` and `flake.nix`, and the
`use rust_template::...` imports in `src/main.rs`, `tests/greet.rs`, `benches/greet.rs`), then `use rust_template::...` imports in `src/main.rs`, `tests/greet.rs`, `benches/greet.rs`), then
regenerates `Cargo.lock`. It does not rename the project directory itself — that's a manual `mv` regenerates `Cargo.lock` and reformats (`cargo fmt`/`nix fmt`) — the rename can flip `use`
afterward (the script prints the exact command). Run `nix flake check` after renaming to confirm statements out of alphabetical order (e.g. renaming to something that sorts before `criterion`),
everything still resolves. which would otherwise fail the `treefmt` check on the next `nix flake check`. It does not rename
the project directory itself — that's a manual `mv` afterward (the script prints the exact
command). If the tree isn't git-tracked yet (e.g. straight after `nix flake init -t`), run
`git add -A` before *any* `nix` command, including the rename script's own `nix fmt` fallback —
flakes only see git-tracked files.
## Keeping this file current ## Keeping this file current
+6 -3
View File
@@ -6,13 +6,16 @@ way with plain `cargo` or with `nix`.
## Using this template ## Using this template
1. Copy/clone this repo (or, once published, `nix flake init -t <this-repo-url>`). 1. Copy/clone this repo, or scaffold fresh with `nix flake init -t <this-repo-url>`.
2. Rename the placeholder crate name: 2. If you used `nix flake init` (no `.git` yet), run `git init && git add -A`
Nix flakes only see git-tracked files, so every `nix` command below needs this first.
3. Rename the placeholder crate name:
```bash ```bash
./scripts/rename-project.sh my_project ./scripts/rename-project.sh my_project
cd .. && mv rust_template my_project && cd my_project cd .. && mv rust_template my_project && cd my_project
git add -A # stage the rename before running any nix command again
``` ```
3. Build whatever you actually came here for — replace `greet` in `src/lib.rs`, extend the CLI in 4. Build whatever you actually came here for — replace `greet` in `src/lib.rs`, extend the CLI in
`src/main.rs`, add your own tests and benchmarks. `src/main.rs`, add your own tests and benchmarks.
## Building and running ## Building and running
+5
View File
@@ -4,7 +4,12 @@ _: {
treefmt = { treefmt = {
projectRootFile = "flake.nix"; projectRootFile = "flake.nix";
# Edition must match Cargo.toml's `edition = "2024"` — otherwise
# treefmt's rustfmt (from nixpkgs) and `cargo fmt`'s rustfmt (from the
# fenix toolchain, which reads the edition from Cargo.toml) disagree
# on import ordering/grouping and fight each other.
programs.rustfmt.enable = true; programs.rustfmt.enable = true;
programs.rustfmt.edition = "2024";
programs.nixfmt.enable = true; programs.nixfmt.enable = true;
programs.deadnix.enable = true; programs.deadnix.enable = true;
programs.statix.enable = true; programs.statix.enable = true;
+15
View File
@@ -48,7 +48,22 @@ else
echo "warning: cargo not on PATH — run 'cargo generate-lockfile' yourself (e.g. inside 'nix develop')" >&2 echo "warning: cargo not on PATH — run 'cargo generate-lockfile' yourself (e.g. inside 'nix develop')" >&2
fi fi
# Renaming can reorder `use` statements alphabetically (e.g. "acme_widget"
# now sorts before "criterion"), which rustfmt/treefmt will otherwise flag
# as unformatted on the next check. Reformat immediately so the tree is
# clean right after renaming.
if command -v cargo >/dev/null 2>&1 && cargo fmt --version >/dev/null 2>&1; then
cargo fmt
elif command -v nix >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
nix fmt >/dev/null 2>&1 || echo "warning: 'nix fmt' failed — run it yourself once files are committed" >&2
else
echo "warning: could not auto-format — run 'cargo fmt' or 'nix fmt' yourself" >&2
fi
echo "Renamed '${old_name}' -> '${new_name}'." echo "Renamed '${old_name}' -> '${new_name}'."
echo echo
echo "Review the diff (git diff), then optionally rename the project directory:" echo "Review the diff (git diff), then optionally rename the project directory:"
echo " cd .. && mv $(basename "$root") ${new_name}" echo " cd .. && mv $(basename "$root") ${new_name}"
echo
echo "If this tree isn't committed to git yet, run 'git add -A' before any"
echo "'nix' command — Nix flakes only see git-tracked files."