192 Commits
Author SHA1 Message Date
Pierre Warnier beef0b0a88 chore: release 0.2.2 (#230)
First release to ship prebuilt binaries, and the first to carry a
working passwd in them: 0.2.1 and earlier had no assets at all, and the
archive the new pipeline first produced was built without PAM.

Closes #221.
0.2.2
2026-09-03 13:38:23 +02:00
Pierre Warnier beb22f64ae docs: correct the stated reason musl is not published (#229)
The README and the dist config both claimed musl is unavailable because
crypt(3) is not part of the static musl target. That is wrong: musl
implements crypt() inside libc —

    $ nm .../x86_64-unknown-linux-musl/.../libc.a | grep ' T crypt'
    0000000000000000 T crypt

The link failure comes from `#[link(name = "crypt")]` emitting -lcrypt,
which finds no libcrypt.a in Rust's musl sysroot and falls through to the
host's glibc libxcrypt. Gating that attribute on the target env is enough
to produce a working static binary.

The genuine blocker is PAM: it dlopens its modules, which a fully static
binary cannot do, so a musl artifact would ship without interactive
password changes. State that instead, and point at #224.
2026-09-03 13:28:34 +02:00
Pierre Warnier 300adb0df2 ci: stop Renovate editing the generated release workflow (#227)
release.yml is produced by dist from dist-workspace.toml, and the 'plan'
job checks the two agree. Renovate has been bumping action and runner
versions directly in that file, which makes every such PR fail:

    release.yml has out of date contents and needs to be regenerated
    help: run 'dist init' to update the file

Both open Renovate PRs (#217, #218) touch only that file and cannot be
merged as-is. Versions in it move by upgrading cargo-dist-version and
regenerating, so exclude the path from Renovate.
2026-09-03 13:20:40 +02:00
Pierre Warnier 3de8b506ac build: ship binaries with PAM so passwd can change passwords (#220) (#225)
`pam` is not a default cargo feature, so every build path except the e2e
image compiled the interactive change path out of `passwd`. The tool
could report and lock accounts but not change a password:

    $ passwd alice
    shadow-rs: PAM support is not compiled in — cannot change password
    interactively

That covered the release archive, `make install` (the default install of
14 standalone binaries) and `make install-multicall`. Only the e2e image
passed --features pam, and its assertions stop at `passwd -S`, which
works without PAM — hence nobody noticed.

Enable the feature in the release build and in both Makefile targets, and
install libpam0g-dev on the release runner. The PAM headers are already a
documented build requirement.

Add an e2e assertion that the installed passwd is linked against libpam,
so this cannot regress silently again.

Closes #220.
2026-09-03 13:16:46 +02:00
Pierre Warnier 90faf4cc86 ci: reject AI tooling artifacts in pull requests (#219)
* ci: reject AI tooling artifacts in pull requests

The project's public face carries no AI tooling attribution, but nothing
enforced it: a session trailer reached a merged commit message and a pull
request body before anyone noticed.

Add a check that runs on pull requests and inspects only what the PR
changes — commit messages, PR title and body, added lines, and any
attempt to track the local-only guidance and review-export files that
are meant to stay gitignored. History is untouched and unrelated files
are not scanned. The clean-room audit records are exempt: they must
describe their own methodology to serve as compliance evidence.

Also drop the tooling credits from README and CHANGELOG.

* ci: fix base-ref fetch in the artifact check

`--depth=0` is rejected by git, and the extra fetch was redundant with
the full-history checkout. Fetch the base branch plainly and diff against
FETCH_HEAD.
2026-09-03 12:06:56 +02:00
Pierre Warnier a5c5e816ea ci: publish release binaries with dist (#207) (#216)
Releases carried no binaries (v0.2.1 shipped zero assets). Add dist
(formerly cargo-dist) 0.32.0 to build and upload them on tag push.

Scope: only the workspace root package is distributed, producing the
single shadow-rs multicall binary that provides all 14 tools via argv[0]
— the same layout as `make install-multicall`. The 14 per-tool crates
carry `dist = false` so a release is one archive per target rather than
fifteen. `[dist.binaries]` pins the archive to `shadow-rs`, keeping the
feature-gated `shadow-rs-completions` helper out of it.

Targets are glibc-only for now: shadow-core::crypt links crypt(3) via
`#[link(name = "crypt")]`, and the self-contained musl target provides
no libcrypt, so an x86_64-unknown-linux-musl cross-build fails at link
time. (Alpine CI passes only because it installs a system libcrypt.)
`[dist.dependencies.apt]` installs libcrypt-dev on the runner for the
same reason.

`[profile.dist]` inherits the hardened release profile, so published
binaries keep LTO, stripped symbols and panic = "abort".

README documents deploying the archive (symlinks + setuid) and why musl
is not published yet.

Verified locally: `dist plan` and `dist build --artifacts=local` produce
uu_shadow-x86_64-unknown-linux-gnu.tar.gz containing shadow-rs plus
README/CHANGELOG/LICENSE and a .sha256; the extracted binary reports
`shadow-rs (uutils shadow-rs) 0.2.1`.

Closes #207.

Claude-Session: https://claude.ai/code/session_011f42R6SMAfQXufTgdjSuhU
2026-09-03 11:54:24 +02:00
renovate[bot] bada8f7d46 chore(deps): update rust crate uucore to 0.11 2026-09-01 15:58:33 +02:00
xtqqczze e374d7a141 chore(deps): update rust crates 2026-08-21 10:08:16 +02:00
renovate[bot] c76db40af1 chore(deps): update rust crate clap_complete to v4.6.9 2026-08-12 08:11:19 +02:00
xtqqczze cda2031d70 chore(cargo): remove deprecated package authors field 2026-08-11 09:48:03 +02:00
renovate[bot] cfb1bbe236 chore(deps): update rust crate thiserror to v2.0.20 2026-08-08 13:06:15 +02:00
renovate[bot] 6da5b8d2d7 chore(deps): update rust crate clap to v4.6.6 2026-08-07 09:49:16 +02:00
renovate[bot] 5e6a681c52 chore(deps): update rust crate uucore to 0.10 2026-08-06 08:13:45 +02:00
Sylvestre Ledru 0f4bc97ce0 prepare version 0.2.1 v0.2.1 2026-08-05 23:09:22 +02:00
Sylvestre Ledru 96a709fce3 prepare version 0.2.1 2026-08-05 22:59:23 +02:00
Sylvestre Ledru a8c520af8d Merge pull request #205 from sylvestre/foo
cargo: rename package to uu_shadow. shadow-rs is already used
2026-08-05 22:57:44 +02:00
Sylvestre Ledru 2f14db1bdd Merge pull request #206 from uutils/fix/cargo-publish-shadow-core-version
fix: add version to shadow-core workspace dependencies for cargo publish
2026-08-05 22:57:33 +02:00
Sylvestre Ledru a3b9e1fc63 fix: add version to shadow-core workspace dependencies for cargo publish
Without a version field, `cargo publish` fails for all crates that
depend on shadow-core:

  all dependencies must have a version requirement specified when publishing.
  dependency `shadow-core` does not specify a version

Add version = "0.2.0" to all three shadow-core dependency declarations
in Cargo.toml (workspace.dependencies, [dependencies], and dev-dependencies)
to allow `cargo publish` to work correctly.
2026-08-05 20:18:34 +02:00
Sylvestre Ledru cb8ce5ebd2 cargo: rename package to uu_shadow. shadow-rs is already used
https://crates.io/crates/uu_grep is a precedent
2026-08-02 21:31:25 +02:00
Sylvestre Ledru 7ed1cdf3e8 Merge pull request #171 from uutils/feat/159-os-sourced-error-messages
tools: source the "Permission denied" message from the OS (#159)
2026-08-02 19:30:29 +02:00
renovate[bot] 615c6895ef chore(deps): update rust crate clap to v4.6.5 2026-08-01 07:07:14 +02:00
renovate[bot] 641f4772a2 chore(deps): update rust crate landlock to v0.4.7 2026-07-28 08:02:03 +02:00
renovate[bot] 14fecfc98e chore(deps): update rust crate clap_complete to v4.6.8 2026-07-28 07:59:10 +02:00
Pierre Warnier 750c9bc0d5 deps: update clap to 4.6.4 (with syn 3.0.3) (#201)
Renovate's single-package update (#198) could not land this: clap_derive
4.6.4 requires syn >=3.0.2 while the lockfile pinned syn 3.0.0 (via
thiserror-impl), so the conservative 'cargo update -p clap --precise'
had no solvable resolution. Update both together (clap 4.6.3 -> 4.6.4,
syn 3.0.0 -> 3.0.3). cargo deny check passes with the syn skip added in
#194.
2026-07-27 13:58:06 +02:00
Daniel Hofstetter a31ffacc2f Bump thiserror & adapt deny.toml (#194)
* Bump thiserror from 2.0.18 to 2.0.19

* deny.toml: add syn to skip list

* deny.toml: remove windows-sys from skip list
2026-07-27 13:39:58 +02:00