Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package fd for openSUSE:Factory checked in 
at 2022-02-05 23:23:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fd (Old)
 and      /work/SRC/openSUSE:Factory/.fd.new.1898 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fd"

Sat Feb  5 23:23:25 2022 rev:13 rq:951787 version:8.3.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/fd/fd.changes    2022-01-08 23:24:24.446270249 
+0100
+++ /work/SRC/openSUSE:Factory/.fd.new.1898/fd.changes  2022-02-05 
23:24:39.775317443 +0100
@@ -1,0 +2,14 @@
+Sat Jan 29 16:58:24 UTC 2022 - [email protected]
+
+- Update to version 8.3.2:
+  * Add temporary version of logo
+  * Bump version to v8.3.2
+  * Add clippy run in CI/CD
+  * Add tavianator sponsoring link
+  * Bump MSRV to 1.54
+  * Upgrade to clap 3.0
+  * Add CHANGELOG entry
+  * Change test_opposing to be less flaky.
+  * Update normpath to 0.3.2 to fix issue #931
+
+-------------------------------------------------------------------
@@ -6,0 +21 @@
+>>>>>>> ./fd.changes.new

Old:
----
  fd-8.3.1.tar.gz

New:
----
  _service
  _servicedata
  fd-8.3.2.obscpio
  fd-8.3.2.tar.gz
  fd.obsinfo

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

Other differences:
------------------
++++++ fd.spec ++++++
--- /var/tmp/diff_new_pack.BuuunL/_old  2022-02-05 23:24:40.515312382 +0100
+++ /var/tmp/diff_new_pack.BuuunL/_new  2022-02-05 23:24:40.519312355 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           fd
-Version:        8.3.1
+Version:        8.3.2
 Release:        0
 Summary:        An alternative to the "find" utility
 License:        Apache-2.0 AND MIT

++++++ _service ++++++
<services>
  <service mode="disabled" name="obs_scm">
    <param name="url">https://github.com/sharkdp/fd.git</param>
    <param name="versionformat">@PARENT_TAG@</param>
    <param name="scm">git</param>
    <param name="revision">v8.3.2</param>
    <param name="match-tag">*</param>
    <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param>
    <param name="versionrewrite-replacement">\1</param>
    <param name="changesgenerate">enable</param>
  </service>
  <service mode="disabled" name="tar" />
  <service mode="disabled" name="recompress">
    <param name="file">*.tar</param>
    <param name="compression">xz</param>
  </service>
  <service mode="disabled" name="set_version" />
  <service name="cargo_vendor" mode="disabled">
     <param name="srcdir">fd</param>
     <param name="compression">xz</param>
     <param name="update">true</param>
  </service>
  <service name="cargo_audit" mode="disabled" />
</services>

++++++ _servicedata ++++++
<servicedata>
<service name="tar_scm">
                <param name="url">https://github.com/sharkdp/fd.git</param>
              <param 
name="changesrevision">9f5ed8534e824b3e2a0934ff3aa0b781cb370688</param></service></servicedata>
(No newline at EOF)

++++++ fd-8.3.1.tar.gz -> fd-8.3.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/.github/FUNDING.yml 
new/fd-8.3.2/.github/FUNDING.yml
--- old/fd-8.3.1/.github/FUNDING.yml    1970-01-01 01:00:00.000000000 +0100
+++ new/fd-8.3.2/.github/FUNDING.yml    2022-01-29 16:53:13.000000000 +0100
@@ -0,0 +1 @@
+github: [sharkdp, tavianator]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/.github/workflows/CICD.yml 
new/fd-8.3.2/.github/workflows/CICD.yml
--- old/fd-8.3.1/.github/workflows/CICD.yml     2022-01-06 14:20:02.000000000 
+0100
+++ new/fd-8.3.2/.github/workflows/CICD.yml     2022-01-29 16:53:13.000000000 
+0100
@@ -1,7 +1,7 @@
 name: CICD
 
 env:
-  MIN_SUPPORTED_RUST_VERSION: "1.53.0"
+  MIN_SUPPORTED_RUST_VERSION: "1.54.0"
   CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
 
 on:
@@ -46,11 +46,18 @@
     steps:
     - name: Checkout source code
       uses: actions/checkout@v2
+
     - name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
       uses: actions-rs/toolchain@v1
       with:
         toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }}
         default: true
+        components: clippy
+    - name: Run clippy (on minimum supported rust version to prevent warnings 
we can't fix)
+      uses: actions-rs/cargo@v1
+      with:
+        command: clippy
+        args: --locked --all-targets --all-features
         profile: minimal # minimal component installation (ie, no 
documentation)
     - name: Run tests
       uses: actions-rs/cargo@v1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/CHANGELOG.md new/fd-8.3.2/CHANGELOG.md
--- old/fd-8.3.1/CHANGELOG.md   2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/CHANGELOG.md   2022-01-29 16:53:13.000000000 +0100
@@ -15,6 +15,11 @@
 ## Other
 
 
+# v8.3.2
+
+## Bugfixes
+
+- Invalid absolute path on windows when searching from the drive root, see 
#931 and #936 (@gbarta)
 
 
 # v8.3.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/Cargo.lock new/fd-8.3.2/Cargo.lock
--- old/fd-8.3.1/Cargo.lock     2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/Cargo.lock     2022-01-29 16:53:13.000000000 +0100
@@ -85,18 +85,28 @@
 
 [[package]]
 name = "clap"
-version = "2.34.0"
+version = "3.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+checksum = "f6f34b09b9ee8c7c7b400fe2f8df39cafc9538b03d6ba7f4ae13e4cb90bfbb7d"
 dependencies = [
- "ansi_term",
  "atty",
  "bitflags",
+ "indexmap",
+ "lazy_static",
+ "os_str_bytes",
  "strsim",
- "term_size",
+ "termcolor",
+ "terminal_size",
  "textwrap",
- "unicode-width",
- "vec_map",
+]
+
+[[package]]
+name = "clap_complete"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a394f7ec0715b42a4e52b294984c27c9a61f77c8d82f7774c5198350be143f19"
+dependencies = [
+ "clap",
 ]
 
 [[package]]
@@ -148,13 +158,14 @@
 
 [[package]]
 name = "fd-find"
-version = "8.3.1"
+version = "8.3.2"
 dependencies = [
  "ansi_term",
  "anyhow",
  "atty",
  "chrono",
  "clap",
+ "clap_complete",
  "ctrlc",
  "diff",
  "dirs-next",
@@ -232,6 +243,12 @@
 ]
 
 [[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
+[[package]]
 name = "hermit-abi"
 version = "0.1.19"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -265,6 +282,16 @@
 ]
 
 [[package]]
+name = "indexmap"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
 name = "jemalloc-sys"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -323,9 +350,9 @@
 
 [[package]]
 name = "memoffset"
-version = "0.6.4"
+version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
 dependencies = [
  "autocfg",
 ]
@@ -345,9 +372,9 @@
 
 [[package]]
 name = "normpath"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "640c20e9df4a2d4a5adad5b47e17d76dac3e824346b181931c3ec9f7a85687b1"
+checksum = "04aaf5e9cb0fbf883cc0423159eacdf96a9878022084b35c462c428cab73bcaf"
 dependencies = [
  "winapi",
 ]
@@ -388,19 +415,28 @@
 checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
 
 [[package]]
+name = "os_str_bytes"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
 name = "proc-macro2"
-version = "1.0.32"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43"
+checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
 dependencies = [
  "unicode-xid",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.10"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
+checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d"
 dependencies = [
  "proc-macro2",
 ]
@@ -498,15 +534,15 @@
 
 [[package]]
 name = "strsim"
-version = "0.8.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
 
 [[package]]
 name = "syn"
-version = "1.0.82"
+version = "1.0.85"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59"
+checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -524,10 +560,19 @@
 ]
 
 [[package]]
-name = "term_size"
-version = "0.3.2"
+name = "termcolor"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9"
+checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
 dependencies = [
  "libc",
  "winapi",
@@ -548,12 +593,11 @@
 
 [[package]]
 name = "textwrap"
-version = "0.11.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80"
 dependencies = [
- "term_size",
- "unicode-width",
+ "terminal_size",
 ]
 
 [[package]]
@@ -576,12 +620,6 @@
 ]
 
 [[package]]
-name = "unicode-width"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
-
-[[package]]
 name = "unicode-xid"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -598,12 +636,6 @@
 ]
 
 [[package]]
-name = "vec_map"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
-
-[[package]]
 name = "version_check"
 version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/Cargo.toml new/fd-8.3.2/Cargo.toml
--- old/fd-8.3.1/Cargo.toml     2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/Cargo.toml     2022-01-29 16:53:13.000000000 +0100
@@ -16,7 +16,7 @@
 name = "fd-find"
 readme = "README.md"
 repository = "https://github.com/sharkdp/fd";
-version = "8.3.1"
+version = "8.3.2"
 edition= "2018"
 
 [badges.appveyor]
@@ -30,7 +30,8 @@
 path = "src/main.rs"
 
 [build-dependencies]
-clap = "2.34.0"
+clap = "3.0"
+clap_complete = "3.0"
 version_check = "0.9"
 
 [dependencies]
@@ -46,13 +47,13 @@
 globset = "0.4"
 anyhow = "1.0"
 dirs-next = "2.0"
-normpath = "0.3"
+normpath = "0.3.2"
 chrono = "0.4"
 once_cell = "1.9.0"
 
 [dependencies.clap]
-version = "2.34.0"
-features = ["suggestions", "color", "wrap_help"]
+version = "3.0"
+features = ["suggestions", "color", "wrap_help", "cargo"]
 
 [target.'cfg(unix)'.dependencies]
 users = "0.11.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/README.md new/fd-8.3.2/README.md
--- old/fd-8.3.1/README.md      2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/README.md      2022-01-29 16:53:13.000000000 +0100
@@ -535,7 +535,7 @@
 If you use an older version of Ubuntu, you can download the latest `.deb` 
package from the
 [release page](https://github.com/sharkdp/fd/releases) and install it via:
 ``` bash
-sudo dpkg -i fd_8.3.1_amd64.deb  # adapt version number and architecture
+sudo dpkg -i fd_8.3.2_amd64.deb  # adapt version number and architecture
 ```
 
 ### On Debian
@@ -652,7 +652,7 @@
 ```
 cargo install fd-find
 ```
-Note that rust version *1.53.0* or later is required.
+Note that rust version *1.54.0* or later is required.
 
 `make` is also needed for the build.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/build.rs new/fd-8.3.2/build.rs
--- old/fd-8.3.1/build.rs       2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/build.rs       2022-01-29 16:53:13.000000000 +0100
@@ -1,11 +1,13 @@
 use std::fs;
 
-use clap::Shell;
+use clap_complete::{generate_to, Shell};
+use Shell::*;
+//use clap_complete::shells::Shel{Bash, Fish, PowerShell, Elvish};
 
 include!("src/app.rs");
 
 fn main() {
-    let min_version = "1.53";
+    let min_version = "1.54";
 
     match version_check::is_min_version(min_version) {
         Some(true) => {}
@@ -24,7 +26,8 @@
     fs::create_dir_all(&outdir).unwrap();
 
     let mut app = build_app();
-    app.gen_completions("fd", Shell::Bash, &outdir);
-    app.gen_completions("fd", Shell::Fish, &outdir);
-    app.gen_completions("fd", Shell::PowerShell, &outdir);
+    // NOTE: zsh completions are hand written in contrib/completion/_fd
+    for shell in [Bash, PowerShell, Fish, Elvish] {
+        generate_to(shell, &mut app, "fd", &outdir).unwrap();
+    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/clippy.toml new/fd-8.3.2/clippy.toml
--- old/fd-8.3.1/clippy.toml    2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/clippy.toml    2022-01-29 16:53:13.000000000 +0100
@@ -1 +1 @@
-msrv = "1.53.0"
+msrv = "1.54.0"
Binary files old/fd-8.3.1/doc/logo.png and new/fd-8.3.2/doc/logo.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/doc/logo.svg new/fd-8.3.2/doc/logo.svg
--- old/fd-8.3.1/doc/logo.svg   1970-01-01 01:00:00.000000000 +0100
+++ new/fd-8.3.2/doc/logo.svg   2022-01-29 16:53:13.000000000 +0100
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="66mm"
+   height="66mm"
+   viewBox="0 0 66 66.000001"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
+   sodipodi:docname="logo.svg"
+   inkscape:export-filename="/home/shark/Informatik/rust/fd/doc/logo.png"
+   inkscape:export-xdpi="192.42"
+   inkscape:export-ydpi="192.42"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:svg="http://www.w3.org/2000/svg";>
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#ffffff"
+     bordercolor="#999999"
+     borderopacity="1"
+     inkscape:pageshadow="0"
+     inkscape:pageopacity="1"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="2.1795515"
+     inkscape:cx="114.47309"
+     inkscape:cy="176.18304"
+     inkscape:window-width="1920"
+     inkscape:window-height="1175"
+     inkscape:window-x="1920"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="false"
+     fit-margin-top="2"
+     fit-margin-left="2"
+     fit-margin-right="2"
+     fit-margin-bottom="2"
+     lock-margins="true">
+    <sodipodi:guide
+       position="26.228232,26.126763"
+       orientation="0,-1"
+       id="guide47826" />
+    <sodipodi:guide
+       position="25.799494,2.3628924"
+       orientation="0,-1"
+       id="guide47828" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2" />
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-21.358009,-148.28012)">
+    <g
+       id="g66267"
+       transform="matrix(0.84959471,0,0,0.84959471,7.9920783,43.351816)">
+      <text
+         xml:space="preserve"
+         
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.7126px;line-height:0;font-family:'Fira
 Sans Condensed';-inkscape-font-specification:'Fira Sans Condensed, 
';white-space:pre;inline-size:37.3715;fill:#e5e5e5;fill-opacity:1;stroke-width:0.742816"
+         x="50.647034"
+         y="173.19841"
+         id="text50653"
+         
transform="matrix(1.0604862,0,0,1.0604862,-3.3101428,-10.150043)"><tspan
+           x="50.647034"
+           y="173.19841"
+           id="tspan66635"><tspan
+             style="font-family:'Source Code 
Pro';-inkscape-font-specification:'Source Code Pro'"
+             id="tspan66633">fd</tspan></tspan></text>
+      <text
+         xml:space="preserve"
+         
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.7126px;line-height:0;font-family:'Fira
 Sans Condensed';-inkscape-font-specification:'Fira Sans Condensed, 
';white-space:pre;inline-size:37.3715;fill:#00ccff;fill-opacity:0.996078;stroke-width:0.742816"
+         x="50.647034"
+         y="173.19841"
+         id="text1244"
+         
transform="matrix(1.0604862,0,0,1.0604862,-2.8008599,-9.6407599)"><tspan
+           x="50.647034"
+           y="173.19841"
+           id="tspan66639"><tspan
+             style="font-family:'Source Code 
Pro';-inkscape-font-specification:'Source Code Pro'"
+             id="tspan66637">fd</tspan></tspan></text>
+      <g
+         id="g47824"
+         transform="translate(0.1724878,-0.35338542)">
+        <g
+           id="g42041">
+          <path
+             
style="fill:none;stroke:#939dac;stroke-width:1.065;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 28.209616,155.51329 v 15.68758 H 40.83001"
+             id="path39763"
+             sodipodi:nodetypes="ccc" />
+          <path
+             
style="fill:#b7bec8;stroke:#939dac;stroke-width:1.065;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="M 27.869464,161.83767 H 40.261291"
+             id="path39765" />
+        </g>
+        <g
+           id="g41945"
+           transform="translate(-1.0583333)">
+          <path
+             
style="fill:#0088aa;fill-opacity:0.993797;stroke:none;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 42.164961,159.42939 -1.554274,-1.89462 -1.975227,-0.005 c 
-0.941841,0.014 -1.165466,0.27232 -1.14085,2.88812 z"
+             id="path40006"
+             sodipodi:nodetypes="ccccc" />
+          <rect
+             
style="fill:#01ccff;fill-opacity:1;stroke:none;stroke-width:2.3;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.80126;paint-order:stroke
 fill markers"
+             id="rect39949"
+             width="9.4925022"
+             height="6.2080379"
+             x="37.492516"
+             y="158.82776"
+             ry="0.90871465" />
+        </g>
+        <g
+           id="g41951"
+           transform="translate(-1.0583334,9.3665773)">
+          <path
+             
style="fill:#373e48;fill-opacity:0.993797;stroke:none;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 42.164961,159.42939 -1.554274,-1.89462 -1.975227,-0.005 c 
-0.941841,0.014 -1.165466,0.27232 -1.14085,2.88812 z"
+             id="path41947"
+             sodipodi:nodetypes="ccccc" />
+          <rect
+             
style="fill:#535d6c;fill-opacity:0.993797;stroke:none;stroke-width:2.3;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.80126;paint-order:stroke
 fill markers"
+             id="rect41949"
+             width="9.4925022"
+             height="6.2080379"
+             x="37.492516"
+             y="158.82776"
+             ry="0.90871465" />
+        </g>
+        <g
+           id="g41957"
+           transform="translate(-14.306994,-6.8962642)">
+          <path
+             
style="fill:#373e48;fill-opacity:0.993797;stroke:none;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 42.164961,159.42939 -1.554274,-1.89462 -1.975227,-0.005 c 
-0.941841,0.014 -1.165466,0.27232 -1.14085,2.88812 z"
+             id="path41953"
+             sodipodi:nodetypes="ccccc" />
+          <rect
+             
style="fill:#535d6c;fill-opacity:0.993797;stroke:none;stroke-width:2.3;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.80126;paint-order:stroke
 fill markers"
+             id="rect41955"
+             width="9.4925022"
+             height="6.2080379"
+             x="37.492516"
+             y="158.82776"
+             ry="0.90871465" />
+        </g>
+      </g>
+      <g
+         id="g65006"
+         transform="matrix(0.55302761,0,0,0.55302761,66.463548,117.45819)" />
+    </g>
+  </g>
+</svg>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/src/app.rs new/fd-8.3.2/src/app.rs
--- old/fd-8.3.1/src/app.rs     2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/src/app.rs     2022-01-29 16:53:13.000000000 +0100
@@ -1,25 +1,25 @@
-use clap::{crate_version, App, AppSettings, Arg};
+use clap::{crate_version, App, AppSettings, Arg, ColorChoice};
 
-pub fn build_app() -> App<'static, 'static> {
-    let clap_color_setting = if std::env::var_os("NO_COLOR").is_none() {
-        AppSettings::ColoredHelp
+pub fn build_app() -> App<'static> {
+    let clap_color_choice = if std::env::var_os("NO_COLOR").is_none() {
+        ColorChoice::Auto
     } else {
-        AppSettings::ColorNever
+        ColorChoice::Never
     };
 
     let mut app = App::new("fd")
         .version(crate_version!())
-        .usage("fd [FLAGS/OPTIONS] [<pattern>] [<path>...]")
-        .setting(clap_color_setting)
+        .color(clap_color_choice)
         .setting(AppSettings::DeriveDisplayOrder)
+        .setting(AppSettings::DontCollapseArgsInUsage)
         .after_help(
             "Note: `fd -h` prints a short and concise overview while `fd 
--help` gives all \
                  details.",
         )
         .arg(
-            Arg::with_name("hidden")
+            Arg::new("hidden")
                 .long("hidden")
-                .short("H")
+                .short('H')
                 .overrides_with("hidden")
                 .help("Search hidden files and directories")
                 .long_help(
@@ -30,18 +30,18 @@
                 ),
         )
         .arg(
-            Arg::with_name("no-hidden")
+            Arg::new("no-hidden")
                 .long("no-hidden")
                 .overrides_with("hidden")
-                .hidden(true)
+                .hide(true)
                 .long_help(
                     "Overrides --hidden.",
                 ),
         )
         .arg(
-            Arg::with_name("no-ignore")
+            Arg::new("no-ignore")
                 .long("no-ignore")
-                .short("I")
+                .short('I')
                 .overrides_with("no-ignore")
                 .help("Do not respect .(git|fd)ignore files")
                 .long_help(
@@ -51,19 +51,19 @@
                 ),
         )
         .arg(
-            Arg::with_name("ignore")
+            Arg::new("ignore")
                 .long("ignore")
                 .overrides_with("no-ignore")
-                .hidden(true)
+                .hide(true)
                 .long_help(
                     "Overrides --no-ignore.",
                 ),
         )
         .arg(
-            Arg::with_name("no-ignore-vcs")
+            Arg::new("no-ignore-vcs")
                 .long("no-ignore-vcs")
                 .overrides_with("no-ignore-vcs")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Do not respect .gitignore files")
                 .long_help(
                     "Show search results from files and directories that would 
otherwise be \
@@ -71,19 +71,19 @@
                 ),
         )
         .arg(
-            Arg::with_name("ignore-vcs")
+            Arg::new("ignore-vcs")
                 .long("ignore-vcs")
                 .overrides_with("no-ignore-vcs")
-                .hidden(true)
+                .hide(true)
                 .long_help(
                     "Overrides --no-ignore-vcs.",
                 ),
         )
         .arg(
-            Arg::with_name("no-ignore-parent")
+            Arg::new("no-ignore-parent")
                 .long("no-ignore-parent")
                 .overrides_with("no-ignore-parent")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Do not respect .(git|fd)ignore files in parent 
directories")
                 .long_help(
                     "Show search results from files and directories that would 
otherwise be \
@@ -91,19 +91,19 @@
                 ),
         )
         .arg(
-            Arg::with_name("no-global-ignore-file")
+            Arg::new("no-global-ignore-file")
                 .long("no-global-ignore-file")
-                .hidden(true)
+                .hide(true)
                 .help("Do not respect the global ignore file")
                 .long_help("Do not respect the global ignore file."),
         )
         .arg(
-            Arg::with_name("rg-alias-hidden-ignore")
-                .short("u")
+            Arg::new("rg-alias-hidden-ignore")
+                .short('u')
                 .long("unrestricted")
                 .overrides_with_all(&["ignore", "no-hidden"])
-                .multiple(true)
-                .hidden_short_help(true)
+                .multiple_occurrences(true)
+                .hide_short_help(true)
                 .help("Alias for '--no-ignore', and '--hidden' when given 
twice")
                 .long_help(
                     "Alias for '--no-ignore'. Can be repeated. '-uu' is an 
alias for \
@@ -111,9 +111,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("case-sensitive")
+            Arg::new("case-sensitive")
                 .long("case-sensitive")
-                .short("s")
+                .short('s')
                 .overrides_with_all(&["ignore-case", "case-sensitive"])
                 .help("Case-sensitive search (default: smart case)")
                 .long_help(
@@ -123,9 +123,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("ignore-case")
+            Arg::new("ignore-case")
                 .long("ignore-case")
-                .short("i")
+                .short('i')
                 .overrides_with_all(&["case-sensitive", "ignore-case"])
                 .help("Case-insensitive search (default: smart case)")
                 .long_help(
@@ -135,19 +135,19 @@
                 ),
         )
         .arg(
-            Arg::with_name("glob")
+            Arg::new("glob")
                 .long("glob")
-                .short("g")
+                .short('g')
                 .conflicts_with("fixed-strings")
                 .overrides_with("glob")
                 .help("Glob-based search (default: regular expression)")
                 .long_help("Perform a glob-based search instead of a regular 
expression search."),
         )
         .arg(
-            Arg::with_name("regex")
+            Arg::new("regex")
                 .long("regex")
                 .overrides_with_all(&["glob", "regex"])
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Regular-expression based search (default)")
                 .long_help(
                     "Perform a regular-expression based search (default). This 
can be used to \
@@ -155,12 +155,12 @@
                 ),
         )
         .arg(
-            Arg::with_name("fixed-strings")
+            Arg::new("fixed-strings")
                 .long("fixed-strings")
-                .short("F")
+                .short('F')
                 .alias("literal")
                 .overrides_with("fixed-strings")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Treat pattern as literal string instead of regex")
                 .long_help(
                     "Treat the pattern as a literal string instead of a 
regular expression. Note \
@@ -169,9 +169,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("absolute-path")
+            Arg::new("absolute-path")
                 .long("absolute-path")
-                .short("a")
+                .short('a')
                 .overrides_with("absolute-path")
                 .help("Show absolute instead of relative paths")
                 .long_help(
@@ -180,18 +180,18 @@
                 ),
         )
         .arg(
-            Arg::with_name("relative-path")
+            Arg::new("relative-path")
                 .long("relative-path")
                 .overrides_with("absolute-path")
-                .hidden(true)
+                .hide(true)
                 .long_help(
                     "Overrides --absolute-path.",
                 ),
         )
         .arg(
-            Arg::with_name("list-details")
+            Arg::new("list-details")
                 .long("list-details")
-                .short("l")
+                .short('l')
                 .conflicts_with("absolute-path")
                 .help("Use a long listing format with file metadata")
                 .long_help(
@@ -202,9 +202,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("follow")
+            Arg::new("follow")
                 .long("follow")
-                .short("L")
+                .short('L')
                 .alias("dereference")
                 .overrides_with("follow")
                 .help("Follow symbolic links")
@@ -215,18 +215,18 @@
                 ),
         )
         .arg(
-            Arg::with_name("no-follow")
+            Arg::new("no-follow")
                 .long("no-follow")
                 .overrides_with("follow")
-                .hidden(true)
+                .hide(true)
                 .long_help(
                     "Overrides --follow.",
                 ),
         )
         .arg(
-            Arg::with_name("full-path")
+            Arg::new("full-path")
                 .long("full-path")
-                .short("p")
+                .short('p')
                 .overrides_with("full-path")
                 .help("Search full abs. path (default: filename only)")
                 .long_help(
@@ -237,12 +237,12 @@
                 ),
         )
         .arg(
-            Arg::with_name("null_separator")
+            Arg::new("null_separator")
                 .long("print0")
-                .short("0")
+                .short('0')
                 .overrides_with("print0")
                 .conflicts_with("list-details")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Separate results by the null character")
                 .long_help(
                     "Separate search results by the null character (instead of 
newlines). \
@@ -250,9 +250,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("max-depth")
+            Arg::new("max-depth")
                 .long("max-depth")
-                .short("d")
+                .short('d')
                 .takes_value(true)
                 .value_name("depth")
                 .help("Set maximum search depth (default: none)")
@@ -263,18 +263,18 @@
         )
         // support --maxdepth as well, for compatibility with rg
         .arg(
-            Arg::with_name("rg-depth")
+            Arg::new("rg-depth")
                 .long("maxdepth")
-                .hidden(true)
+                .hide(true)
                 .takes_value(true)
                 .help("Set maximum search depth (default: none)")
         )
         .arg(
-            Arg::with_name("min-depth")
+            Arg::new("min-depth")
                 .long("min-depth")
                 .takes_value(true)
                 .value_name("depth")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Only show results starting at given depth")
                 .long_help(
                     "Only show search results starting at the given depth. \
@@ -282,11 +282,11 @@
                 ),
         )
         .arg(
-            Arg::with_name("exact-depth")
+            Arg::new("exact-depth")
                 .long("exact-depth")
                 .takes_value(true)
                 .value_name("depth")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .conflicts_with_all(&["max-depth", "min-depth"])
                 .help("Only show results at exact given depth")
                 .long_help(
@@ -295,19 +295,19 @@
                 ),
         )
         .arg(
-            Arg::with_name("prune")
+            Arg::new("prune")
                 .long("prune")
                 .conflicts_with_all(&["size", "exact-depth"])
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Do not traverse into matching directories")
                 .long_help("Do not traverse into directories that match the 
search criteria. If \
                     you want to exclude specific directories, use the 
'--exclude=???' option.")
         )
         .arg(
-            Arg::with_name("file-type")
+            Arg::new("file-type")
                 .long("type")
-                .short("t")
-                .multiple(true)
+                .short('t')
+                .multiple_occurrences(true)
                 .number_of_values(1)
                 .takes_value(true)
                 .value_name("filetype")
@@ -366,10 +366,10 @@
                 ),
         )
         .arg(
-            Arg::with_name("extension")
+            Arg::new("extension")
                 .long("extension")
-                .short("e")
-                .multiple(true)
+                .short('e')
+                .multiple_occurrences(true)
                 .number_of_values(1)
                 .takes_value(true)
                 .value_name("ext")
@@ -382,9 +382,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("exec")
+            Arg::new("exec")
                 .long("exec")
-                .short("x")
+                .short('x')
                 .min_values(1)
                 .allow_hyphen_values(true)
                 .value_terminator(";")
@@ -413,9 +413,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("exec-batch")
+            Arg::new("exec-batch")
                 .long("exec-batch")
-                .short("X")
+                .short('X')
                 .min_values(1)
                 .allow_hyphen_values(true)
                 .value_terminator(";")
@@ -440,11 +440,11 @@
                 ),
         )
         .arg(
-            Arg::with_name("batch-size")
+            Arg::new("batch-size")
             .long("batch-size")
             .takes_value(true)
             .value_name("size")
-            .hidden_short_help(true)
+            .hide_short_help(true)
             .requires("exec-batch")
             .help("Max number of arguments to run as a batch with -X")
             .long_help(
@@ -455,13 +455,13 @@
             ),
         )
         .arg(
-            Arg::with_name("exclude")
+            Arg::new("exclude")
                 .long("exclude")
-                .short("E")
+                .short('E')
                 .takes_value(true)
                 .value_name("pattern")
                 .number_of_values(1)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .help("Exclude entries that match the given glob pattern")
                 .long_help(
                     "Exclude files/directories that match the given glob 
pattern. This \
@@ -473,13 +473,13 @@
                 ),
         )
         .arg(
-            Arg::with_name("ignore-file")
+            Arg::new("ignore-file")
                 .long("ignore-file")
                 .takes_value(true)
                 .value_name("path")
                 .number_of_values(1)
-                .multiple(true)
-                .hidden_short_help(true)
+                .multiple_occurrences(true)
+                .hide_short_help(true)
                 .help("Add custom ignore-file in '.gitignore' format")
                 .long_help(
                     "Add a custom ignore-file in '.gitignore' format. These 
files have a low \
@@ -487,9 +487,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("color")
+            Arg::new("color")
                 .long("color")
-                .short("c")
+                .short('c')
                 .takes_value(true)
                 .value_name("when")
                 .possible_values(&["never", "auto", "always"])
@@ -503,12 +503,12 @@
                 ),
         )
         .arg(
-            Arg::with_name("threads")
+            Arg::new("threads")
                 .long("threads")
-                .short("j")
+                .short('j')
                 .takes_value(true)
                 .value_name("num")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Set number of threads")
                 .long_help(
                     "Set number of threads to use for searching & executing 
(default: number \
@@ -516,13 +516,13 @@
                 ),
         )
         .arg(
-            Arg::with_name("size")
+            Arg::new("size")
                 .long("size")
-                .short("S")
+                .short('S')
                 .takes_value(true)
                 .number_of_values(1)
                 .allow_hyphen_values(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .help("Limit results based on the size of files")
                 .long_help(
                     "Limit results based on the size of files using the format 
<+-><NUM><UNIT>.\n   \
@@ -544,10 +544,10 @@
                 ),
         )
         .arg(
-            Arg::with_name("max-buffer-time")
+            Arg::new("max-buffer-time")
                 .long("max-buffer-time")
                 .takes_value(true)
-                .hidden(true)
+                .hide(true)
                 .help("Milliseconds to buffer before streaming search results 
to console")
                 .long_help(
                     "Amount of time in milliseconds to buffer, before 
streaming the search \
@@ -555,7 +555,7 @@
                 ),
         )
         .arg(
-            Arg::with_name("changed-within")
+            Arg::new("changed-within")
                 .long("changed-within")
                 .alias("change-newer-than")
                 .alias("newer")
@@ -575,7 +575,7 @@
                 ),
         )
         .arg(
-            Arg::with_name("changed-before")
+            Arg::new("changed-before")
                 .long("changed-before")
                 .alias("change-older-than")
                 .alias("older")
@@ -594,7 +594,7 @@
                 ),
         )
         .arg(
-            Arg::with_name("max-results")
+            Arg::new("max-results")
                 .long("max-results")
                 .takes_value(true)
                 .value_name("count")
@@ -604,14 +604,14 @@
                 // same search with `--exec rm` attached and get a reliable 
removal of
                 // the files they saw in the previous search.
                 .conflicts_with_all(&["exec", "exec-batch", "list-details"])
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Limit number of search results")
                 .long_help("Limit the number of search results to 'count' and 
quit immediately."),
         )
         .arg(
-            Arg::with_name("max-one-result")
-                .short("1")
-                .hidden_short_help(true)
+            Arg::new("max-one-result")
+                .short('1')
+                .hide_short_help(true)
                 .overrides_with("max-results")
                 .conflicts_with_all(&["exec", "exec-batch", "list-details"])
                 .help("Limit search to a single result")
@@ -619,11 +619,11 @@
                                 This is an alias for '--max-results=1'.")
         )
         .arg(
-            Arg::with_name("quiet")
+            Arg::new("quiet")
                 .long("quiet")
-                .short("q")
+                .short('q')
                 .alias("has-results")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .conflicts_with_all(&["exec", "exec-batch", "list-details", 
"max-results"])
                 .help("Print nothing, exit code 0 if match found, 1 otherwise")
                 .long_help(
@@ -634,9 +634,9 @@
                 )
         )
         .arg(
-            Arg::with_name("show-errors")
+            Arg::new("show-errors")
                 .long("show-errors")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .overrides_with("show-errors")
                 .help("Show filesystem errors")
                 .long_help(
@@ -645,12 +645,13 @@
                 ),
         )
         .arg(
-            Arg::with_name("base-directory")
+            Arg::new("base-directory")
                 .long("base-directory")
                 .takes_value(true)
                 .value_name("path")
                 .number_of_values(1)
-                .hidden_short_help(true)
+                .allow_invalid_utf8(true)
+                .hide_short_help(true)
                 .help("Change current working directory")
                 .long_help(
                     "Change the current working directory of fd to the 
provided path. This \
@@ -661,7 +662,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("pattern").help(
+            Arg::new("pattern")
+            .allow_invalid_utf8(true)
+            .help(
                 "the search pattern (a regular expression, unless '--glob' is 
used; optional)",
             ).long_help(
                 "the search pattern which is either a regular expression 
(default) or a glob \
@@ -670,11 +673,11 @@
                  pass '--' first, or it will be considered as a flag (fd -- 
'-foo').")
         )
         .arg(
-            Arg::with_name("path-separator")
+            Arg::new("path-separator")
                 .takes_value(true)
                 .value_name("separator")
                 .long("path-separator")
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Set path separator when printing file paths")
                 .long_help(
                     "Set the path separator to use when printing file paths. 
The default is \
@@ -682,8 +685,9 @@
                 ),
         )
         .arg(
-            Arg::with_name("path")
-                .multiple(true)
+            Arg::new("path")
+                .multiple_occurrences(true)
+                .allow_invalid_utf8(true)
                 .help("the root directory for the filesystem search 
(optional)")
                 .long_help(
                     "The directory where the filesystem search is rooted 
(optional). If \
@@ -691,25 +695,26 @@
                 ),
         )
         .arg(
-            Arg::with_name("search-path")
+            Arg::new("search-path")
                 .long("search-path")
                 .takes_value(true)
                 .conflicts_with("path")
-                .multiple(true)
-                .hidden_short_help(true)
+                .multiple_occurrences(true)
+                .hide_short_help(true)
                 .number_of_values(1)
+                .allow_invalid_utf8(true)
                 .help("Provide paths to search as an alternative to the 
positional <path>")
                 .long_help(
                     "Provide paths to search as an alternative to the 
positional <path> \
-                         argument. Changes the usage to `fd [FLAGS/OPTIONS] 
--search-path <path> \
+                         argument. Changes the usage to `fd [OPTIONS] 
--search-path <path> \
                          --search-path <path2> [<pattern>]`",
                 ),
         )
         .arg(
-            Arg::with_name("strip-cwd-prefix")
+            Arg::new("strip-cwd-prefix")
                 .long("strip-cwd-prefix")
                 .conflicts_with_all(&["path", "search-path"])
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("strip './' prefix from non-tty outputs")
                 .long_help(
                     "By default, relative paths are prefixed with './' when 
the output goes to a non \
@@ -719,9 +724,9 @@
 
     if cfg!(unix) {
         app = app.arg(
-            Arg::with_name("owner")
+            Arg::new("owner")
                 .long("owner")
-                .short("o")
+                .short('o')
                 .takes_value(true)
                 .value_name("user:group")
                 .help("Filter by owning user and/or group")
@@ -742,10 +747,10 @@
     // Provide aliases `mount` and `xdev` for people coming from `find`.
     if cfg!(any(unix, windows)) {
         app = app.arg(
-            Arg::with_name("one-file-system")
+            Arg::new("one-file-system")
                 .long("one-file-system")
                 .aliases(&["mount", "xdev"])
-                .hidden_short_help(true)
+                .hide_short_help(true)
                 .help("Do not descend into a different file system")
                 .long_help(
                     "By default, fd will traverse the file system tree as far 
as other options \
@@ -758,3 +763,8 @@
 
     app
 }
+
+#[test]
+fn verify_app() {
+    build_app().debug_assert()
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/tests/testenv/mod.rs 
new/fd-8.3.2/tests/testenv/mod.rs
--- old/fd-8.3.1/tests/testenv/mod.rs   2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/tests/testenv/mod.rs   2022-01-29 16:53:13.000000000 +0100
@@ -130,6 +130,17 @@
     lines.join("\n")
 }
 
+/// Trim whitespace from the beginning of each line.
+fn trim_lines(s: &str) -> String {
+    s.lines()
+        .map(|line| line.trim_start())
+        .fold(String::new(), |mut str, line| {
+            str.push_str(line);
+            str.push('\n');
+            str
+        })
+}
+
 impl TestEnv {
     pub fn new(directories: &[&'static str], files: &[&'static str]) -> 
TestEnv {
         let temp_dir = create_working_directory(directories, 
files).expect("working directory");
@@ -203,6 +214,19 @@
         output
     }
 
+    pub fn assert_success_and_get_normalized_output<P: AsRef<Path>>(
+        &self,
+        path: P,
+        args: &[&str],
+    ) -> String {
+        let output = self.assert_success_and_get_output(path, args);
+        normalize_output(
+            &String::from_utf8_lossy(&output.stdout),
+            false,
+            self.normalize_line,
+        )
+    }
+
     /// Assert that calling *fd* with the specified arguments produces the 
expected output.
     pub fn assert_output(&self, args: &[&str], expected: &str) {
         self.assert_output_subdirectory(".", args, expected)
@@ -224,15 +248,9 @@
         args: &[&str],
         expected: &str,
     ) {
-        let output = self.assert_success_and_get_output(path, args);
-
         // Normalize both expected and actual output.
         let expected = normalize_output(expected, true, self.normalize_line);
-        let actual = normalize_output(
-            &String::from_utf8_lossy(&output.stdout),
-            false,
-            self.normalize_line,
-        );
+        let actual = self.assert_success_and_get_normalized_output(path, args);
 
         // Compare actual output to expected output.
         if expected != actual {
@@ -280,12 +298,8 @@
 
         if let Some(expected) = expected {
             // Normalize both expected and actual output.
-            let expected_error = normalize_output(expected, true, 
self.normalize_line);
-            let actual_err = normalize_output(
-                &String::from_utf8_lossy(&output.stderr),
-                false,
-                self.normalize_line,
-            );
+            let expected_error = trim_lines(expected);
+            let actual_err = 
trim_lines(&String::from_utf8_lossy(&output.stderr));
 
             // Compare actual output to expected output.
             if !actual_err.trim_start().starts_with(&expected_error) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fd-8.3.1/tests/tests.rs new/fd-8.3.2/tests/tests.rs
--- old/fd-8.3.1/tests/tests.rs 2022-01-06 14:20:02.000000000 +0100
+++ new/fd-8.3.2/tests/tests.rs 2022-01-29 16:53:13.000000000 +0100
@@ -1420,12 +1420,12 @@
 
         te.assert_failure_with_error(
             &["foo", "--exec-batch", "echo", "{/}", ";", "-x", "echo"],
-            "error: The argument '--exec <cmd>' cannot be used with 
'--exec-batch <cmd>'",
+            "error: The argument '--exec-batch <cmd>...' cannot be used with 
'--exec <cmd>...'",
         );
 
         te.assert_failure_with_error(
             &["foo", "--exec-batch"],
-            "error: The argument '--exec-batch <cmd>' requires a value but 
none was supplied",
+            "error: The argument '--exec-batch <cmd>...' requires a value but 
none was supplied",
         );
 
         te.assert_failure_with_error(
@@ -1970,8 +1970,8 @@
 
     let mut flags = vec![flag];
     flags.extend_from_slice(opposing_flags);
-    let out_no_flags = te.assert_success_and_get_output(".", &[]);
-    let out_opposing_flags = te.assert_success_and_get_output(".", &flags);
+    let out_no_flags = te.assert_success_and_get_normalized_output(".", &[]);
+    let out_opposing_flags = te.assert_success_and_get_normalized_output(".", 
&flags);
 
     assert_eq!(
         out_no_flags,

++++++ fd.obsinfo ++++++
name: fd
version: 8.3.2
mtime: 1643471593
commit: 9f5ed8534e824b3e2a0934ff3aa0b781cb370688

++++++ vendor.tar.xz ++++++
/work/SRC/openSUSE:Factory/fd/vendor.tar.xz 
/work/SRC/openSUSE:Factory/.fd.new.1898/vendor.tar.xz differ: char 13, line 1

Reply via email to