Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package watchexec for openSUSE:Factory checked in at 2026-05-04 14:24:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/watchexec (Old) and /work/SRC/openSUSE:Factory/.watchexec.new.30200 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "watchexec" Mon May 4 14:24:48 2026 rev:15 rq:1350637 version:2.5.1 Changes: -------- --- /work/SRC/openSUSE:Factory/watchexec/watchexec.changes 2026-03-14 22:22:44.697999904 +0100 +++ /work/SRC/openSUSE:Factory/.watchexec.new.30200/watchexec.changes 2026-05-04 14:24:53.171950566 +0200 @@ -1,0 +2,14 @@ +Fri Apr 24 20:14:01 UTC 2026 - Dirk Müller <[email protected]> + +- update to 2.5.1: + * chore: Release + * add a bunch of new archs as experimental builds + * ci: add riscv64 to release cross-build targets (#1039) + * chore: Release + * update changelog + * feat(supervisor): add SpawnFn to allow custom process spawning (#1013) + * Update README.md + * chore: Release + * deps: update lockfile + +------------------------------------------------------------------- Old: ---- cargo_config watchexec-2.5.0.tar.xz New: ---- _servicedata watchexec-2.5.1.tar.xz watchexec.obsinfo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ watchexec.spec ++++++ --- /var/tmp/diff_new_pack.i1W8kF/_old 2026-05-04 14:24:54.760016117 +0200 +++ /var/tmp/diff_new_pack.i1W8kF/_new 2026-05-04 14:24:54.760016117 +0200 @@ -17,7 +17,7 @@ Name: watchexec -Version: 2.5.0 +Version: 2.5.1 Release: 0 Summary: Watches a path and runs a command whenever it detects modifications. License: Apache-2.0 @@ -25,7 +25,6 @@ URL: https://github.com/watchexec/watchexec Source0: %{name}-%{version}.tar.xz Source1: vendor.tar.xz -Source2: cargo_config BuildRequires: cargo-packaging %description @@ -34,8 +33,6 @@ %prep %autosetup -a1 -mkdir -p .cargo -cp %{SOURCE2} .cargo/config %build %{cargo_build} ++++++ _service ++++++ --- /var/tmp/diff_new_pack.i1W8kF/_old 2026-05-04 14:24:54.816018429 +0200 +++ /var/tmp/diff_new_pack.i1W8kF/_new 2026-05-04 14:24:54.820018595 +0200 @@ -1,27 +1,26 @@ <services> - <service mode="disabled" name="obs_scm"> + <service mode="manual" name="tar_scm"> <param name="url">https://github.com/watchexec/watchexec.git</param> <param name="versionformat">@PARENT_TAG@</param> <param name="scm">git</param> - <param name="revision">v2.5.0</param> + <param name="revision">v2.5.1</param> <param name="match-tag">*</param> <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param> <param name="versionrewrite-replacement">\1</param> <param name="changesgenerate">enable</param> - <param name="changesauthor">[email protected]</param> </service> - <service mode="disabled" name="tar" /> - <service mode="disabled" name="recompress"> + <service mode="manual" name="tar" /> + <service mode="manual" name="recompress"> <param name="file">*.tar</param> <param name="compression">xz</param> </service> - <service mode="disabled" name="set_version"/> - <service name="cargo_vendor" mode="disabled"> + <service mode="manual" name="set_version"/> + <service name="cargo_vendor" mode="manual"> <param name="srcdir">watchexec</param> <param name="compression">xz</param> <param name="update">true</param> </service> - <service name="cargo_audit" mode="disabled"> + <service name="cargo_audit" mode="manual"> <param name="srcdir">watchexec</param> </service> </services> ++++++ _servicedata ++++++ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/watchexec/watchexec.git</param> <param name="changesrevision">9b7fed6a52c7586815864fe5c5bd1b6b5e5cec37</param></service></servicedata> (No newline at EOF) ++++++ vendor.tar.xz ++++++ /work/SRC/openSUSE:Factory/watchexec/vendor.tar.xz /work/SRC/openSUSE:Factory/.watchexec.new.30200/vendor.tar.xz differ: char 15, line 1 ++++++ watchexec-2.5.0.tar.xz -> watchexec-2.5.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/.github/workflows/release-cli.yml new/watchexec-2.5.1/.github/workflows/release-cli.yml --- old/watchexec-2.5.0/.github/workflows/release-cli.yml 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/.github/workflows/release-cli.yml 2026-03-30 08:23:47.000000000 +0200 @@ -77,13 +77,37 @@ os: ubuntu-24.04 target: s390x-unknown-linux-gnu cross: true - experimental: false + experimental: true + + - name: linux-riscv64gc-gnu + os: ubuntu-24.04 + target: riscv64gc-unknown-linux-gnu + cross: true + experimental: true - name: linux-ppc64le-gnu os: ubuntu-24.04 target: powerpc64le-unknown-linux-gnu cross: true - experimental: false + experimental: true + + - name: illumos-x86-64 + os: ubuntu-24.04 + target: x86_64-unknown-illumos + cross: true + experimental: true + + - name: freebsd-x86-64 + os: ubuntu-24.04 + target: x86_64-unknown-freebsd + cross: true + experimental: true + + - name: linux-loongarch64-gnu + os: ubuntu-24.04 + target: loongarch64-unknown-linux-gnu + cross: true + experimental: true - name: mac-x86-64 os: macos-14 @@ -143,6 +167,9 @@ - name: Add s390x-gnu tools run: sudo apt install -y gcc-s390x-linux-gnu if: startsWith(matrix.target, 's390x-unknown-linux-gnu') + - name: Add riscv64-gnu tools + run: sudo apt install -y gcc-riscv64-linux-gnu + if: startsWith(matrix.target, 'riscv64gc-unknown-linux-gnu') - name: Add ppc64le-gnu tools run: sudo apt install -y gcc-powerpc64le-linux-gnu if: startsWith(matrix.target, 'powerpc64le-unknown-linux-gnu') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/CITATION.cff new/watchexec-2.5.1/CITATION.cff --- old/watchexec-2.5.0/CITATION.cff 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/CITATION.cff 2026-03-30 08:23:47.000000000 +0200 @@ -3,8 +3,8 @@ If you use this software, please cite it using these metadata. title: "Watchexec: a tool to react to filesystem changes, and a crate ecosystem to power it" -version: "2.5.0" -date-released: 2026-02-25 +version: "2.5.1" +date-released: 2026-03-30 repository-code: https://github.com/watchexec/watchexec license: Apache-2.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/Cargo.lock new/watchexec-2.5.1/Cargo.lock --- old/watchexec-2.5.0/Cargo.lock 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/Cargo.lock 2026-03-30 08:23:47.000000000 +0200 @@ -604,7 +604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5def4343d62f01f67ff1a49147e4a15112e936c6a6a3f8ff7a29394e76468244" dependencies = [ - "nix 0.31.1", + "nix 0.31.2", "terminfo", "thiserror 2.0.18", "which", @@ -796,9 +796,9 @@ [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags 2.11.0", "objc2", @@ -1786,9 +1786,9 @@ [[package]] name = "jiff" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e3d65f018c6ae946ab16e80944b97096ed73c35b221d1c478a6c81d8f57940" +checksum = "819b44bc7c87d9117eb522f14d46e918add69ff12713c475946b0a29363ed1c2" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -1801,9 +1801,9 @@ [[package]] name = "jiff-static" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17c2b211d863c7fde02cbea8a3c1a439b98e109286554f2860bdded7ff83818" +checksum = "470252db18ecc35fd766c0891b1e3ec6cbbcd62507e85276c01bf75d8e94d4a1" dependencies = [ "proc-macro2", "quote", @@ -1827,9 +1827,9 @@ [[package]] name = "js-sys" -version = "0.3.89" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4eacb0641a310445a4c513f2a5e23e19952e269c6a38887254d5f837a305506" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -1869,9 +1869,9 @@ [[package]] name = "libc" -version = "0.2.180" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libm" @@ -1891,11 +1891,10 @@ [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ - "bitflags 2.11.0", "libc", ] @@ -1907,9 +1906,9 @@ [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "listenfd" @@ -2097,9 +2096,9 @@ [[package]] name = "nix" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225e7cfe711e0ba79a68baeddb2982723e4235247aefce1482f2f16c27865b66" +checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" dependencies = [ "bitflags 2.11.0", "cfg-if", @@ -2207,9 +2206,9 @@ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -2398,18 +2397,18 @@ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", @@ -2418,9 +2417,9 @@ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -2430,9 +2429,9 @@ [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", @@ -2529,13 +2528,13 @@ [[package]] name = "process-wrap" -version = "9.0.3" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd9713fe2c91c3c85ac388b31b89de339365d2c995146e630b5e0da9d06526a" +checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" dependencies = [ "futures", "indexmap", - "nix 0.31.1", + "nix 0.31.2", "tokio", "tracing", "windows 0.62.2", @@ -2740,9 +2739,9 @@ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "roff" @@ -2767,14 +2766,14 @@ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags 2.11.0", "errno", "libc", - "linux-raw-sys 0.11.0", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] @@ -3083,9 +3082,9 @@ [[package]] name = "tempfile" -version = "3.25.0" +version = "3.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" dependencies = [ "fastrand", "getrandom 0.4.1", @@ -3711,9 +3710,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d7d0fce354c88b7982aec4400b3e7fcf723c32737cef571bd165f7613557ee" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -3724,9 +3723,9 @@ [[package]] name = "wasm-bindgen-macro" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55839b71ba921e4f75b674cb16f843f4b1f3b26ddfcb3454de1cf65cc021ec0f" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3734,9 +3733,9 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf2e969c2d60ff52e7e98b7392ff1588bffdd1ccd4769eba27222fd3d621571" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", @@ -3747,9 +3746,9 @@ [[package]] name = "wasm-bindgen-shared" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0861f0dcdf46ea819407495634953cdcc8a8c7215ab799a7a7ce366be71c7b30" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -3790,7 +3789,7 @@ [[package]] name = "watchexec" -version = "8.1.2" +version = "8.2.0" dependencies = [ "async-priority-channel", "atomic-take", @@ -3812,7 +3811,7 @@ [[package]] name = "watchexec-cli" -version = "2.5.0" +version = "2.5.1" dependencies = [ "argfile", "blake3", @@ -3917,7 +3916,7 @@ [[package]] name = "watchexec-supervisor" -version = "5.1.0" +version = "5.2.0" dependencies = [ "boxcar", "futures", @@ -4511,18 +4510,18 @@ [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" dependencies = [ "proc-macro2", "quote", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/README.md new/watchexec-2.5.1/README.md --- old/watchexec-2.5.0/README.md 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/README.md 2026-03-30 08:23:47.000000000 +0200 @@ -79,6 +79,7 @@ - [cargo watch](https://github.com/watchexec/cargo-watch): a specialised watcher for Rust/Cargo projects. - [cargo lambda](https://github.com/cargo-lambda/cargo-lambda): a dev tool for Rust-powered AWS Lambda functions. - [create-rust-app](https://create-rust-app.dev): a template for Rust+React web apps. +- [devenv.sh](https://github.com/cachix/devenv): a developer environment with nix-based declarative configs. - [dotter](https://github.com/supercuber/dotter): a dotfile manager. - [ghciwatch](https://github.com/mercurytechnologies/ghciwatch): a specialised watcher for Haskell projects. - [tectonic](https://tectonic-typesetting.github.io/book/latest/): a TeX/LaTeX typesetting system. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/cli/Cargo.toml new/watchexec-2.5.1/crates/cli/Cargo.toml --- old/watchexec-2.5.0/crates/cli/Cargo.toml 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/cli/Cargo.toml 2026-03-30 08:23:47.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "watchexec-cli" -version = "2.5.0" +version = "2.5.1" authors = ["Félix Saparelli <[email protected]>", "Matt Green <[email protected]>"] license = "Apache-2.0" @@ -81,7 +81,7 @@ path = "../project-origins" [dependencies.watchexec] -version = "8.1.2" +version = "8.2.0" path = "../lib" [dependencies.watchexec-events] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/cli/watchexec.exe.manifest new/watchexec-2.5.1/crates/cli/watchexec.exe.manifest --- old/watchexec-2.5.0/crates/cli/watchexec.exe.manifest 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/cli/watchexec.exe.manifest 2026-03-30 08:23:47.000000000 +0200 @@ -3,7 +3,7 @@ <assemblyIdentity type="win32" name="Watchexec.Cli.watchexec" - version="2.5.0.0" + version="2.5.1.0" /> <trustInfo> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/filterer/globset/Cargo.toml new/watchexec-2.5.1/crates/filterer/globset/Cargo.toml --- old/watchexec-2.5.0/crates/filterer/globset/Cargo.toml 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/filterer/globset/Cargo.toml 2026-03-30 08:23:47.000000000 +0200 @@ -24,7 +24,7 @@ path = "../../ignore-files" [dependencies.watchexec] -version = "8.1.2" +version = "8.2.0" path = "../../lib" [dependencies.watchexec-events] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/filterer/ignore/Cargo.toml new/watchexec-2.5.1/crates/filterer/ignore/Cargo.toml --- old/watchexec-2.5.0/crates/filterer/ignore/Cargo.toml 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/filterer/ignore/Cargo.toml 2026-03-30 08:23:47.000000000 +0200 @@ -26,7 +26,7 @@ path = "../../ignore-files" [dependencies.watchexec] -version = "8.1.2" +version = "8.2.0" path = "../../lib" [dependencies.watchexec-events] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/lib/CHANGELOG.md new/watchexec-2.5.1/crates/lib/CHANGELOG.md --- old/watchexec-2.5.0/crates/lib/CHANGELOG.md 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/lib/CHANGELOG.md 2026-03-30 08:23:47.000000000 +0200 @@ -2,6 +2,10 @@ ## Next (YYYY-MM-DD) +## v8.2.0 (2026-03-02) + +- Feat: add `fs_ready` signal for watcher readiness ([#1024](https://github.com/watchexec/watchexec/pull/1024)) + ## v8.1.2 (2026-02-24) ## v8.1.1 (2026-02-22) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/lib/Cargo.toml new/watchexec-2.5.1/crates/lib/Cargo.toml --- old/watchexec-2.5.0/crates/lib/Cargo.toml 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/lib/Cargo.toml 2026-03-30 08:23:47.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "watchexec" -version = "8.1.2" +version = "8.2.0" authors = ["Félix Saparelli <[email protected]>", "Matt Green <[email protected]>"] license = "Apache-2.0" @@ -33,7 +33,7 @@ path = "../signals" [dependencies.watchexec-supervisor] -version = "5.1.0" +version = "5.2.0" path = "../supervisor" [dependencies.tokio] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/lib/src/config.rs new/watchexec-2.5.1/crates/lib/src/config.rs --- old/watchexec-2.5.0/crates/lib/src/config.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/lib/src/config.rs 2026-03-30 08:23:47.000000000 +0200 @@ -2,7 +2,7 @@ use std::{future::Future, pin::pin, sync::Arc, time::Duration}; -use tokio::sync::Notify; +use tokio::sync::{watch, Notify}; use tracing::{debug, trace}; use crate::{ @@ -154,6 +154,11 @@ /// /// This is unchangeable at runtime and must be set before Watchexec instantiation. pub event_channel_size: usize, + + /// Signalled by the filesystem worker after it finishes applying a pathset change + /// (registering/unregistering OS watches). Subscribe via [`Config::fs_ready()`] **before** + /// calling [`Config::pathset()`] to avoid missing the notification. + pub(crate) fs_ready: watch::Sender<()>, } impl Default for Config { @@ -169,6 +174,7 @@ filterer: Default::default(), error_channel_size: 64, event_channel_size: 4096, + fs_ready: watch::channel(()).0, } } } @@ -196,6 +202,17 @@ ConfigWatched::new(self.change_signal.clone()) } + /// Subscribe to filesystem worker readiness notifications. + /// + /// Returns a [`watch::Receiver`] that is notified each time the filesystem worker finishes + /// applying a pathset change (i.e. OS watches are registered/unregistered). Signals readiness + /// even if some paths failed to register; check the error handler for failures. To avoid + /// missing a notification, subscribe **before** calling [`Config::pathset()`], then + /// `.changed().await`. + pub fn fs_ready(&self) -> watch::Receiver<()> { + self.fs_ready.subscribe() + } + /// Set the pathset to be watched. pub fn pathset<I, P>(&self, pathset: I) -> &Self where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/lib/src/sources/fs.rs new/watchexec-2.5.1/crates/lib/src/sources/fs.rs --- old/watchexec-2.5.0/crates/lib/src/sources/fs.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/lib/src/sources/fs.rs 2026-03-30 08:23:47.000000000 +0200 @@ -132,6 +132,7 @@ ); watcher.take(); pathset.clear(); + let _ = config.fs_ready.send(()); continue; } @@ -217,6 +218,8 @@ pathset.insert(path); } } + + let _ = config.fs_ready.send(()); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/CHANGELOG.md new/watchexec-2.5.1/crates/supervisor/CHANGELOG.md --- old/watchexec-2.5.0/crates/supervisor/CHANGELOG.md 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/CHANGELOG.md 2026-03-30 08:23:47.000000000 +0200 @@ -2,6 +2,10 @@ ## Next (YYYY-MM-DD) +## v5.2.0 (2026-03-09) + +- Add the ability to use `spawn_with` from process-wrap (#1013) + ## v5.1.0 (2026-02-22) - Add `is_running()` and clarify what `is_dead()` is measuring diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/Cargo.toml new/watchexec-2.5.1/crates/supervisor/Cargo.toml --- old/watchexec-2.5.0/crates/supervisor/Cargo.toml 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/Cargo.toml 2026-03-30 08:23:47.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "watchexec-supervisor" -version = "5.1.0" +version = "5.2.0" authors = ["Félix Saparelli <[email protected]>"] license = "Apache-2.0 OR MIT" @@ -19,7 +19,7 @@ tracing = "0.1.40" [dependencies.process-wrap] -version = "9.0.1" +version = "9.1.0" features = ["reset-sigmask", "tokio1"] [dependencies.tokio] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/src/job/job.rs new/watchexec-2.5.1/crates/supervisor/src/job/job.rs --- old/watchexec-2.5.0/crates/supervisor/src/job/job.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/src/job/job.rs 2026-03-30 08:23:47.000000000 +0200 @@ -349,6 +349,32 @@ self.control(Control::UnsetSpawnHook) } + /// Set the spawn function. + /// + /// When set, this function is passed to + /// [`CommandWrap::spawn_with()`](process_wrap::tokio::CommandWrap::spawn_with) instead of + /// using the default [`CommandWrap::spawn()`]. It receives a `&mut tokio::process::Command` + /// and must return the spawned [`tokio::process::Child`]. + /// + /// All process-wrap layers are still applied around the child, so this only customises the + /// low-level spawn step. This is useful for delegating process spawning to a privileged + /// helper (e.g. for Linux capability granting) while keeping the supervisor's lifecycle + /// management. + pub fn set_spawn_fn( + &self, + fun: impl Fn(&mut tokio::process::Command) -> std::io::Result<tokio::process::Child> + + Send + + Sync + + 'static, + ) -> Ticket { + self.control(Control::SetSpawnFn(Arc::new(fun))) + } + + /// Unset any spawn function, reverting to the default `CommandWrap::spawn()`. + pub fn unset_spawn_fn(&self) -> Ticket { + self.control(Control::ClearSpawnFn) + } + /// Set the error handler. pub fn set_error_handler(&self, fun: impl Fn(SyncIoError) + Send + Sync + 'static) -> Ticket { self.control(Control::SetSyncErrorHandler(Arc::new(fun))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/src/job/messages.rs new/watchexec-2.5.1/crates/supervisor/src/job/messages.rs --- old/watchexec-2.5.0/crates/supervisor/src/job/messages.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/src/job/messages.rs 2026-03-30 08:23:47.000000000 +0200 @@ -12,6 +12,7 @@ use super::task::{ AsyncErrorHandler, AsyncFunc, AsyncSpawnHook, SyncErrorHandler, SyncFunc, SyncSpawnHook, + SpawnFn, }; /// The underlying control message types for [`Job`](super::Job). @@ -66,6 +67,11 @@ SetAsyncErrorHandler(AsyncErrorHandler), /// For [`Job::unset_error_handler()`](super::Job::unset_error_handler()). UnsetErrorHandler, + + /// For [`Job::set_spawn_fn()`](super::Job::set_spawn_fn()). + SetSpawnFn(SpawnFn), + /// For [`Job::unset_spawn_fn()`](super::Job::unset_spawn_fn()). + ClearSpawnFn, } impl std::fmt::Debug for Control { @@ -107,6 +113,8 @@ .debug_struct("SetAsyncErrorHandler") .finish_non_exhaustive(), Self::UnsetErrorHandler => f.debug_struct("UnsetErrorHandler").finish(), + Self::SetSpawnFn(_) => f.debug_struct("SetSpawnFn").finish_non_exhaustive(), + Self::ClearSpawnFn => f.debug_struct("ClearSpawnFn").finish(), } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/src/job/state.rs new/watchexec-2.5.1/crates/supervisor/src/job/state.rs --- old/watchexec-2.5.0/crates/supervisor/src/job/state.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/src/job/state.rs 2026-03-30 08:23:47.000000000 +0200 @@ -7,6 +7,7 @@ use watchexec_events::ProcessEnd; use crate::command::Command; +use super::task::SpawnFn; /// The state of the job's command / process. /// @@ -76,6 +77,7 @@ &mut self, command: Arc<Command>, mut spawnable: CommandWrap, + spawn_fn: Option<&SpawnFn>, ) -> std::io::Result<bool> { if let Self::Running { .. } = self { trace!("command running, not spawning again"); @@ -88,7 +90,11 @@ let child = super::TestChild::new(command)?; #[cfg(not(test))] - let child = spawnable.spawn()?; + let child = if let Some(f) = spawn_fn { + spawnable.spawn_with(|cmd| f(cmd))? + } else { + spawnable.spawn()? + }; *self = Self::Running { child, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/src/job/task.rs new/watchexec-2.5.1/crates/supervisor/src/job/task.rs --- old/watchexec-2.5.0/crates/supervisor/src/job/task.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/src/job/task.rs 2026-03-30 08:23:47.000000000 +0200 @@ -55,6 +55,7 @@ tokio::spawn(async move { let mut error_handler = ErrorHandler::None; let mut spawn_hook = SpawnHook::None; + let mut spawn_fn: Option<SpawnFn> = None; let mut command_state = CommandState::Pending; let mut previous_run = None; let mut stop_timer = None; @@ -100,7 +101,7 @@ }, ) .await; - if let Err(err) = command_state.spawn(command.clone(), spawnable) { + if let Err(err) = command_state.spawn(command.clone(), spawnable, spawn_fn.as_ref()) { let fut = error_handler.call(sync_io_error(err)); fut.await; return Loop::Skip; @@ -165,7 +166,7 @@ }, ) .await; - try_with_handler!(command_state.spawn(command.clone(), spawnable)); + try_with_handler!(command_state.spawn(command.clone(), spawnable, spawn_fn.as_ref())); } } Control::Stop => { @@ -231,7 +232,7 @@ }, ) .await; - try_with_handler!(command_state.spawn(command.clone(), spawnable)); + try_with_handler!(command_state.spawn(command.clone(), spawnable, spawn_fn.as_ref())); } else { trace!("child isn't running, skip"); } @@ -282,7 +283,7 @@ }, ) .await; - try_with_handler!(command_state.spawn(command.clone(), spawnable)); + try_with_handler!(command_state.spawn(command.clone(), spawnable, spawn_fn.as_ref())); } Control::Signal(signal) => { if let CommandState::Running { child, .. } = &mut command_state { @@ -348,6 +349,14 @@ trace!("unsetting spawn hook"); spawn_hook = SpawnHook::None; } + Control::SetSpawnFn(f) => { + trace!("setting spawn fn"); + spawn_fn = Some(f); + } + Control::ClearSpawnFn => { + trace!("clearing spawn fn"); + spawn_fn = None; + } } trace!("raising control done flag"); @@ -436,6 +445,23 @@ + Send + Sync + 'static, +>; + +/// A function that customises how the underlying process is spawned. +/// +/// When set on a [`Job`](super::Job), this function is passed to +/// [`CommandWrap::spawn_with()`](process_wrap::tokio::CommandWrap::spawn_with) instead of using +/// the default [`CommandWrap::spawn()`](process_wrap::tokio::CommandWrap::spawn). It receives a +/// `&mut tokio::process::Command` and must return the spawned `tokio::process::Child`. +/// +/// All process-wrap layers are still applied around the child, so this only customises the +/// low-level spawn step. This is useful for delegating process spawning to a privileged helper +/// (e.g. for Linux capability granting) while keeping the supervisor's lifecycle management. +pub type SpawnFn = Arc< + dyn Fn(&mut tokio::process::Command) -> std::io::Result<tokio::process::Child> + + Send + + Sync + + 'static, >; sync_async_callbox!(SpawnHook, SyncSpawnHook, AsyncSpawnHook, (command: &mut CommandWrap, context: &JobTaskContext<'_>)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/crates/supervisor/src/job.rs new/watchexec-2.5.1/crates/supervisor/src/job.rs --- old/watchexec-2.5.0/crates/supervisor/src/job.rs 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/crates/supervisor/src/job.rs 2026-03-30 08:23:47.000000000 +0200 @@ -5,7 +5,7 @@ job::Job, messages::{Control, Ticket}, state::CommandState, - task::JobTaskContext, + task::{JobTaskContext, SpawnFn}, }; #[cfg(test)] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/doc/watchexec.1 new/watchexec-2.5.1/doc/watchexec.1 --- old/watchexec-2.5.0/doc/watchexec.1 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/doc/watchexec.1 2026-03-30 08:23:47.000000000 +0200 @@ -1,6 +1,6 @@ .ie \n(.g .ds Aq \(aq .el .ds Aq ' -.TH watchexec 1 "watchexec 2.5.0" +.TH watchexec 1 "watchexec 2.5.1" .SH NAME watchexec \- Execute commands when watched files change .SH SYNOPSIS @@ -634,6 +634,6 @@ Didn\*(Aqt expect this much output? Use the short \*(Aq\-h\*(Aq flag to get short help. .SH VERSION -v2.5.0 +v2.5.1 .SH AUTHORS Félix Saparelli <[email protected]>, Matt Green <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/watchexec-2.5.0/doc/watchexec.1.md new/watchexec-2.5.1/doc/watchexec.1.md --- old/watchexec-2.5.0/doc/watchexec.1.md 2026-02-25 11:28:30.000000000 +0100 +++ new/watchexec-2.5.1/doc/watchexec.1.md 2026-03-30 08:23:47.000000000 +0200 @@ -987,7 +987,7 @@ # VERSION -v2.5.0 +v2.5.1 # AUTHORS ++++++ watchexec.obsinfo ++++++ name: watchexec version: 2.5.1 mtime: 1774851827 commit: 9b7fed6a52c7586815864fe5c5bd1b6b5e5cec37
