Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package watchexec for openSUSE:Factory 
checked in at 2023-03-22 22:31:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/watchexec (Old)
 and      /work/SRC/openSUSE:Factory/.watchexec.new.31432 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "watchexec"

Wed Mar 22 22:31:54 2023 rev:6 rq:1073835 version:1.22.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/watchexec/watchexec.changes      2023-03-21 
17:44:12.658600194 +0100
+++ /work/SRC/openSUSE:Factory/.watchexec.new.31432/watchexec.changes   
2023-03-22 22:32:43.126820210 +0100
@@ -1,0 +2,15 @@
+Wed Mar 22 13:18:18 UTC 2023 - [email protected]
+
+- Update to version 1.22.2:
+  * release: watchexec-cli v1.22.2 (#560)
+  * Normalise paths to unix on windows for filtering only (#558)
+  * Disable signals on windows (#559)
+  * Build manpage just before packaging (#557)
+  * Fix tests-pass job (#556)
+  * Update manpage (#555)
+  * Fix dist-manifest gen (#554)
+  * Switch away from set-output (#553)
+  * release: watchexec-cli v1.22.1 (#551)
+  * release: watchexec v2.3.0 (#550)
+
+-------------------------------------------------------------------

Old:
----
  watchexec-1.22.0.obscpio
  watchexec-1.22.0.tar.xz

New:
----
  watchexec-1.22.2.obscpio
  watchexec-1.22.2.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ watchexec.spec ++++++
--- /var/tmp/diff_new_pack.jgfT4p/_old  2023-03-22 22:32:43.786823532 +0100
+++ /var/tmp/diff_new_pack.jgfT4p/_new  2023-03-22 22:32:43.790823552 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           watchexec
-Version:        1.22.0
+Version:        1.22.2
 Release:        0
 Summary:        Watches a path and runs a command whenever it detects 
modifications.
 License:        Apache-2.0

++++++ _constraints ++++++
--- /var/tmp/diff_new_pack.jgfT4p/_old  2023-03-22 22:32:43.834823774 +0100
+++ /var/tmp/diff_new_pack.jgfT4p/_new  2023-03-22 22:32:43.838823794 +0100
@@ -4,7 +4,7 @@
       <size unit="G">4</size>
     </memory>
     <disk>
-      <size unit="G">16</size>
+      <size unit="G">20</size>
     </disk>
   </hardware>
 </constraints>

++++++ _service ++++++
--- /var/tmp/diff_new_pack.jgfT4p/_old  2023-03-22 22:32:43.862823914 +0100
+++ /var/tmp/diff_new_pack.jgfT4p/_new  2023-03-22 22:32:43.862823914 +0100
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/watchexec/watchexec.git</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="scm">git</param>
-    <param name="revision">v1.22.0</param>
+    <param name="revision">v1.22.2</param>
     <param name="match-tag">*</param>
     <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ vendor.tar.xz ++++++
/work/SRC/openSUSE:Factory/watchexec/vendor.tar.xz 
/work/SRC/openSUSE:Factory/.watchexec.new.31432/vendor.tar.xz differ: char 27, 
line 1

++++++ watchexec-1.22.0.obscpio -> watchexec-1.22.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/release-cli.yml 
new/watchexec-1.22.2/.github/workflows/release-cli.yml
--- old/watchexec-1.22.0/.github/workflows/release-cli.yml      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/release-cli.yml      2023-03-22 
12:37:49.000000000 +0100
@@ -34,7 +34,7 @@
             exit 1
           fi
 
-          echo "::set-output name=cli_version::$version"
+          echo "cli_version=$version" >> $GITHUB_OUTPUT
 
       - name: Extract release notes
         id: notes
@@ -47,7 +47,7 @@
           set -euxo pipefail
           release_pr=$(head -n1 <<< "${release_commit:-}" | grep -oP 
'(?<=[(]#)\d+(?=[)])')
           if [[ -z "$release_pr" ]]; then
-            echo "::set-output name=notes_json::null"
+            echo "notes_json=null" >> $GITHUB_OUTPUT
             exit
           fi
 
@@ -55,15 +55,13 @@
             pr --repo "$GITHUB_REPO" \
             view "$release_pr" \
             --json body \
-            --jq '"::set-output name=notes_json::\((.body | split("### Release 
notes")[1] // "") | tojson)"'
+            --jq '"notes_json=\((.body | split("### Release notes")[1] // "") 
| tojson)"' \
+          >> $GITHUB_OUTPUT
 
       - name: Make a new announcement post
         id: announce
         if: endsWith(steps.version.outputs.cli_version, '.0')
-        run: echo "::set-output name=announce::Announcements"
-        # TODO: append patch release notes as comments on minor version 
announce discussion
-        # TODO: add link to discussion from patch release notes
-        # TODO: rename minor version announce discussion to be just CLI vX.Y 
(remove .0)
+        run: echo "announce=Announcements" >> $GITHUB_OUTPUT
 
   build:
     strategy:
@@ -234,6 +232,12 @@
         if: matrix.cross
         run: cross build --package watchexec-cli --release --locked --target 
${{ matrix.target }}
 
+      - name: Make manpage
+        run: cargo run -p watchexec-cli -- --manual > doc/watchexec.1
+
+      - name: Make completions
+        run: bin/completions
+
       - name: Package
         shell: bash
         run: |
@@ -249,7 +253,7 @@
           cp "$bin" "target/release/" # workaround for cargo-deb silliness 
with targets
 
           cp "$bin" "$dst/"
-          cp -r crates/cli/README.md LICENSE completions 
doc/{logo.svg,watchexec.1{,.html}} "$dst/"
+          cp -r crates/cli/README.md LICENSE completions 
doc/{logo.svg,watchexec.1{,.*}} "$dst/"
 
       - name: Archive (tar)
         if: '! startsWith(matrix.name, ''windows-'')'
@@ -281,7 +285,7 @@
             watchexec-*.rpm
             watchexec-*.zip
 
-  sign:
+  upload:
     needs: [build, info]
 
     name: Checksum and publish
@@ -304,7 +308,7 @@
           jq -ncf .github/workflows/dist-manifest.jq \
             --arg version "{{ needs.info.outputs.cli_version }}" \
             --arg changelog "{{ needs.info.outputs.release_notes }}" \
-            --arg files "$(ls watchexec-*)"
+            --arg files "$(ls watchexec-*)" \
             > dist-manifest.json
 
       - name: Bulk checksums
@@ -315,7 +319,7 @@
 
       - name: File checksums
         run: |
-          for file in watchexec-* do
+          for file in watchexec-*; do
             b3sum --no-names $file > "$file.b3"
             sha256sum $file | cut -d ' ' -f1 > "$file.sha256"
             sha512sum $file | cut -d ' ' -f1 > "$file.sha512"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/release-pr.ejs 
new/watchexec-1.22.2/.github/workflows/release-pr.ejs
--- old/watchexec-1.22.0/.github/workflows/release-pr.ejs       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/release-pr.ejs       2023-03-22 
12:37:49.000000000 +0100
@@ -42,6 +42,7 @@
 _Edit release notes into the section below:_
 
 <!-- do not change or remove this heading -->
+<% if (crate.name == "watchexec-cli") { %>
 ### Release notes
 
 _Software development often involves running the same commands over and over. 
Boring! Watchexec is a simple, standalone tool that watches a path and runs a 
command whenever it detects modifications. Install it today with 
[`cargo-binstall watchexec-cli`](https://github.com/cargo-bins/cargo-binstall), 
from the binaries below, find it [in your favourite package 
manager](https://github.com/watchexec/watchexec/blob/main/doc/packages.md), or 
build it from source with `cargo install watchexec-cli`._
@@ -53,4 +54,8 @@
 #### Other changes:
 
 -
+<% } else { %>
+### Changelog
+-
+<% } %>
 <% } %>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/release-pr.yml 
new/watchexec-1.22.2/.github/workflows/release-pr.yml
--- old/watchexec-1.22.0/.github/workflows/release-pr.yml       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/release-pr.yml       2023-03-22 
12:37:49.000000000 +0100
@@ -43,7 +43,7 @@
           github-token: ${{ secrets.GITHUB_TOKEN }}
           version: ${{ inputs.version }}
           crate-path: crates/${{ inputs.crate }}
-          pr-release-notes: ${{ inputs.crate == 'cli' }}
+          pr-release-notes: true
           pr-label: release
           pr-template-file: .github/workflows/release-pr.ejs
         env:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/tests.yml 
new/watchexec-1.22.2/.github/workflows/tests.yml
--- old/watchexec-1.22.0/.github/workflows/tests.yml    2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/tests.yml    2023-03-22 
12:37:49.000000000 +0100
@@ -131,4 +131,6 @@
     - cross-checks
     runs-on: ubuntu-latest
     steps:
-    - run: echo "Tests pass"
+    # fail if ANY dependency has failed or been skipped or cancelled
+    - if: "contains(needs.*.result, 'failure') || contains(needs.*.result, 
'skipped') || contains(needs.*.result, 'cancelled')"
+      run: exit 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/CITATION.cff 
new/watchexec-1.22.2/CITATION.cff
--- old/watchexec-1.22.0/CITATION.cff   2023-03-18 16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/CITATION.cff   2023-03-22 12:37:49.000000000 +0100
@@ -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: "1.22.0"
-date-released: 2023-03-18
+version: "1.22.2"
+date-released: 2023-03-22
 
 repository-code: https://github.com/watchexec/watchexec
 license: Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/Cargo.lock 
new/watchexec-1.22.2/Cargo.lock
--- old/watchexec-1.22.0/Cargo.lock     2023-03-18 16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/Cargo.lock     2023-03-22 12:37:49.000000000 +0100
@@ -60,9 +60,9 @@
 
 [[package]]
 name = "anstream"
-version = "0.2.4"
+version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1be94522db49757a6f9266e8ac18a59704e3e1c770c2e8173a39f9f8161a163a"
+checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -75,9 +75,9 @@
 
 [[package]]
 name = "anstyle"
-version = "0.3.4"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1ba0b55c2201aa802adb684e7963ce2c3191675629e7df899774331e3ac747cf"
+checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2"
 
 [[package]]
 name = "anstyle-parse"
@@ -100,9 +100,9 @@
 
 [[package]]
 name = "anyhow"
-version = "1.0.69"
+version = "1.0.70"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
+checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
 
 [[package]]
 name = "arc-swap"
@@ -212,13 +212,13 @@
 
 [[package]]
 name = "async-recursion"
-version = "1.0.2"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3b015a331cc64ebd1774ba119538573603427eaace0a1950c423ab971f903796"
+checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -240,7 +240,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -251,13 +251,13 @@
 
 [[package]]
 name = "async-trait"
-version = "0.1.66"
+version = "0.1.67"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc"
+checksum = "86ea188f25f0255d8f92797797c97ebf5631fa88178beb1a46fdf5622c9a00e4"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -286,7 +286,7 @@
 dependencies = [
  "async-trait",
  "axum-core",
- "bitflags",
+ "bitflags 1.3.2",
  "bytes",
  "futures-util",
  "http",
@@ -351,6 +351,12 @@
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
+name = "bitflags"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1"
+
+[[package]]
 name = "block"
 version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -389,9 +395,9 @@
 
 [[package]]
 name = "bstr"
-version = "1.3.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5ffdb39cb703212f3c11973452c2861b972f757b021158f3516ba10f2fa8b2c1"
+checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
 dependencies = [
  "memchr",
  "once_cell",
@@ -464,11 +470,11 @@
 
 [[package]]
 name = "clap"
-version = "4.1.8"
+version = "4.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5"
+checksum = "42dfd32784433290c51d92c438bb72ea5063797fc3cc9a21a8c4346bebbb2098"
 dependencies = [
- "bitflags",
+ "bitflags 2.0.2",
  "clap_derive",
  "clap_lex",
  "is-terminal",
@@ -480,9 +486,9 @@
 
 [[package]]
 name = "clap_complete"
-version = "4.1.4"
+version = "4.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "501ff0a401473ea1d4c3b125ff95506b62c5bc5768d818634195fbb7c4ad5ff4"
+checksum = "37686beaba5ac9f3ab01ee3172f792fc6ffdd685bfb9e63cfef02c0571a4e8e1"
 dependencies = [
  "clap",
 ]
@@ -499,31 +505,31 @@
 
 [[package]]
 name = "clap_derive"
-version = "4.1.8"
+version = "4.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0"
+checksum = "fddf67631444a3a3e3e5ac51c36a5e01335302de677bd78759eaa90ab1f46644"
 dependencies = [
  "heck 0.4.1",
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09"
+checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
 dependencies = [
  "os_str_bytes",
 ]
 
 [[package]]
 name = "clap_mangen"
-version = "0.2.9"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "bb0f09a0ca8f0dd8ac92c546b426f466ef19828185c6d504c80c48c9c2768ed9"
+checksum = "4237e29de9c6949982ba87d51709204504fb8ed2fd38232fcb1e5bf7d4ba48c8"
 dependencies = [
  "clap",
  "roff",
@@ -759,9 +765,9 @@
 
 [[package]]
 name = "cxx"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a140f260e6f3f79013b8bfc65e7ce630c9ab4388c6a89c71e07226f49487b72"
+checksum = "a9c00419335c41018365ddf7e4d5f1c12ee3659ddcf3e01974650ba1de73d038"
 dependencies = [
  "cc",
  "cxxbridge-flags",
@@ -771,9 +777,9 @@
 
 [[package]]
 name = "cxx-build"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "da6383f459341ea689374bf0a42979739dc421874f112ff26f829b8040b8e613"
+checksum = "fb8307ad413a98fff033c8545ecf133e3257747b3bae935e7602aab8aa92d4ca"
 dependencies = [
  "cc",
  "codespan-reporting",
@@ -781,24 +787,24 @@
  "proc-macro2",
  "quote",
  "scratch",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "90201c1a650e95ccff1c8c0bb5a343213bdd317c6e600a93075bca2eff54ec97"
+checksum = "edc52e2eb08915cb12596d29d55f0b5384f00d697a646dbd269b6ecb0fbd9d31"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56"
+checksum = "631569015d0d8d54e6c241733f944042623ab6df7bc3be7466874b05fcdb1c5f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -809,7 +815,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -828,7 +834,16 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
 dependencies = [
- "dirs-sys",
+ "dirs-sys 0.3.7",
+]
+
+[[package]]
+name = "dirs"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "dece029acd3353e3a58ac2e3eb3c8d6c35827a892edc6cc4138ef9c33df46ecd"
+dependencies = [
+ "dirs-sys 0.4.0",
 ]
 
 [[package]]
@@ -853,6 +868,17 @@
 ]
 
 [[package]]
+name = "dirs-sys"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "04414300db88f70d74c5ff54e50f9e1d1737d9a5b90f53fcf2e95ca2a9ab554b"
+dependencies = [
+ "libc",
+ "redox_users",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
 name = "dirs-sys-next"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -906,7 +932,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -1062,7 +1088,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -1128,7 +1154,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "libc",
  "libgit2-sys",
  "log",
@@ -1260,7 +1286,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "693d4a4ba0531e46fe558459557a5b29fb86c3e4b2666c1c0861d93c7c678331"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "bstr",
  "gix-path",
  "libc",
@@ -1349,7 +1375,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "93e43efd776bc543f46f0fd0ca3d920c37af71a764a16f2aebd89765e9ff2993"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "bstr",
 ]
 
@@ -1380,7 +1406,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "546ee7855d5d8731288f05a63c07ab41b59cb406660a825ed3fe89d7223823df"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "bstr",
  "btoi",
  "filetime",
@@ -1565,8 +1591,8 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "e8ffa5bf0772f9b01de501c035b6b084cf9b8bb07dec41e3afc6a17336a65f47"
 dependencies = [
- "bitflags",
- "dirs",
+ "bitflags 1.3.2",
+ "dirs 4.0.0",
  "gix-path",
  "libc",
  "windows 0.43.0",
@@ -1829,16 +1855,16 @@
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.53"
+version = "0.1.54"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
+checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
  "iana-time-zone-haiku",
  "js-sys",
  "wasm-bindgen",
- "winapi",
+ "windows 0.46.0",
 ]
 
 [[package]]
@@ -1918,7 +1944,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "inotify-sys",
  "libc",
 ]
@@ -1953,19 +1979,20 @@
 
 [[package]]
 name = "io-lifetimes"
-version = "1.0.6"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3"
+checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
 dependencies = [
+ "hermit-abi 0.3.1",
  "libc",
  "windows-sys 0.45.0",
 ]
 
 [[package]]
 name = "is-terminal"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857"
+checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
 dependencies = [
  "hermit-abi 0.3.1",
  "io-lifetimes",
@@ -2044,7 +2071,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "libc",
 ]
 
@@ -2226,7 +2253,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2240,9 +2267,9 @@
 
 [[package]]
 name = "mime"
-version = "0.3.16"
+version = "0.3.17"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
 
 [[package]]
 name = "minimal-lexical"
@@ -2277,7 +2304,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cfg-if",
  "libc",
  "memoffset 0.7.1",
@@ -2323,7 +2350,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "58ea850aa68a06e48fdb069c0ec44d0d64c8dbffa49bf3b6f7f0a901fdea1ba9"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "crossbeam-channel",
  "filetime",
  "fsevent-sys",
@@ -2453,9 +2480,9 @@
 
 [[package]]
 name = "os_str_bytes"
-version = "6.4.1"
+version = "6.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
 dependencies = [
  "memchr",
 ]
@@ -2562,7 +2589,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2590,7 +2617,7 @@
 checksum = "7e1f879b2998099c2d69ab9605d145d5b661195627eccc680002c4918a7fb6fa"
 dependencies = [
  "autocfg",
- "bitflags",
+ "bitflags 1.3.2",
  "cfg-if",
  "concurrent-queue",
  "libc",
@@ -2624,7 +2651,7 @@
  "proc-macro-error-attr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "version_check",
 ]
 
@@ -2689,7 +2716,7 @@
  "itertools",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2777,7 +2804,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
 ]
 
 [[package]]
@@ -2793,9 +2820,9 @@
 
 [[package]]
 name = "regex"
-version = "1.7.1"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -2813,9 +2840,9 @@
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.28"
+version = "0.6.29"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 
 [[package]]
 name = "roff"
@@ -2840,11 +2867,11 @@
 
 [[package]]
 name = "rustix"
-version = "0.36.9"
+version = "0.36.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc"
+checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "errno",
  "io-lifetimes",
  "libc",
@@ -2893,22 +2920,22 @@
 
 [[package]]
 name = "serde"
-version = "1.0.156"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4"
+checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.156"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d"
+checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -2924,13 +2951,13 @@
 
 [[package]]
 name = "serde_repr"
-version = "0.1.11"
+version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "395627de918015623b32e7669714206363a7fc00382bf477e72c1f7533e8eafc"
+checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -3086,7 +3113,7 @@
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3129,6 +3156,17 @@
 ]
 
 [[package]]
+name = "syn"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "2c622ae390c9302e214c31013517c2061ecb2699935882c60a9b37f82f8625ae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
 name = "sync_wrapper"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -3193,7 +3231,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "da31aef70da0f6352dbcb462683eb4dd2bfad01cf3fc96cf204547b9a839a585"
 dependencies = [
- "dirs",
+ "dirs 4.0.0",
  "fnv",
  "nom 5.1.2",
  "phf",
@@ -3213,22 +3251,22 @@
 
 [[package]]
 name = "thiserror"
-version = "1.0.39"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.39"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -3334,7 +3372,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3473,7 +3511,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3599,9 +3637,9 @@
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.11"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
 
 [[package]]
 name = "unicode-bom"
@@ -3715,12 +3753,11 @@
 
 [[package]]
 name = "walkdir"
-version = "2.3.2"
+version = "2.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
 dependencies = [
  "same-file",
- "winapi",
  "winapi-util",
 ]
 
@@ -3767,7 +3804,7 @@
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "wasm-bindgen-shared",
 ]
 
@@ -3789,7 +3826,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3802,7 +3839,7 @@
 
 [[package]]
 name = "watchexec"
-version = "2.2.0"
+version = "2.3.0"
 dependencies = [
  "async-priority-channel",
  "async-recursion",
@@ -3827,7 +3864,7 @@
 
 [[package]]
 name = "watchexec-cli"
-version = "1.22.0"
+version = "1.22.2"
 dependencies = [
  "argfile",
  "bosion",
@@ -3838,7 +3875,7 @@
  "clap_mangen",
  "command-group",
  "console-subscriber",
- "dirs",
+ "dirs 5.0.0",
  "embed-resource",
  "futures",
  "humantime",
@@ -3904,7 +3941,7 @@
 
 [[package]]
 name = "watchexec-filterer-tagged"
-version = "0.2.0"
+version = "0.3.0"
 dependencies = [
  "futures",
  "globset",
@@ -4005,6 +4042,15 @@
 ]
 
 [[package]]
+name = "windows"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
 name = "windows-sys"
 version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -4135,9 +4181,9 @@
 
 [[package]]
 name = "zbus"
-version = "3.11.0"
+version = "3.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "20aae5dd5b051971cd2f49f9f3b860e57b2b495ba5ba254eaec42d34ede57e97"
+checksum = "3dc29e76f558b2cb94190e8605ecfe77dd40f5df8c072951714b4b71a97f5848"
 dependencies = [
  "async-broadcast",
  "async-executor",
@@ -4149,7 +4195,7 @@
  "async-trait",
  "byteorder",
  "derivative",
- "dirs",
+ "dirs 4.0.0",
  "enumflags2",
  "event-listener",
  "futures-core",
@@ -4174,15 +4220,15 @@
 
 [[package]]
 name = "zbus_macros"
-version = "3.11.0"
+version = "3.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9264b3a1bcf5503d4e0348b6e7efe1da58d4f92a913c15ed9e63b52de85faaa1"
+checksum = "62a80fd82c011cd08459eaaf1fd83d3090c1b61e6d5284360074a7475af3a85d"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
  "regex",
- "syn",
+ "syn 1.0.109",
  "zvariant_utils",
 ]
 
@@ -4220,7 +4266,7 @@
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "zvariant_utils",
 ]
 
@@ -4232,5 +4278,5 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/Cargo.toml 
new/watchexec-1.22.2/crates/cli/Cargo.toml
--- old/watchexec-1.22.0/crates/cli/Cargo.toml  2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/crates/cli/Cargo.toml  2023-03-22 12:37:49.000000000 
+0100
@@ -1,6 +1,6 @@
 [package]
 name = "watchexec-cli"
-version = "1.22.0"
+version = "1.22.2"
 
 authors = ["Félix Saparelli <[email protected]>", "Matt Green 
<[email protected]>"]
 license = "Apache-2.0"
@@ -25,7 +25,7 @@
 clap_complete = "4.1.4"
 clap_complete_nushell = "0.1.10"
 clap_mangen = "0.2.9"
-dirs = "4.0.0"
+dirs = "5.0.0"
 futures = "0.3.17"
 humantime = "2.1.0"
 is-terminal = "0.4.4"
@@ -60,7 +60,7 @@
 path = "../project-origins"
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../lib"
 
 [dependencies.watchexec-events]
@@ -134,8 +134,10 @@
 assets = [
        ["../../target/release/watchexec", "usr/bin/watchexec", "755"],
        ["README.md", "usr/share/doc/watchexec/README", "644"],
-       ["../../doc/watchexec.1.html", 
"usr/share/doc/watchexec/watchexec.1.html", "644"],
+       ["../../doc/watchexec.1.md", "usr/share/doc/watchexec/watchexec.1.md", 
"644"],
        ["../../doc/watchexec.1", "usr/share/man/man1/watchexec.1.html", "644"],
+       ["../../completions/bash", 
"usr/share/bash-completion/completions/watchexec", "644"],
+       ["../../completions/fish", "usr/share/fish/completions/watchexec.fish", 
"644"],
        ["../../completions/zsh", "usr/share/zsh/site-functions/_watchexec", 
"644"],
        ["../../doc/logo.svg", 
"usr/share/icons/hicolor/scalable/apps/watchexec.svg", "644"],
 ]
@@ -144,8 +146,10 @@
 assets = [
        { source = "../../target/release/watchexec", dest = 
"/usr/bin/watchexec", mode = "755" },
        { source = "README.md", dest = "/usr/share/doc/watchexec/README", mode 
= "644", doc = true },
-       { source = "../../doc/watchexec.1.html", dest = 
"/usr/share/doc/watchexec/watchexec.1.html", mode = "644", doc = true },
+       { source = "../../doc/watchexec.1.md", dest = 
"/usr/share/doc/watchexec/watchexec.1.md", mode = "644", doc = true },
        { source = "../../doc/watchexec.1", dest = 
"/usr/share/man/man1/watchexec.1.html", mode = "644" },
+       { source = "../../completions/bash", dest = 
"/usr/share/bash-completion/completions/watchexec", mode = "644" },
+       { source = "../../completions/fish", dest = 
"/usr/share/fish/completions/watchexec.fish", mode = "644" },
        { source = "../../completions/zsh", dest = 
"/usr/share/zsh/site-functions/_watchexec", mode = "644" },
        { source = "../../doc/logo.svg", dest = 
"/usr/share/icons/hicolor/scalable/apps/watchexec.svg", mode = "644" },
        # set conf = true for config file when that lands
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/src/args.rs 
new/watchexec-1.22.2/crates/cli/src/args.rs
--- old/watchexec-1.22.0/crates/cli/src/args.rs 2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/crates/cli/src/args.rs 2023-03-22 12:37:49.000000000 
+0100
@@ -174,6 +174,9 @@
        /// controlled by '--stop-signal'.
        ///
        /// See the long documentation for '--stop-signal' for syntax.
+       ///
+       /// Signals are not supported on Windows at the moment, and will always 
be overridden to 'kill'.
+       /// See '--stop-signal' for more on Windows "signals".
        #[arg(
                short,
                long,
@@ -214,6 +217,9 @@
        /// Takes a unit-less value in seconds, or a time span value such as 
"5min 20s".
        ///
        /// The default is 60 seconds. Set to 0 to immediately force-kill the 
command.
+       ///
+       /// This has no practical effect on Windows as the command is always 
forcefully terminated; see
+       /// '--stop-signal' for why.
        #[arg(
                long,
                default_value = "60",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/src/config/runtime.rs 
new/watchexec-1.22.2/crates/cli/src/config/runtime.rs
--- old/watchexec-1.22.0/crates/cli/src/config/runtime.rs       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/cli/src/config/runtime.rs       2023-03-22 
12:37:49.000000000 +0100
@@ -169,13 +169,15 @@
 
                let when_idle = start.clone();
                let when_running = match on_busy {
+                       OnBusyUpdate::Restart if cfg!(windows) => 
Outcome::both(Outcome::Stop, start),
                        OnBusyUpdate::Restart => Outcome::both(
                                Outcome::both(
                                        
Outcome::Signal(stop_signal.unwrap_or(Signal::Terminate)),
-                                       
Outcome::both(Outcome::Sleep(stop_timeout), Outcome::Stop),
+                                       Outcome::wait_timeout(stop_timeout, 
Outcome::Stop),
                                ),
                                start,
                        ),
+                       OnBusyUpdate::Signal if cfg!(windows) => Outcome::Stop,
                        OnBusyUpdate::Signal => {
                                
Outcome::Signal(stop_signal.or(signal).unwrap_or(Signal::Terminate))
                        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/src/filterer/globset.rs 
new/watchexec-1.22.2/crates/cli/src/filterer/globset.rs
--- old/watchexec-1.22.0/crates/cli/src/filterer/globset.rs     2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/cli/src/filterer/globset.rs     2023-03-22 
12:37:49.000000000 +0100
@@ -129,6 +129,100 @@
                        }
                }
 
-               self.inner.check_event(event, priority)
+               #[cfg(windows)]
+               {
+                       let normalised = 
windows_norm::normalise_event_to_unix(event, false);
+                       trace!(event=?normalised, "check against 
unix-normalised event");
+                       if !self.inner.check_event(&normalised, priority)? {
+                               return Ok(false);
+                       }
+
+                       let prefixed_normalised = 
windows_norm::normalise_event_to_unix(event, true);
+                       trace!(event=?prefixed_normalised, "check against 
prefixed unix-normalised event");
+                       if !self.inner.check_event(&prefixed_normalised, 
priority)? {
+                               return Ok(false);
+                       }
+               }
+
+               trace!("check against original event");
+               if !self.inner.check_event(event, priority)? {
+                       return Ok(false);
+               }
+
+               Ok(true)
+       }
+}
+
+#[cfg(windows)]
+mod windows_norm {
+       use std::{
+               ffi::OsString,
+               path::{Component, Path, PathBuf},
+       };
+       use watchexec_events::{Event, Tag};
+
+       pub fn normalise_event_to_unix(event: &Event, with_prefix: bool) -> 
Event {
+               let mut path_normalised_event = event.clone();
+               for mut tag in &mut path_normalised_event.tags {
+                       if let Tag::Path { ref mut path, .. } = &mut tag {
+                               *path = normalise_path_to_unix(path, 
with_prefix);
+                       }
+               }
+               path_normalised_event
+       }
+
+       pub fn normalise_path_to_unix(path: &Path, with_prefix: bool) -> 
PathBuf {
+               let mut newpath = 
OsString::with_capacity(path.as_os_str().len());
+               let mut skip_root = false;
+               for component in path.components() {
+                       if matches!(component, Component::Prefix(_)) {
+                               if with_prefix {
+                                       newpath.push(component.as_os_str());
+                                       skip_root = true;
+                               }
+                       } else if matches!(component, Component::RootDir) && 
skip_root {
+                               // skip
+                       } else {
+                               newpath.push("/");
+                               newpath.push(component.as_os_str());
+                       }
+               }
+
+               PathBuf::from(newpath)
+       }
+
+       #[cfg(test)]
+       #[test]
+       fn test_normalise_path_to_unix() {
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("C:\\Users\\foo\\bar"), false),
+                       PathBuf::from("/Users/foo/bar")
+               );
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("C:\\Users\\foo\\bar"), true),
+                       PathBuf::from("C:/Users/foo/bar")
+               );
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("E:\\_temp\\folder_to_watch\\private"), false),
+                       PathBuf::from("/_temp/folder_to_watch/private")
+               );
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("E:\\_temp\\folder_to_watch\\private"), true),
+                       PathBuf::from("E:/_temp/folder_to_watch/private")
+               );
+               assert_eq!(
+                       normalise_path_to_unix(
+                               
Path::new("\\\\?\\E:\\_temp\\folder_to_watch\\public\\.hgignore"),
+                               false
+                       ),
+                       PathBuf::from("/_temp/folder_to_watch/public/.hgignore")
+               );
+               assert_eq!(
+                       normalise_path_to_unix(
+                               
Path::new("\\\\?\\E:\\_temp\\folder_to_watch\\public\\.hgignore"),
+                               true
+                       ),
+                       
PathBuf::from("\\\\?\\E:/_temp/folder_to_watch/public/.hgignore")
+               );
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/watchexec.exe.manifest 
new/watchexec-1.22.2/crates/cli/watchexec.exe.manifest
--- old/watchexec-1.22.0/crates/cli/watchexec.exe.manifest      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/cli/watchexec.exe.manifest      2023-03-22 
12:37:49.000000000 +0100
@@ -3,7 +3,7 @@
        <assemblyIdentity
                type="win32"
                name="Watchexec.Cli.watchexec"
-               version="1.22.0.0"
+               version="1.22.2.0"
        />
 
        <trustInfo>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/globset/Cargo.toml 
new/watchexec-1.22.2/crates/filterer/globset/Cargo.toml
--- old/watchexec-1.22.0/crates/filterer/globset/Cargo.toml     2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/globset/Cargo.toml     2023-03-22 
12:37:49.000000000 +0100
@@ -24,7 +24,7 @@
 path = "../../ignore-files"
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../../lib"
 
 [dependencies.watchexec-filterer-ignore]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/ignore/Cargo.toml 
new/watchexec-1.22.2/crates/filterer/ignore/Cargo.toml
--- old/watchexec-1.22.0/crates/filterer/ignore/Cargo.toml      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/ignore/Cargo.toml      2023-03-22 
12:37:49.000000000 +0100
@@ -24,7 +24,7 @@
 path = "../../ignore-files"
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../../lib"
 
 [dependencies.watchexec-signals]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/tagged/CHANGELOG.md 
new/watchexec-1.22.2/crates/filterer/tagged/CHANGELOG.md
--- old/watchexec-1.22.0/crates/filterer/tagged/CHANGELOG.md    2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/tagged/CHANGELOG.md    2023-03-22 
12:37:49.000000000 +0100
@@ -2,6 +2,8 @@
 
 ## Next (YYYY-MM-DD)
 
+## v0.3.0 (2023-03-18)
+
 - Ditch MSRV policy. The `rust-version` indication will remain, for the 
minimum estimated Rust version for the code features used in the crate's own 
code, but dependencies may have already moved on. From now on, only latest 
stable is assumed and tested for. 
([#510](https://github.com/watchexec/watchexec/pull/510))
 
 ## v0.2.0 (2023-01-09)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/tagged/Cargo.toml 
new/watchexec-1.22.2/crates/filterer/tagged/Cargo.toml
--- old/watchexec-1.22.0/crates/filterer/tagged/Cargo.toml      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/tagged/Cargo.toml      2023-03-22 
12:37:49.000000000 +0100
@@ -1,6 +1,6 @@
 [package]
 name = "watchexec-filterer-tagged"
-version = "0.2.0"
+version = "0.3.0"
 
 authors = ["Félix Saparelli <[email protected]>"]
 license = "Apache-2.0"
@@ -37,7 +37,7 @@
 ]
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../../lib"
 
 [dependencies.watchexec-filterer-ignore]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/CHANGELOG.md 
new/watchexec-1.22.2/crates/lib/CHANGELOG.md
--- old/watchexec-1.22.0/crates/lib/CHANGELOG.md        2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/CHANGELOG.md        2023-03-22 
12:37:49.000000000 +0100
@@ -2,6 +2,14 @@
 
 ## Next (YYYY-MM-DD)
 
+## v2.3.0 (2023-03-22)
+
+- New: `Outcome::Race` and `Outcome::race()` 
([#548](https://github.com/watchexec/watchexec/pull/548))
+- New: `Outcome::wait_timeout()` 
([#548](https://github.com/watchexec/watchexec/pull/548))
+- New: `Outcome::sequence()` 
([#548](https://github.com/watchexec/watchexec/pull/548))
+- Fix: `kill_on_drop(true)` set for group commands as well as ungrouped 
([#549](https://github.com/watchexec/watchexec/pull/549))
+- Some `debug!`s upgraded to `info!`s, based on experience reading logs 
([#547](https://github.com/watchexec/watchexec/pull/547))
+
 ## v2.2.0 (2023-03-18)
 
 - Ditch MSRV policy. The `rust-version` indication will remain, for the 
minimum estimated Rust version for the code features used in the crate's own 
code, but dependencies may have already moved on. From now on, only latest 
stable is assumed and tested for. 
([#510](https://github.com/watchexec/watchexec/pull/510))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/Cargo.toml 
new/watchexec-1.22.2/crates/lib/Cargo.toml
--- old/watchexec-1.22.0/crates/lib/Cargo.toml  2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/crates/lib/Cargo.toml  2023-03-22 12:37:49.000000000 
+0100
@@ -1,6 +1,6 @@
 [package]
 name = "watchexec"
-version = "2.2.0"
+version = "2.3.0"
 
 authors = ["Matt Green <[email protected]>", "Félix Saparelli 
<[email protected]>"]
 license = "Apache-2.0"
@@ -27,7 +27,7 @@
 normalize-path = "0.2.0"
 
 [dependencies.command-group]
-version = "2.0.1"
+version = "2.1.0"
 features = ["with-tokio"]
 
 [dependencies.watchexec-events]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/src/action/outcome.rs 
new/watchexec-1.22.2/crates/lib/src/action/outcome.rs
--- old/watchexec-1.22.0/crates/lib/src/action/outcome.rs       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/action/outcome.rs       2023-03-22 
12:37:49.000000000 +0100
@@ -56,6 +56,9 @@
 
        /// Do both outcomes in order.
        Both(Box<Outcome>, Box<Outcome>),
+
+       /// Race both outcomes: run both at once, and when one finishes, cancel 
the other.
+       Race(Box<Outcome>, Box<Outcome>),
 }
 
 impl Default for Outcome {
@@ -77,10 +80,32 @@
                Self::Both(Box::new(one), Box::new(two))
        }
 
-       /// Convenience function to wait for the subprocess to complete before 
executing the outcome.
+       /// Pattern that creates a sequence of outcomes from an iterator.
+       #[must_use]
+       pub fn sequence(mut outcomes: impl Iterator<Item = Self>) -> Self {
+               let mut seq = outcomes.next().unwrap_or(Self::DoNothing);
+               for outcome in outcomes {
+                       seq = Self::both(seq, outcome);
+               }
+               seq
+       }
+
+       /// Convenience function to create a race of outcomes.
+       #[must_use]
+       pub fn race(one: Self, two: Self) -> Self {
+               Self::Race(Box::new(one), Box::new(two))
+       }
+
+       /// Pattern that waits for the subprocess to complete before executing 
the outcome.
        #[must_use]
        pub fn wait(and_then: Self) -> Self {
-               Self::Both(Box::new(Self::Wait), Box::new(and_then))
+               Self::both(Self::Wait, and_then)
+       }
+
+       /// Pattern that waits for the subprocess to complete with a timeout.
+       #[must_use]
+       pub fn wait_timeout(timeout: Duration, and_then: Self) -> Self {
+               Self::both(Self::race(Self::Sleep(timeout), Self::Wait), 
and_then)
        }
 
        /// Resolves the outcome given the current state of the subprocess.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/watchexec-1.22.0/crates/lib/src/action/outcome_worker.rs 
new/watchexec-1.22.2/crates/lib/src/action/outcome_worker.rs
--- old/watchexec-1.22.0/crates/lib/src/action/outcome_worker.rs        
2023-03-18 16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/action/outcome_worker.rs        
2023-03-22 12:37:49.000000000 +0100
@@ -5,13 +5,16 @@
 
 use async_priority_channel as priority;
 use clearscreen::ClearScreen;
-use futures::Future;
+use futures::{
+       future::{select, Either},
+       Future,
+};
 use tokio::{
        spawn,
        sync::{mpsc, watch::Receiver},
        time::sleep,
 };
-use tracing::{debug, error, trace, warn};
+use tracing::{debug, error, info, trace, warn};
 
 use crate::{
        command::Supervisor,
@@ -63,7 +66,7 @@
                        match this.apply(outcome.clone()).await {
                                Err(err) => {
                                        if matches!(err, RuntimeError::Exit) {
-                                               debug!(%gen, "propagating 
graceful exit");
+                                               info!(%gen, "propagating 
graceful exit");
                                        } else {
                                                error!(?err, %gen, "outcome 
applier errored");
                                        }
@@ -191,6 +194,14 @@
 
                                notry!(self.apply(*two))?;
                        }
+
+                       (_, Outcome::Race(one, two)) => {
+                               if let Either::Left((Err(err), _)) | 
Either::Right((Err(err), _)) =
+                                       select(self.apply(*one), 
self.apply(*two)).await
+                               {
+                                       return Err(err);
+                               }
+                       }
                }
 
                Ok(())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/src/action/worker.rs 
new/watchexec-1.22.2/crates/lib/src/action/worker.rs
--- old/watchexec-1.22.0/crates/lib/src/action/worker.rs        2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/action/worker.rs        2023-03-22 
12:37:49.000000000 +0100
@@ -11,7 +11,7 @@
        },
        time::timeout,
 };
-use tracing::{debug, trace};
+use tracing::{debug, info, trace};
 
 use crate::{
        error::{CriticalError, RuntimeError},
@@ -123,7 +123,7 @@
                #[allow(clippy::iter_with_drain)]
                let events = 
Arc::from(set.drain(..).collect::<Vec<_>>().into_boxed_slice());
                let action = Action::new(Arc::clone(&events));
-               debug!(?action, "action constructed");
+               info!(?action, "action constructed");
 
                debug!("running action handler");
                let action_handler = {
@@ -143,10 +143,10 @@
                }
 
                let outcome = outcome.get().cloned().unwrap_or_default();
-               debug!(?outcome, "handler finished");
+               debug!(?outcome, "action handler finished");
 
                let outcome = outcome.resolve(process.is_running().await);
-               debug!(?outcome, "outcome resolved");
+               info!(?outcome, "outcome resolved");
 
                OutcomeWorker::spawn(
                        outcome,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/watchexec-1.22.0/crates/lib/src/command/supervisor.rs 
new/watchexec-1.22.2/crates/lib/src/command/supervisor.rs
--- old/watchexec-1.22.0/crates/lib/src/command/supervisor.rs   2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/command/supervisor.rs   2023-03-22 
12:37:49.000000000 +0100
@@ -9,7 +9,7 @@
                watch,
        },
 };
-use tracing::{debug, debug_span, error, trace, Span};
+use tracing::{debug, debug_span, error, info, trace, Span};
 use watchexec_signals::Signal;
 
 use crate::{
@@ -280,7 +280,6 @@
        let (pre_spawn, spawnable) = span.in_scope::<_, Result<_, 
RuntimeError>>(|| {
                debug!(%grouped, ?command, "preparing command");
                let mut spawnable = command.to_spawnable()?;
-               spawnable.kill_on_drop(true);
 
                // Required from Rust 1.66:
                // https://github.com/rust-lang/rust/pull/101077
@@ -320,24 +319,30 @@
                        .map_err(|_| 
RuntimeError::HandlerLockHeld("pre-spawn"))?
                        .into_inner();
 
-               debug!(command=?spawnable, "spawning command");
+               info!(command=?spawnable, "spawning command");
                let (proc, id) = if grouped {
                        let proc = spawnable
-                               .group_spawn()
+                               .group()
+                               .kill_on_drop(true)
+                               .spawn()
                                .map_err(|err| RuntimeError::IoError {
                                        about: "spawning process group",
                                        err,
                                })?;
                        let id = 
proc.id().ok_or(RuntimeError::ProcessDeadOnArrival)?;
-                       debug!(pgid=%id, "process group spawned");
+                       info!(pgid=%id, "process group spawned");
                        (Process::Grouped(proc), id)
                } else {
-                       let proc = spawnable.spawn().map_err(|err| 
RuntimeError::IoError {
-                               about: "spawning process (ungrouped)",
-                               err,
-                       })?;
+                       let proc =
+                               spawnable
+                                       .kill_on_drop(true)
+                                       .spawn()
+                                       .map_err(|err| RuntimeError::IoError {
+                                               about: "spawning process 
(ungrouped)",
+                                               err,
+                                       })?;
                        let id = 
proc.id().ok_or(RuntimeError::ProcessDeadOnArrival)?;
-                       debug!(pid=%id, "process spawned");
+                       info!(pid=%id, "process spawned");
                        (Process::Ungrouped(proc), id)
                };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/doc/watchexec.1 
new/watchexec-1.22.2/doc/watchexec.1
--- old/watchexec-1.22.0/doc/watchexec.1        2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/doc/watchexec.1        2023-03-22 12:37:49.000000000 
+0100
@@ -1,6 +1,6 @@
 .ie \n(.g .ds Aq \(aq
 .el .ds Aq '
-.TH watchexec 1  "watchexec 1.22.0" 
+.TH watchexec 1  "watchexec 1.22.2" 
 .SH NAME
 watchexec \- Execute commands when watched files change
 .SH SYNOPSIS
@@ -71,6 +71,8 @@
 Specify a signal to send to the process when it\*(Aqs still running. This 
implies \*(Aq\-\-on\-busy\-update=signal\*(Aq; otherwise the signal used when 
that mode is \*(Aqrestart\*(Aq is controlled by \*(Aq\-\-stop\-signal\*(Aq.
 
 See the long documentation for \*(Aq\-\-stop\-signal\*(Aq for syntax.
+
+Signals are not supported on Windows at the moment, and will always be 
overridden to \*(Aqkill\*(Aq. See \*(Aq\-\-stop\-signal\*(Aq for more on 
Windows "signals".
 .TP
 \fB\-\-stop\-signal\fR=\fISIGNAL\fR
 Signal to send to stop the command
@@ -91,6 +93,8 @@
 Takes a unit\-less value in seconds, or a time span value such as "5min 20s".
 
 The default is 60 seconds. Set to 0 to immediately force\-kill the command.
+
+This has no practical effect on Windows as the command is always forcefully 
terminated; see \*(Aq\-\-stop\-signal\*(Aq for why.
 .TP
 \fB\-\-debounce\fR=\fITIMEOUT\fR
 Time to wait for new events before taking action
@@ -468,6 +472,6 @@
 .SH EXTRA
 Use @argfile as first argument to load arguments from the file 
\*(Aqargfile\*(Aq (one argument per line) which will be inserted in place of 
the @argfile (further arguments on the CLI will override or add onto those in 
the file).
 .SH VERSION
-v1.22.0
+v1.22.2
 .SH AUTHORS
 Félix Saparelli <[email protected]>, Matt Green <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/doc/watchexec.1.md 
new/watchexec-1.22.2/doc/watchexec.1.md
--- old/watchexec-1.22.0/doc/watchexec.1.md     2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/doc/watchexec.1.md     2023-03-22 12:37:49.000000000 
+0100
@@ -113,6 +113,9 @@
 
 See the long documentation for \--stop-signal for syntax.
 
+Signals are not supported on Windows at the moment, and will always be
+overridden to kill. See \--stop-signal for more on Windows \"signals\".
+
 **\--stop-signal**=*SIGNAL*
 
 :   Signal to send to stop the command
@@ -149,6 +152,9 @@
 The default is 60 seconds. Set to 0 to immediately force-kill the
 command.
 
+This has no practical effect on Windows as the command is always
+forcefully terminated; see \--stop-signal for why.
+
 **\--debounce**=*TIMEOUT*
 
 :   Time to wait for new events before taking action
@@ -667,7 +673,7 @@
 
 # VERSION
 
-v1.22.0
+v1.22.2
 
 # AUTHORS
 
Binary files old/watchexec-1.22.0/doc/watchexec.1.pdf and 
new/watchexec-1.22.2/doc/watchexec.1.pdf differ

++++++ watchexec-1.22.0.tar.xz -> watchexec-1.22.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/release-cli.yml 
new/watchexec-1.22.2/.github/workflows/release-cli.yml
--- old/watchexec-1.22.0/.github/workflows/release-cli.yml      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/release-cli.yml      2023-03-22 
12:37:49.000000000 +0100
@@ -34,7 +34,7 @@
             exit 1
           fi
 
-          echo "::set-output name=cli_version::$version"
+          echo "cli_version=$version" >> $GITHUB_OUTPUT
 
       - name: Extract release notes
         id: notes
@@ -47,7 +47,7 @@
           set -euxo pipefail
           release_pr=$(head -n1 <<< "${release_commit:-}" | grep -oP 
'(?<=[(]#)\d+(?=[)])')
           if [[ -z "$release_pr" ]]; then
-            echo "::set-output name=notes_json::null"
+            echo "notes_json=null" >> $GITHUB_OUTPUT
             exit
           fi
 
@@ -55,15 +55,13 @@
             pr --repo "$GITHUB_REPO" \
             view "$release_pr" \
             --json body \
-            --jq '"::set-output name=notes_json::\((.body | split("### Release 
notes")[1] // "") | tojson)"'
+            --jq '"notes_json=\((.body | split("### Release notes")[1] // "") 
| tojson)"' \
+          >> $GITHUB_OUTPUT
 
       - name: Make a new announcement post
         id: announce
         if: endsWith(steps.version.outputs.cli_version, '.0')
-        run: echo "::set-output name=announce::Announcements"
-        # TODO: append patch release notes as comments on minor version 
announce discussion
-        # TODO: add link to discussion from patch release notes
-        # TODO: rename minor version announce discussion to be just CLI vX.Y 
(remove .0)
+        run: echo "announce=Announcements" >> $GITHUB_OUTPUT
 
   build:
     strategy:
@@ -234,6 +232,12 @@
         if: matrix.cross
         run: cross build --package watchexec-cli --release --locked --target 
${{ matrix.target }}
 
+      - name: Make manpage
+        run: cargo run -p watchexec-cli -- --manual > doc/watchexec.1
+
+      - name: Make completions
+        run: bin/completions
+
       - name: Package
         shell: bash
         run: |
@@ -249,7 +253,7 @@
           cp "$bin" "target/release/" # workaround for cargo-deb silliness 
with targets
 
           cp "$bin" "$dst/"
-          cp -r crates/cli/README.md LICENSE completions 
doc/{logo.svg,watchexec.1{,.html}} "$dst/"
+          cp -r crates/cli/README.md LICENSE completions 
doc/{logo.svg,watchexec.1{,.*}} "$dst/"
 
       - name: Archive (tar)
         if: '! startsWith(matrix.name, ''windows-'')'
@@ -281,7 +285,7 @@
             watchexec-*.rpm
             watchexec-*.zip
 
-  sign:
+  upload:
     needs: [build, info]
 
     name: Checksum and publish
@@ -304,7 +308,7 @@
           jq -ncf .github/workflows/dist-manifest.jq \
             --arg version "{{ needs.info.outputs.cli_version }}" \
             --arg changelog "{{ needs.info.outputs.release_notes }}" \
-            --arg files "$(ls watchexec-*)"
+            --arg files "$(ls watchexec-*)" \
             > dist-manifest.json
 
       - name: Bulk checksums
@@ -315,7 +319,7 @@
 
       - name: File checksums
         run: |
-          for file in watchexec-* do
+          for file in watchexec-*; do
             b3sum --no-names $file > "$file.b3"
             sha256sum $file | cut -d ' ' -f1 > "$file.sha256"
             sha512sum $file | cut -d ' ' -f1 > "$file.sha512"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/release-pr.ejs 
new/watchexec-1.22.2/.github/workflows/release-pr.ejs
--- old/watchexec-1.22.0/.github/workflows/release-pr.ejs       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/release-pr.ejs       2023-03-22 
12:37:49.000000000 +0100
@@ -42,6 +42,7 @@
 _Edit release notes into the section below:_
 
 <!-- do not change or remove this heading -->
+<% if (crate.name == "watchexec-cli") { %>
 ### Release notes
 
 _Software development often involves running the same commands over and over. 
Boring! Watchexec is a simple, standalone tool that watches a path and runs a 
command whenever it detects modifications. Install it today with 
[`cargo-binstall watchexec-cli`](https://github.com/cargo-bins/cargo-binstall), 
from the binaries below, find it [in your favourite package 
manager](https://github.com/watchexec/watchexec/blob/main/doc/packages.md), or 
build it from source with `cargo install watchexec-cli`._
@@ -53,4 +54,8 @@
 #### Other changes:
 
 -
+<% } else { %>
+### Changelog
+-
+<% } %>
 <% } %>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/release-pr.yml 
new/watchexec-1.22.2/.github/workflows/release-pr.yml
--- old/watchexec-1.22.0/.github/workflows/release-pr.yml       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/release-pr.yml       2023-03-22 
12:37:49.000000000 +0100
@@ -43,7 +43,7 @@
           github-token: ${{ secrets.GITHUB_TOKEN }}
           version: ${{ inputs.version }}
           crate-path: crates/${{ inputs.crate }}
-          pr-release-notes: ${{ inputs.crate == 'cli' }}
+          pr-release-notes: true
           pr-label: release
           pr-template-file: .github/workflows/release-pr.ejs
         env:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/.github/workflows/tests.yml 
new/watchexec-1.22.2/.github/workflows/tests.yml
--- old/watchexec-1.22.0/.github/workflows/tests.yml    2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/.github/workflows/tests.yml    2023-03-22 
12:37:49.000000000 +0100
@@ -131,4 +131,6 @@
     - cross-checks
     runs-on: ubuntu-latest
     steps:
-    - run: echo "Tests pass"
+    # fail if ANY dependency has failed or been skipped or cancelled
+    - if: "contains(needs.*.result, 'failure') || contains(needs.*.result, 
'skipped') || contains(needs.*.result, 'cancelled')"
+      run: exit 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/CITATION.cff 
new/watchexec-1.22.2/CITATION.cff
--- old/watchexec-1.22.0/CITATION.cff   2023-03-18 16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/CITATION.cff   2023-03-22 12:37:49.000000000 +0100
@@ -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: "1.22.0"
-date-released: 2023-03-18
+version: "1.22.2"
+date-released: 2023-03-22
 
 repository-code: https://github.com/watchexec/watchexec
 license: Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/Cargo.lock 
new/watchexec-1.22.2/Cargo.lock
--- old/watchexec-1.22.0/Cargo.lock     2023-03-18 16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/Cargo.lock     2023-03-22 12:37:49.000000000 +0100
@@ -60,9 +60,9 @@
 
 [[package]]
 name = "anstream"
-version = "0.2.4"
+version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1be94522db49757a6f9266e8ac18a59704e3e1c770c2e8173a39f9f8161a163a"
+checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -75,9 +75,9 @@
 
 [[package]]
 name = "anstyle"
-version = "0.3.4"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1ba0b55c2201aa802adb684e7963ce2c3191675629e7df899774331e3ac747cf"
+checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2"
 
 [[package]]
 name = "anstyle-parse"
@@ -100,9 +100,9 @@
 
 [[package]]
 name = "anyhow"
-version = "1.0.69"
+version = "1.0.70"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
+checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
 
 [[package]]
 name = "arc-swap"
@@ -212,13 +212,13 @@
 
 [[package]]
 name = "async-recursion"
-version = "1.0.2"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3b015a331cc64ebd1774ba119538573603427eaace0a1950c423ab971f903796"
+checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -240,7 +240,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -251,13 +251,13 @@
 
 [[package]]
 name = "async-trait"
-version = "0.1.66"
+version = "0.1.67"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc"
+checksum = "86ea188f25f0255d8f92797797c97ebf5631fa88178beb1a46fdf5622c9a00e4"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -286,7 +286,7 @@
 dependencies = [
  "async-trait",
  "axum-core",
- "bitflags",
+ "bitflags 1.3.2",
  "bytes",
  "futures-util",
  "http",
@@ -351,6 +351,12 @@
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
+name = "bitflags"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1"
+
+[[package]]
 name = "block"
 version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -389,9 +395,9 @@
 
 [[package]]
 name = "bstr"
-version = "1.3.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5ffdb39cb703212f3c11973452c2861b972f757b021158f3516ba10f2fa8b2c1"
+checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
 dependencies = [
  "memchr",
  "once_cell",
@@ -464,11 +470,11 @@
 
 [[package]]
 name = "clap"
-version = "4.1.8"
+version = "4.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5"
+checksum = "42dfd32784433290c51d92c438bb72ea5063797fc3cc9a21a8c4346bebbb2098"
 dependencies = [
- "bitflags",
+ "bitflags 2.0.2",
  "clap_derive",
  "clap_lex",
  "is-terminal",
@@ -480,9 +486,9 @@
 
 [[package]]
 name = "clap_complete"
-version = "4.1.4"
+version = "4.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "501ff0a401473ea1d4c3b125ff95506b62c5bc5768d818634195fbb7c4ad5ff4"
+checksum = "37686beaba5ac9f3ab01ee3172f792fc6ffdd685bfb9e63cfef02c0571a4e8e1"
 dependencies = [
  "clap",
 ]
@@ -499,31 +505,31 @@
 
 [[package]]
 name = "clap_derive"
-version = "4.1.8"
+version = "4.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0"
+checksum = "fddf67631444a3a3e3e5ac51c36a5e01335302de677bd78759eaa90ab1f46644"
 dependencies = [
  "heck 0.4.1",
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09"
+checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
 dependencies = [
  "os_str_bytes",
 ]
 
 [[package]]
 name = "clap_mangen"
-version = "0.2.9"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "bb0f09a0ca8f0dd8ac92c546b426f466ef19828185c6d504c80c48c9c2768ed9"
+checksum = "4237e29de9c6949982ba87d51709204504fb8ed2fd38232fcb1e5bf7d4ba48c8"
 dependencies = [
  "clap",
  "roff",
@@ -759,9 +765,9 @@
 
 [[package]]
 name = "cxx"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a140f260e6f3f79013b8bfc65e7ce630c9ab4388c6a89c71e07226f49487b72"
+checksum = "a9c00419335c41018365ddf7e4d5f1c12ee3659ddcf3e01974650ba1de73d038"
 dependencies = [
  "cc",
  "cxxbridge-flags",
@@ -771,9 +777,9 @@
 
 [[package]]
 name = "cxx-build"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "da6383f459341ea689374bf0a42979739dc421874f112ff26f829b8040b8e613"
+checksum = "fb8307ad413a98fff033c8545ecf133e3257747b3bae935e7602aab8aa92d4ca"
 dependencies = [
  "cc",
  "codespan-reporting",
@@ -781,24 +787,24 @@
  "proc-macro2",
  "quote",
  "scratch",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "90201c1a650e95ccff1c8c0bb5a343213bdd317c6e600a93075bca2eff54ec97"
+checksum = "edc52e2eb08915cb12596d29d55f0b5384f00d697a646dbd269b6ecb0fbd9d31"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56"
+checksum = "631569015d0d8d54e6c241733f944042623ab6df7bc3be7466874b05fcdb1c5f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -809,7 +815,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -828,7 +834,16 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
 dependencies = [
- "dirs-sys",
+ "dirs-sys 0.3.7",
+]
+
+[[package]]
+name = "dirs"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "dece029acd3353e3a58ac2e3eb3c8d6c35827a892edc6cc4138ef9c33df46ecd"
+dependencies = [
+ "dirs-sys 0.4.0",
 ]
 
 [[package]]
@@ -853,6 +868,17 @@
 ]
 
 [[package]]
+name = "dirs-sys"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "04414300db88f70d74c5ff54e50f9e1d1737d9a5b90f53fcf2e95ca2a9ab554b"
+dependencies = [
+ "libc",
+ "redox_users",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
 name = "dirs-sys-next"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -906,7 +932,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -1062,7 +1088,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -1128,7 +1154,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "libc",
  "libgit2-sys",
  "log",
@@ -1260,7 +1286,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "693d4a4ba0531e46fe558459557a5b29fb86c3e4b2666c1c0861d93c7c678331"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "bstr",
  "gix-path",
  "libc",
@@ -1349,7 +1375,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "93e43efd776bc543f46f0fd0ca3d920c37af71a764a16f2aebd89765e9ff2993"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "bstr",
 ]
 
@@ -1380,7 +1406,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "546ee7855d5d8731288f05a63c07ab41b59cb406660a825ed3fe89d7223823df"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "bstr",
  "btoi",
  "filetime",
@@ -1565,8 +1591,8 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "e8ffa5bf0772f9b01de501c035b6b084cf9b8bb07dec41e3afc6a17336a65f47"
 dependencies = [
- "bitflags",
- "dirs",
+ "bitflags 1.3.2",
+ "dirs 4.0.0",
  "gix-path",
  "libc",
  "windows 0.43.0",
@@ -1829,16 +1855,16 @@
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.53"
+version = "0.1.54"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
+checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
  "iana-time-zone-haiku",
  "js-sys",
  "wasm-bindgen",
- "winapi",
+ "windows 0.46.0",
 ]
 
 [[package]]
@@ -1918,7 +1944,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "inotify-sys",
  "libc",
 ]
@@ -1953,19 +1979,20 @@
 
 [[package]]
 name = "io-lifetimes"
-version = "1.0.6"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3"
+checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
 dependencies = [
+ "hermit-abi 0.3.1",
  "libc",
  "windows-sys 0.45.0",
 ]
 
 [[package]]
 name = "is-terminal"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857"
+checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
 dependencies = [
  "hermit-abi 0.3.1",
  "io-lifetimes",
@@ -2044,7 +2071,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "libc",
 ]
 
@@ -2226,7 +2253,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2240,9 +2267,9 @@
 
 [[package]]
 name = "mime"
-version = "0.3.16"
+version = "0.3.17"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
 
 [[package]]
 name = "minimal-lexical"
@@ -2277,7 +2304,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cfg-if",
  "libc",
  "memoffset 0.7.1",
@@ -2323,7 +2350,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "58ea850aa68a06e48fdb069c0ec44d0d64c8dbffa49bf3b6f7f0a901fdea1ba9"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "crossbeam-channel",
  "filetime",
  "fsevent-sys",
@@ -2453,9 +2480,9 @@
 
 [[package]]
 name = "os_str_bytes"
-version = "6.4.1"
+version = "6.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
 dependencies = [
  "memchr",
 ]
@@ -2562,7 +2589,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2590,7 +2617,7 @@
 checksum = "7e1f879b2998099c2d69ab9605d145d5b661195627eccc680002c4918a7fb6fa"
 dependencies = [
  "autocfg",
- "bitflags",
+ "bitflags 1.3.2",
  "cfg-if",
  "concurrent-queue",
  "libc",
@@ -2624,7 +2651,7 @@
  "proc-macro-error-attr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "version_check",
 ]
 
@@ -2689,7 +2716,7 @@
  "itertools",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2777,7 +2804,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
 ]
 
 [[package]]
@@ -2793,9 +2820,9 @@
 
 [[package]]
 name = "regex"
-version = "1.7.1"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -2813,9 +2840,9 @@
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.28"
+version = "0.6.29"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 
 [[package]]
 name = "roff"
@@ -2840,11 +2867,11 @@
 
 [[package]]
 name = "rustix"
-version = "0.36.9"
+version = "0.36.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc"
+checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "errno",
  "io-lifetimes",
  "libc",
@@ -2893,22 +2920,22 @@
 
 [[package]]
 name = "serde"
-version = "1.0.156"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4"
+checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.156"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d"
+checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -2924,13 +2951,13 @@
 
 [[package]]
 name = "serde_repr"
-version = "0.1.11"
+version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "395627de918015623b32e7669714206363a7fc00382bf477e72c1f7533e8eafc"
+checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -3086,7 +3113,7 @@
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3129,6 +3156,17 @@
 ]
 
 [[package]]
+name = "syn"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "2c622ae390c9302e214c31013517c2061ecb2699935882c60a9b37f82f8625ae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
 name = "sync_wrapper"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -3193,7 +3231,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "da31aef70da0f6352dbcb462683eb4dd2bfad01cf3fc96cf204547b9a839a585"
 dependencies = [
- "dirs",
+ "dirs 4.0.0",
  "fnv",
  "nom 5.1.2",
  "phf",
@@ -3213,22 +3251,22 @@
 
 [[package]]
 name = "thiserror"
-version = "1.0.39"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.39"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.4",
 ]
 
 [[package]]
@@ -3334,7 +3372,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3473,7 +3511,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3599,9 +3637,9 @@
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.11"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
 
 [[package]]
 name = "unicode-bom"
@@ -3715,12 +3753,11 @@
 
 [[package]]
 name = "walkdir"
-version = "2.3.2"
+version = "2.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
 dependencies = [
  "same-file",
- "winapi",
  "winapi-util",
 ]
 
@@ -3767,7 +3804,7 @@
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "wasm-bindgen-shared",
 ]
 
@@ -3789,7 +3826,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3802,7 +3839,7 @@
 
 [[package]]
 name = "watchexec"
-version = "2.2.0"
+version = "2.3.0"
 dependencies = [
  "async-priority-channel",
  "async-recursion",
@@ -3827,7 +3864,7 @@
 
 [[package]]
 name = "watchexec-cli"
-version = "1.22.0"
+version = "1.22.2"
 dependencies = [
  "argfile",
  "bosion",
@@ -3838,7 +3875,7 @@
  "clap_mangen",
  "command-group",
  "console-subscriber",
- "dirs",
+ "dirs 5.0.0",
  "embed-resource",
  "futures",
  "humantime",
@@ -3904,7 +3941,7 @@
 
 [[package]]
 name = "watchexec-filterer-tagged"
-version = "0.2.0"
+version = "0.3.0"
 dependencies = [
  "futures",
  "globset",
@@ -4005,6 +4042,15 @@
 ]
 
 [[package]]
+name = "windows"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
 name = "windows-sys"
 version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -4135,9 +4181,9 @@
 
 [[package]]
 name = "zbus"
-version = "3.11.0"
+version = "3.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "20aae5dd5b051971cd2f49f9f3b860e57b2b495ba5ba254eaec42d34ede57e97"
+checksum = "3dc29e76f558b2cb94190e8605ecfe77dd40f5df8c072951714b4b71a97f5848"
 dependencies = [
  "async-broadcast",
  "async-executor",
@@ -4149,7 +4195,7 @@
  "async-trait",
  "byteorder",
  "derivative",
- "dirs",
+ "dirs 4.0.0",
  "enumflags2",
  "event-listener",
  "futures-core",
@@ -4174,15 +4220,15 @@
 
 [[package]]
 name = "zbus_macros"
-version = "3.11.0"
+version = "3.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9264b3a1bcf5503d4e0348b6e7efe1da58d4f92a913c15ed9e63b52de85faaa1"
+checksum = "62a80fd82c011cd08459eaaf1fd83d3090c1b61e6d5284360074a7475af3a85d"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
  "regex",
- "syn",
+ "syn 1.0.109",
  "zvariant_utils",
 ]
 
@@ -4220,7 +4266,7 @@
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "zvariant_utils",
 ]
 
@@ -4232,5 +4278,5 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/Cargo.toml 
new/watchexec-1.22.2/crates/cli/Cargo.toml
--- old/watchexec-1.22.0/crates/cli/Cargo.toml  2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/crates/cli/Cargo.toml  2023-03-22 12:37:49.000000000 
+0100
@@ -1,6 +1,6 @@
 [package]
 name = "watchexec-cli"
-version = "1.22.0"
+version = "1.22.2"
 
 authors = ["Félix Saparelli <[email protected]>", "Matt Green 
<[email protected]>"]
 license = "Apache-2.0"
@@ -25,7 +25,7 @@
 clap_complete = "4.1.4"
 clap_complete_nushell = "0.1.10"
 clap_mangen = "0.2.9"
-dirs = "4.0.0"
+dirs = "5.0.0"
 futures = "0.3.17"
 humantime = "2.1.0"
 is-terminal = "0.4.4"
@@ -60,7 +60,7 @@
 path = "../project-origins"
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../lib"
 
 [dependencies.watchexec-events]
@@ -134,8 +134,10 @@
 assets = [
        ["../../target/release/watchexec", "usr/bin/watchexec", "755"],
        ["README.md", "usr/share/doc/watchexec/README", "644"],
-       ["../../doc/watchexec.1.html", 
"usr/share/doc/watchexec/watchexec.1.html", "644"],
+       ["../../doc/watchexec.1.md", "usr/share/doc/watchexec/watchexec.1.md", 
"644"],
        ["../../doc/watchexec.1", "usr/share/man/man1/watchexec.1.html", "644"],
+       ["../../completions/bash", 
"usr/share/bash-completion/completions/watchexec", "644"],
+       ["../../completions/fish", "usr/share/fish/completions/watchexec.fish", 
"644"],
        ["../../completions/zsh", "usr/share/zsh/site-functions/_watchexec", 
"644"],
        ["../../doc/logo.svg", 
"usr/share/icons/hicolor/scalable/apps/watchexec.svg", "644"],
 ]
@@ -144,8 +146,10 @@
 assets = [
        { source = "../../target/release/watchexec", dest = 
"/usr/bin/watchexec", mode = "755" },
        { source = "README.md", dest = "/usr/share/doc/watchexec/README", mode 
= "644", doc = true },
-       { source = "../../doc/watchexec.1.html", dest = 
"/usr/share/doc/watchexec/watchexec.1.html", mode = "644", doc = true },
+       { source = "../../doc/watchexec.1.md", dest = 
"/usr/share/doc/watchexec/watchexec.1.md", mode = "644", doc = true },
        { source = "../../doc/watchexec.1", dest = 
"/usr/share/man/man1/watchexec.1.html", mode = "644" },
+       { source = "../../completions/bash", dest = 
"/usr/share/bash-completion/completions/watchexec", mode = "644" },
+       { source = "../../completions/fish", dest = 
"/usr/share/fish/completions/watchexec.fish", mode = "644" },
        { source = "../../completions/zsh", dest = 
"/usr/share/zsh/site-functions/_watchexec", mode = "644" },
        { source = "../../doc/logo.svg", dest = 
"/usr/share/icons/hicolor/scalable/apps/watchexec.svg", mode = "644" },
        # set conf = true for config file when that lands
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/src/args.rs 
new/watchexec-1.22.2/crates/cli/src/args.rs
--- old/watchexec-1.22.0/crates/cli/src/args.rs 2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/crates/cli/src/args.rs 2023-03-22 12:37:49.000000000 
+0100
@@ -174,6 +174,9 @@
        /// controlled by '--stop-signal'.
        ///
        /// See the long documentation for '--stop-signal' for syntax.
+       ///
+       /// Signals are not supported on Windows at the moment, and will always 
be overridden to 'kill'.
+       /// See '--stop-signal' for more on Windows "signals".
        #[arg(
                short,
                long,
@@ -214,6 +217,9 @@
        /// Takes a unit-less value in seconds, or a time span value such as 
"5min 20s".
        ///
        /// The default is 60 seconds. Set to 0 to immediately force-kill the 
command.
+       ///
+       /// This has no practical effect on Windows as the command is always 
forcefully terminated; see
+       /// '--stop-signal' for why.
        #[arg(
                long,
                default_value = "60",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/src/config/runtime.rs 
new/watchexec-1.22.2/crates/cli/src/config/runtime.rs
--- old/watchexec-1.22.0/crates/cli/src/config/runtime.rs       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/cli/src/config/runtime.rs       2023-03-22 
12:37:49.000000000 +0100
@@ -169,13 +169,15 @@
 
                let when_idle = start.clone();
                let when_running = match on_busy {
+                       OnBusyUpdate::Restart if cfg!(windows) => 
Outcome::both(Outcome::Stop, start),
                        OnBusyUpdate::Restart => Outcome::both(
                                Outcome::both(
                                        
Outcome::Signal(stop_signal.unwrap_or(Signal::Terminate)),
-                                       
Outcome::both(Outcome::Sleep(stop_timeout), Outcome::Stop),
+                                       Outcome::wait_timeout(stop_timeout, 
Outcome::Stop),
                                ),
                                start,
                        ),
+                       OnBusyUpdate::Signal if cfg!(windows) => Outcome::Stop,
                        OnBusyUpdate::Signal => {
                                
Outcome::Signal(stop_signal.or(signal).unwrap_or(Signal::Terminate))
                        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/src/filterer/globset.rs 
new/watchexec-1.22.2/crates/cli/src/filterer/globset.rs
--- old/watchexec-1.22.0/crates/cli/src/filterer/globset.rs     2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/cli/src/filterer/globset.rs     2023-03-22 
12:37:49.000000000 +0100
@@ -129,6 +129,100 @@
                        }
                }
 
-               self.inner.check_event(event, priority)
+               #[cfg(windows)]
+               {
+                       let normalised = 
windows_norm::normalise_event_to_unix(event, false);
+                       trace!(event=?normalised, "check against 
unix-normalised event");
+                       if !self.inner.check_event(&normalised, priority)? {
+                               return Ok(false);
+                       }
+
+                       let prefixed_normalised = 
windows_norm::normalise_event_to_unix(event, true);
+                       trace!(event=?prefixed_normalised, "check against 
prefixed unix-normalised event");
+                       if !self.inner.check_event(&prefixed_normalised, 
priority)? {
+                               return Ok(false);
+                       }
+               }
+
+               trace!("check against original event");
+               if !self.inner.check_event(event, priority)? {
+                       return Ok(false);
+               }
+
+               Ok(true)
+       }
+}
+
+#[cfg(windows)]
+mod windows_norm {
+       use std::{
+               ffi::OsString,
+               path::{Component, Path, PathBuf},
+       };
+       use watchexec_events::{Event, Tag};
+
+       pub fn normalise_event_to_unix(event: &Event, with_prefix: bool) -> 
Event {
+               let mut path_normalised_event = event.clone();
+               for mut tag in &mut path_normalised_event.tags {
+                       if let Tag::Path { ref mut path, .. } = &mut tag {
+                               *path = normalise_path_to_unix(path, 
with_prefix);
+                       }
+               }
+               path_normalised_event
+       }
+
+       pub fn normalise_path_to_unix(path: &Path, with_prefix: bool) -> 
PathBuf {
+               let mut newpath = 
OsString::with_capacity(path.as_os_str().len());
+               let mut skip_root = false;
+               for component in path.components() {
+                       if matches!(component, Component::Prefix(_)) {
+                               if with_prefix {
+                                       newpath.push(component.as_os_str());
+                                       skip_root = true;
+                               }
+                       } else if matches!(component, Component::RootDir) && 
skip_root {
+                               // skip
+                       } else {
+                               newpath.push("/");
+                               newpath.push(component.as_os_str());
+                       }
+               }
+
+               PathBuf::from(newpath)
+       }
+
+       #[cfg(test)]
+       #[test]
+       fn test_normalise_path_to_unix() {
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("C:\\Users\\foo\\bar"), false),
+                       PathBuf::from("/Users/foo/bar")
+               );
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("C:\\Users\\foo\\bar"), true),
+                       PathBuf::from("C:/Users/foo/bar")
+               );
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("E:\\_temp\\folder_to_watch\\private"), false),
+                       PathBuf::from("/_temp/folder_to_watch/private")
+               );
+               assert_eq!(
+                       
normalise_path_to_unix(Path::new("E:\\_temp\\folder_to_watch\\private"), true),
+                       PathBuf::from("E:/_temp/folder_to_watch/private")
+               );
+               assert_eq!(
+                       normalise_path_to_unix(
+                               
Path::new("\\\\?\\E:\\_temp\\folder_to_watch\\public\\.hgignore"),
+                               false
+                       ),
+                       PathBuf::from("/_temp/folder_to_watch/public/.hgignore")
+               );
+               assert_eq!(
+                       normalise_path_to_unix(
+                               
Path::new("\\\\?\\E:\\_temp\\folder_to_watch\\public\\.hgignore"),
+                               true
+                       ),
+                       
PathBuf::from("\\\\?\\E:/_temp/folder_to_watch/public/.hgignore")
+               );
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/cli/watchexec.exe.manifest 
new/watchexec-1.22.2/crates/cli/watchexec.exe.manifest
--- old/watchexec-1.22.0/crates/cli/watchexec.exe.manifest      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/cli/watchexec.exe.manifest      2023-03-22 
12:37:49.000000000 +0100
@@ -3,7 +3,7 @@
        <assemblyIdentity
                type="win32"
                name="Watchexec.Cli.watchexec"
-               version="1.22.0.0"
+               version="1.22.2.0"
        />
 
        <trustInfo>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/globset/Cargo.toml 
new/watchexec-1.22.2/crates/filterer/globset/Cargo.toml
--- old/watchexec-1.22.0/crates/filterer/globset/Cargo.toml     2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/globset/Cargo.toml     2023-03-22 
12:37:49.000000000 +0100
@@ -24,7 +24,7 @@
 path = "../../ignore-files"
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../../lib"
 
 [dependencies.watchexec-filterer-ignore]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/ignore/Cargo.toml 
new/watchexec-1.22.2/crates/filterer/ignore/Cargo.toml
--- old/watchexec-1.22.0/crates/filterer/ignore/Cargo.toml      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/ignore/Cargo.toml      2023-03-22 
12:37:49.000000000 +0100
@@ -24,7 +24,7 @@
 path = "../../ignore-files"
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../../lib"
 
 [dependencies.watchexec-signals]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/tagged/CHANGELOG.md 
new/watchexec-1.22.2/crates/filterer/tagged/CHANGELOG.md
--- old/watchexec-1.22.0/crates/filterer/tagged/CHANGELOG.md    2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/tagged/CHANGELOG.md    2023-03-22 
12:37:49.000000000 +0100
@@ -2,6 +2,8 @@
 
 ## Next (YYYY-MM-DD)
 
+## v0.3.0 (2023-03-18)
+
 - Ditch MSRV policy. The `rust-version` indication will remain, for the 
minimum estimated Rust version for the code features used in the crate's own 
code, but dependencies may have already moved on. From now on, only latest 
stable is assumed and tested for. 
([#510](https://github.com/watchexec/watchexec/pull/510))
 
 ## v0.2.0 (2023-01-09)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/filterer/tagged/Cargo.toml 
new/watchexec-1.22.2/crates/filterer/tagged/Cargo.toml
--- old/watchexec-1.22.0/crates/filterer/tagged/Cargo.toml      2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/filterer/tagged/Cargo.toml      2023-03-22 
12:37:49.000000000 +0100
@@ -1,6 +1,6 @@
 [package]
 name = "watchexec-filterer-tagged"
-version = "0.2.0"
+version = "0.3.0"
 
 authors = ["Félix Saparelli <[email protected]>"]
 license = "Apache-2.0"
@@ -37,7 +37,7 @@
 ]
 
 [dependencies.watchexec]
-version = "2.2.0"
+version = "2.3.0"
 path = "../../lib"
 
 [dependencies.watchexec-filterer-ignore]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/CHANGELOG.md 
new/watchexec-1.22.2/crates/lib/CHANGELOG.md
--- old/watchexec-1.22.0/crates/lib/CHANGELOG.md        2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/CHANGELOG.md        2023-03-22 
12:37:49.000000000 +0100
@@ -2,6 +2,14 @@
 
 ## Next (YYYY-MM-DD)
 
+## v2.3.0 (2023-03-22)
+
+- New: `Outcome::Race` and `Outcome::race()` 
([#548](https://github.com/watchexec/watchexec/pull/548))
+- New: `Outcome::wait_timeout()` 
([#548](https://github.com/watchexec/watchexec/pull/548))
+- New: `Outcome::sequence()` 
([#548](https://github.com/watchexec/watchexec/pull/548))
+- Fix: `kill_on_drop(true)` set for group commands as well as ungrouped 
([#549](https://github.com/watchexec/watchexec/pull/549))
+- Some `debug!`s upgraded to `info!`s, based on experience reading logs 
([#547](https://github.com/watchexec/watchexec/pull/547))
+
 ## v2.2.0 (2023-03-18)
 
 - Ditch MSRV policy. The `rust-version` indication will remain, for the 
minimum estimated Rust version for the code features used in the crate's own 
code, but dependencies may have already moved on. From now on, only latest 
stable is assumed and tested for. 
([#510](https://github.com/watchexec/watchexec/pull/510))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/Cargo.toml 
new/watchexec-1.22.2/crates/lib/Cargo.toml
--- old/watchexec-1.22.0/crates/lib/Cargo.toml  2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/crates/lib/Cargo.toml  2023-03-22 12:37:49.000000000 
+0100
@@ -1,6 +1,6 @@
 [package]
 name = "watchexec"
-version = "2.2.0"
+version = "2.3.0"
 
 authors = ["Matt Green <[email protected]>", "Félix Saparelli 
<[email protected]>"]
 license = "Apache-2.0"
@@ -27,7 +27,7 @@
 normalize-path = "0.2.0"
 
 [dependencies.command-group]
-version = "2.0.1"
+version = "2.1.0"
 features = ["with-tokio"]
 
 [dependencies.watchexec-events]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/src/action/outcome.rs 
new/watchexec-1.22.2/crates/lib/src/action/outcome.rs
--- old/watchexec-1.22.0/crates/lib/src/action/outcome.rs       2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/action/outcome.rs       2023-03-22 
12:37:49.000000000 +0100
@@ -56,6 +56,9 @@
 
        /// Do both outcomes in order.
        Both(Box<Outcome>, Box<Outcome>),
+
+       /// Race both outcomes: run both at once, and when one finishes, cancel 
the other.
+       Race(Box<Outcome>, Box<Outcome>),
 }
 
 impl Default for Outcome {
@@ -77,10 +80,32 @@
                Self::Both(Box::new(one), Box::new(two))
        }
 
-       /// Convenience function to wait for the subprocess to complete before 
executing the outcome.
+       /// Pattern that creates a sequence of outcomes from an iterator.
+       #[must_use]
+       pub fn sequence(mut outcomes: impl Iterator<Item = Self>) -> Self {
+               let mut seq = outcomes.next().unwrap_or(Self::DoNothing);
+               for outcome in outcomes {
+                       seq = Self::both(seq, outcome);
+               }
+               seq
+       }
+
+       /// Convenience function to create a race of outcomes.
+       #[must_use]
+       pub fn race(one: Self, two: Self) -> Self {
+               Self::Race(Box::new(one), Box::new(two))
+       }
+
+       /// Pattern that waits for the subprocess to complete before executing 
the outcome.
        #[must_use]
        pub fn wait(and_then: Self) -> Self {
-               Self::Both(Box::new(Self::Wait), Box::new(and_then))
+               Self::both(Self::Wait, and_then)
+       }
+
+       /// Pattern that waits for the subprocess to complete with a timeout.
+       #[must_use]
+       pub fn wait_timeout(timeout: Duration, and_then: Self) -> Self {
+               Self::both(Self::race(Self::Sleep(timeout), Self::Wait), 
and_then)
        }
 
        /// Resolves the outcome given the current state of the subprocess.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/watchexec-1.22.0/crates/lib/src/action/outcome_worker.rs 
new/watchexec-1.22.2/crates/lib/src/action/outcome_worker.rs
--- old/watchexec-1.22.0/crates/lib/src/action/outcome_worker.rs        
2023-03-18 16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/action/outcome_worker.rs        
2023-03-22 12:37:49.000000000 +0100
@@ -5,13 +5,16 @@
 
 use async_priority_channel as priority;
 use clearscreen::ClearScreen;
-use futures::Future;
+use futures::{
+       future::{select, Either},
+       Future,
+};
 use tokio::{
        spawn,
        sync::{mpsc, watch::Receiver},
        time::sleep,
 };
-use tracing::{debug, error, trace, warn};
+use tracing::{debug, error, info, trace, warn};
 
 use crate::{
        command::Supervisor,
@@ -63,7 +66,7 @@
                        match this.apply(outcome.clone()).await {
                                Err(err) => {
                                        if matches!(err, RuntimeError::Exit) {
-                                               debug!(%gen, "propagating 
graceful exit");
+                                               info!(%gen, "propagating 
graceful exit");
                                        } else {
                                                error!(?err, %gen, "outcome 
applier errored");
                                        }
@@ -191,6 +194,14 @@
 
                                notry!(self.apply(*two))?;
                        }
+
+                       (_, Outcome::Race(one, two)) => {
+                               if let Either::Left((Err(err), _)) | 
Either::Right((Err(err), _)) =
+                                       select(self.apply(*one), 
self.apply(*two)).await
+                               {
+                                       return Err(err);
+                               }
+                       }
                }
 
                Ok(())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/crates/lib/src/action/worker.rs 
new/watchexec-1.22.2/crates/lib/src/action/worker.rs
--- old/watchexec-1.22.0/crates/lib/src/action/worker.rs        2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/action/worker.rs        2023-03-22 
12:37:49.000000000 +0100
@@ -11,7 +11,7 @@
        },
        time::timeout,
 };
-use tracing::{debug, trace};
+use tracing::{debug, info, trace};
 
 use crate::{
        error::{CriticalError, RuntimeError},
@@ -123,7 +123,7 @@
                #[allow(clippy::iter_with_drain)]
                let events = 
Arc::from(set.drain(..).collect::<Vec<_>>().into_boxed_slice());
                let action = Action::new(Arc::clone(&events));
-               debug!(?action, "action constructed");
+               info!(?action, "action constructed");
 
                debug!("running action handler");
                let action_handler = {
@@ -143,10 +143,10 @@
                }
 
                let outcome = outcome.get().cloned().unwrap_or_default();
-               debug!(?outcome, "handler finished");
+               debug!(?outcome, "action handler finished");
 
                let outcome = outcome.resolve(process.is_running().await);
-               debug!(?outcome, "outcome resolved");
+               info!(?outcome, "outcome resolved");
 
                OutcomeWorker::spawn(
                        outcome,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/watchexec-1.22.0/crates/lib/src/command/supervisor.rs 
new/watchexec-1.22.2/crates/lib/src/command/supervisor.rs
--- old/watchexec-1.22.0/crates/lib/src/command/supervisor.rs   2023-03-18 
16:06:47.000000000 +0100
+++ new/watchexec-1.22.2/crates/lib/src/command/supervisor.rs   2023-03-22 
12:37:49.000000000 +0100
@@ -9,7 +9,7 @@
                watch,
        },
 };
-use tracing::{debug, debug_span, error, trace, Span};
+use tracing::{debug, debug_span, error, info, trace, Span};
 use watchexec_signals::Signal;
 
 use crate::{
@@ -280,7 +280,6 @@
        let (pre_spawn, spawnable) = span.in_scope::<_, Result<_, 
RuntimeError>>(|| {
                debug!(%grouped, ?command, "preparing command");
                let mut spawnable = command.to_spawnable()?;
-               spawnable.kill_on_drop(true);
 
                // Required from Rust 1.66:
                // https://github.com/rust-lang/rust/pull/101077
@@ -320,24 +319,30 @@
                        .map_err(|_| 
RuntimeError::HandlerLockHeld("pre-spawn"))?
                        .into_inner();
 
-               debug!(command=?spawnable, "spawning command");
+               info!(command=?spawnable, "spawning command");
                let (proc, id) = if grouped {
                        let proc = spawnable
-                               .group_spawn()
+                               .group()
+                               .kill_on_drop(true)
+                               .spawn()
                                .map_err(|err| RuntimeError::IoError {
                                        about: "spawning process group",
                                        err,
                                })?;
                        let id = 
proc.id().ok_or(RuntimeError::ProcessDeadOnArrival)?;
-                       debug!(pgid=%id, "process group spawned");
+                       info!(pgid=%id, "process group spawned");
                        (Process::Grouped(proc), id)
                } else {
-                       let proc = spawnable.spawn().map_err(|err| 
RuntimeError::IoError {
-                               about: "spawning process (ungrouped)",
-                               err,
-                       })?;
+                       let proc =
+                               spawnable
+                                       .kill_on_drop(true)
+                                       .spawn()
+                                       .map_err(|err| RuntimeError::IoError {
+                                               about: "spawning process 
(ungrouped)",
+                                               err,
+                                       })?;
                        let id = 
proc.id().ok_or(RuntimeError::ProcessDeadOnArrival)?;
-                       debug!(pid=%id, "process spawned");
+                       info!(pid=%id, "process spawned");
                        (Process::Ungrouped(proc), id)
                };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/doc/watchexec.1 
new/watchexec-1.22.2/doc/watchexec.1
--- old/watchexec-1.22.0/doc/watchexec.1        2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/doc/watchexec.1        2023-03-22 12:37:49.000000000 
+0100
@@ -1,6 +1,6 @@
 .ie \n(.g .ds Aq \(aq
 .el .ds Aq '
-.TH watchexec 1  "watchexec 1.22.0" 
+.TH watchexec 1  "watchexec 1.22.2" 
 .SH NAME
 watchexec \- Execute commands when watched files change
 .SH SYNOPSIS
@@ -71,6 +71,8 @@
 Specify a signal to send to the process when it\*(Aqs still running. This 
implies \*(Aq\-\-on\-busy\-update=signal\*(Aq; otherwise the signal used when 
that mode is \*(Aqrestart\*(Aq is controlled by \*(Aq\-\-stop\-signal\*(Aq.
 
 See the long documentation for \*(Aq\-\-stop\-signal\*(Aq for syntax.
+
+Signals are not supported on Windows at the moment, and will always be 
overridden to \*(Aqkill\*(Aq. See \*(Aq\-\-stop\-signal\*(Aq for more on 
Windows "signals".
 .TP
 \fB\-\-stop\-signal\fR=\fISIGNAL\fR
 Signal to send to stop the command
@@ -91,6 +93,8 @@
 Takes a unit\-less value in seconds, or a time span value such as "5min 20s".
 
 The default is 60 seconds. Set to 0 to immediately force\-kill the command.
+
+This has no practical effect on Windows as the command is always forcefully 
terminated; see \*(Aq\-\-stop\-signal\*(Aq for why.
 .TP
 \fB\-\-debounce\fR=\fITIMEOUT\fR
 Time to wait for new events before taking action
@@ -468,6 +472,6 @@
 .SH EXTRA
 Use @argfile as first argument to load arguments from the file 
\*(Aqargfile\*(Aq (one argument per line) which will be inserted in place of 
the @argfile (further arguments on the CLI will override or add onto those in 
the file).
 .SH VERSION
-v1.22.0
+v1.22.2
 .SH AUTHORS
 Félix Saparelli <[email protected]>, Matt Green <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/watchexec-1.22.0/doc/watchexec.1.md 
new/watchexec-1.22.2/doc/watchexec.1.md
--- old/watchexec-1.22.0/doc/watchexec.1.md     2023-03-18 16:06:47.000000000 
+0100
+++ new/watchexec-1.22.2/doc/watchexec.1.md     2023-03-22 12:37:49.000000000 
+0100
@@ -113,6 +113,9 @@
 
 See the long documentation for \--stop-signal for syntax.
 
+Signals are not supported on Windows at the moment, and will always be
+overridden to kill. See \--stop-signal for more on Windows \"signals\".
+
 **\--stop-signal**=*SIGNAL*
 
 :   Signal to send to stop the command
@@ -149,6 +152,9 @@
 The default is 60 seconds. Set to 0 to immediately force-kill the
 command.
 
+This has no practical effect on Windows as the command is always
+forcefully terminated; see \--stop-signal for why.
+
 **\--debounce**=*TIMEOUT*
 
 :   Time to wait for new events before taking action
@@ -667,7 +673,7 @@
 
 # VERSION
 
-v1.22.0
+v1.22.2
 
 # AUTHORS
 
Binary files old/watchexec-1.22.0/doc/watchexec.1.pdf and 
new/watchexec-1.22.2/doc/watchexec.1.pdf differ

++++++ watchexec.obsinfo ++++++
--- /var/tmp/diff_new_pack.jgfT4p/_old  2023-03-22 22:32:44.254825887 +0100
+++ /var/tmp/diff_new_pack.jgfT4p/_new  2023-03-22 22:32:44.258825907 +0100
@@ -1,5 +1,5 @@
 name: watchexec
-version: 1.22.0
-mtime: 1679152007
-commit: c337ebca869abe99595e61c6be430296a0bf39fb
+version: 1.22.2
+mtime: 1679485069
+commit: e8391cd1d07b4d2b597fdbf1f4b77d01d6504a8a
 

Reply via email to