diff --git a/.github/workflows/linux_cli.yml b/.github/workflows/linux_cli.yml index 656fbeb4..13b9b856 100644 --- a/.github/workflows/linux_cli.yml +++ b/.github/workflows/linux_cli.yml @@ -18,9 +18,10 @@ jobs: run: sudo apt update || true; sudo apt install libheif-dev libraw-dev ffmpeg -y - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release with fast_image_resize diff --git a/.github/workflows/linux_cli_eyra.yml b/.github/workflows/linux_cli_eyra.yml index 2a0f3fe0..b061e609 100644 --- a/.github/workflows/linux_cli_eyra.yml +++ b/.github/workflows/linux_cli_eyra.yml @@ -29,6 +29,7 @@ jobs: cd .. - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release diff --git a/.github/workflows/linux_gui.yml b/.github/workflows/linux_gui.yml index 4a26960e..56798d36 100644 --- a/.github/workflows/linux_gui.yml +++ b/.github/workflows/linux_gui.yml @@ -15,9 +15,10 @@ jobs: - uses: actions/checkout@v4 - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release Krokiet @@ -50,9 +51,10 @@ jobs: run: sudo apt update || true; sudo apt install libheif-dev libraw-dev -y - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release Krokiet heif @@ -85,9 +87,10 @@ jobs: run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev -y - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release Heif Libraw @@ -130,9 +133,10 @@ jobs: run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev librsvg2-dev wget fuse libfuse2 desktop-file-utils -y - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release @@ -173,7 +177,9 @@ jobs: rm -rf czkawka_gui cp target/release/czkawka_gui . strip czkawka_gui - wget https://github.com/AppImageCommunity/pkg2appimage/releases/download/continuous/pkg2appimage--x86_64.AppImage -O pkg2.appimage + wget https://github.com/qarmin/Automated-Fuzzer/releases/download/test/pkg2appimage-1eceb30-x86_64.AppImage -O pkg2.appimage + # TODO - official link from below, no longer works and there is no official releases except continuous versions which have no stable version numbering + # wget https://github.com/AppImageCommunity/pkg2appimage/releases/download/continuous/pkg2appimage--x86_64.AppImage -O pkg2.appimage chmod +x ./pkg2.appimage ./pkg2.appimage misc/czkawka-appimage-recipe.yml mv out/Czkawka*.AppImage out/czkawka_gui-minimal.AppImage @@ -205,7 +211,7 @@ jobs: run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev librsvg2-dev wget fuse libfuse2 -y xvfb - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Test run: xvfb-run cargo test diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 6ff3dce1..4f1564fe 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -9,8 +9,8 @@ env: CARGO_TERM_COLOR: always jobs: - macos: - runs-on: macos-latest + macos_x86_64: + runs-on: macos-13 steps: - uses: actions/checkout@v4 @@ -24,9 +24,10 @@ jobs: brew link --overwrite python@3.13 - name: Setup rust version - run: rustup default stable + run: rustup default 1.85.0 - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i '' 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Build Release @@ -35,55 +36,133 @@ jobs: - name: Store MacOS CLI uses: actions/upload-artifact@v4 with: - name: czkawka_cli-${{ runner.os }} + name: czkawka_cli-${{ runner.os }}-x86_64 path: target/release/czkawka_cli - name: Store MacOS GUI uses: actions/upload-artifact@v4 with: - name: czkawka_gui-${{ runner.os }} + name: czkawka_gui-${{ runner.os }}-x86_64 path: target/release/czkawka_gui - name: Store MacOS Krokiet uses: actions/upload-artifact@v4 with: - name: krokiet-${{ runner.os }} + name: krokiet-${{ runner.os }}-x86_64 path: target/release/krokiet - name: Prepare files to release run: | - mv target/release/czkawka_cli macos_czkawka_cli - mv target/release/czkawka_gui macos_czkawka_gui - mv target/release/krokiet macos_krokiet + mv target/release/czkawka_cli macos_czkawka_cli_x86_64 + mv target/release/czkawka_gui macos_czkawka_gui_x86_64 + mv target/release/krokiet macos_krokiet_x86_64 + - name: Release uses: softprops/action-gh-release@v2 if: ${{ github.ref == 'refs/heads/master' }} with: tag_name: "Nightly" files: | - macos_czkawka_cli - macos_czkawka_gui - macos_krokiet + macos_czkawka_cli_x86_64 + macos_czkawka_gui_x86_64 + macos_krokiet_x86_64 + token: ${{ secrets.PAT_REPOSITORY }} + + # TODO - compilation is broken, not sure why, if you want to use it you need to fix it(I'm too lazy and don't have MacOS) + - name: Build Release Heif + run: cargo build --release --features heif + + - name: Store MacOS CLI Heif + uses: actions/upload-artifact@v4 + with: + name: czkawka_cli-${{ runner.os }}-heif-x86_64 + path: target/release/czkawka_cli + + - name: Store MacOS GUI Heif + uses: actions/upload-artifact@v4 + with: + name: czkawka_gui-${{ runner.os }}-heif-x86_64 + path: target/release/czkawka_gui + + - name: Store MacOS Krokiet Heif + uses: actions/upload-artifact@v4 + with: + name: krokiet-${{ runner.os }}-heif-x86_64 + path: target/release/krokiet + + - name: Prepare files to release 2 + run: | + mv target/release/czkawka_cli macos_czkawka_cli_heif_x86_64 + mv target/release/czkawka_gui macos_czkawka_gui_heif_x86_64 + mv target/release/krokiet macos_krokiet_heif_x86_64 + + - name: Release 2 + uses: softprops/action-gh-release@v2 + if: ${{ github.ref == 'refs/heads/master' }} + with: + tag_name: "Nightly" + files: | + macos_czkawka_cli_heif_x86_64 + macos_czkawka_gui_heif_x86_64 + macos_krokiet_heif_x86_64 token: ${{ secrets.PAT_REPOSITORY }} -# # TODO - compilation is broken, not sure why -# - name: Build Release Heif -# run: cargo build --release --features heif -# -# - name: Store MacOS CLI Heif -# uses: actions/upload-artifact@v4 -# with: -# name: czkawka_cli-${{ runner.os }}-heif -# path: target/release/czkawka_cli -# -# - name: Store MacOS GUI Heif -# uses: actions/upload-artifact@v4 -# with: -# name: czkawka_gui-${{ runner.os }}-heif -# path: target/release/czkawka_gui -# -# - name: Store MacOS Krokiet Heif -# uses: actions/upload-artifact@v4 -# with: -# name: krokiet-${{ runner.os }}-heif -# path: target/release/krokiet \ No newline at end of file + macos_arm: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Homebrew + run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + - name: Install GTK4 + run: | + brew link --overwrite python@3.13 + brew install rust gtk4 libheif || true + brew link --overwrite python@3.13 + + - name: Setup rust version + run: rustup default 1.85.0 + + - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} + run: sed -i '' 's/#lto = "thin"/lto = "thin"/g' Cargo.toml + + - name: Build Release + run: cargo build --release + + - name: Store MacOS CLI + uses: actions/upload-artifact@v4 + with: + name: czkawka_cli-${{ runner.os }}-arm + path: target/release/czkawka_cli + + - name: Store MacOS GUI + uses: actions/upload-artifact@v4 + with: + name: czkawka_gui-${{ runner.os }}-arm + path: target/release/czkawka_gui + + - name: Store MacOS Krokiet + uses: actions/upload-artifact@v4 + with: + name: krokiet-${{ runner.os }}-arm + path: target/release/krokiet + + - name: Prepare files to release + run: | + mv target/release/czkawka_cli macos_czkawka_cli_arm + mv target/release/czkawka_gui macos_czkawka_gui_arm + mv target/release/krokiet macos_krokiet_arm + + - name: Release + uses: softprops/action-gh-release@v2 + if: ${{ github.ref == 'refs/heads/master' }} + with: + tag_name: "Nightly" + files: | + macos_czkawka_cli_arm + macos_czkawka_gui_arm + macos_krokiet_arm + token: ${{ secrets.PAT_REPOSITORY }} + # TODO - arm builds not works now with heif \ No newline at end of file diff --git a/.github/workflows/minimial_version.yml b/.github/workflows/minimial_version.yml index e947cce6..ab64a443 100644 --- a/.github/workflows/minimial_version.yml +++ b/.github/workflows/minimial_version.yml @@ -18,7 +18,7 @@ jobs: run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev ffmpeg -y - name: Setup rust version - run: rustup default 1.82.0 + run: rustup default 1.85.0 - name: Build run: | diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index a18c80ed..6d32e35c 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -17,6 +17,12 @@ jobs: - name: Install Gtk 4 run: sudo apt update || true; sudo apt install -y libgtk-4-dev libraw-dev libheif-dev libavif-dev libdav1d-dev -y + - name: Setup rust version + run: | + rustup default 1.85.0 + rustup component add rustfmt + rustup component add clippy + - name: Check the format run: cargo fmt --all -- --check diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index bb7f697b..4ece2c56 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -24,9 +24,11 @@ jobs: - name: Setup rust version run: | + rustup default 1.85.0 rustup target add x86_64-pc-windows-gnu - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Compile Krokiet @@ -86,9 +88,10 @@ jobs: cp a/sd-v1.0.0-x86_64-pc-windows-gnu/sd.exe . - name: Setup rust version - run: rustup default stable-x86_64-pc-windows-gnu + run: rustup default 1.85.0-x86_64-pc-windows-gnu - name: Enable LTO + if: ${{ github.ref == 'refs/heads/master' }} run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml - name: Compile Krokiet @@ -148,6 +151,7 @@ jobs: dnf install curl wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source "$HOME/.cargo/env" + rustup default 1.85.0 rustup target add x86_64-pc-windows-gnu - name: Cross compile for Windows @@ -215,6 +219,7 @@ jobs: dnf install curl wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source "$HOME/.cargo/env" + rustup default 1.85.0 rustup target add x86_64-pc-windows-gnu - name: Cross compile for Windows @@ -290,6 +295,7 @@ jobs: dnf install curl wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source "$HOME/.cargo/env" + rustup default 1.85.0 rustup target add x86_64-pc-windows-gnu - name: Show console window on windows diff --git a/Cargo.lock b/Cargo.lock index a7edf231..825d31f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ab_glyph" @@ -57,10 +57,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -199,9 +199,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" [[package]] name = "approx" @@ -235,7 +235,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -276,7 +276,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand", + "rand 0.8.5", "serde", "serde_repr", "url", @@ -294,7 +294,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand", + "rand 0.8.5", "raw-window-handle 0.6.2", "serde", "serde_repr", @@ -302,7 +302,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.3.0", + "zbus 5.5.0", ] [[package]] @@ -421,7 +421,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -450,13 +450,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -483,7 +483,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -521,9 +521,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" dependencies = [ "arrayvec", ] @@ -586,7 +586,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.96", + "syn 2.0.98", "which", ] @@ -647,15 +647,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.5" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +checksum = "1230237285e3e10cde447185e8975408ae24deaa67205ce684805c25bc0c7937" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "memmap2", ] [[package]] @@ -688,7 +689,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", ] [[package]] @@ -715,9 +716,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -725,15 +726,15 @@ dependencies = [ [[package]] name = "built" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "by_address" @@ -764,7 +765,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -781,9 +782,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bzip2" @@ -797,9 +798,9 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.12+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "72ebc2f1a417f01e1da30ef264ee86ae31d2dcd2d603ea283d3c244a883ca2a9" dependencies = [ "cc", "libc", @@ -885,9 +886,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.10" +version = "1.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" dependencies = [ "jobserver", "libc", @@ -1025,9 +1026,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.26" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" +checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" dependencies = [ "clap_builder", "clap_derive", @@ -1035,9 +1036,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.26" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" +checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" dependencies = [ "anstream", "anstyle", @@ -1047,14 +1048,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1157,7 +1158,7 @@ checksum = "5387f5bbc9e9e6c96436ea125afa12614cebf8ac67f49abc08c1e7a891466c90" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1166,26 +1167,6 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1303,9 +1284,9 @@ dependencies = [ [[package]] name = "core_maths" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" dependencies = [ "libm", ] @@ -1318,9 +1299,9 @@ checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1421,9 +1402,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -1482,7 +1463,6 @@ dependencies = [ "bitflags 2.8.0", "bk-tree", "blake3", - "const_format", "crc32fast", "criterion", "crossbeam-channel", @@ -1519,6 +1499,7 @@ dependencies = [ "serde", "serde_json", "state", + "static_assertions", "symphonia", "tempfile", "trash", @@ -1549,6 +1530,7 @@ dependencies = [ "log", "once_cell", "open", + "rand 0.9.0", "rayon", "regex", "rust-embed", @@ -1613,9 +1595,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" [[package]] name = "data-url" @@ -1691,7 +1673,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1711,7 +1693,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "unicode-xid", ] @@ -1723,7 +1705,7 @@ checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1772,7 +1754,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1792,9 +1774,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "document-features" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" dependencies = [ "litrs", ] @@ -1900,9 +1882,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" [[package]] name = "encode_unicode" @@ -1967,7 +1949,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1978,14 +1960,14 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" @@ -2079,9 +2061,9 @@ dependencies = [ [[package]] name = "fast_image_resize" -version = "5.1.1" +version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6b088992b0c2db53860aa4b43f299fd45aa85b835c744dec53c3f40231330d" +checksum = "b55264ccc579fc127eebf6c6c1841d0c160d79a44c8f6f97047b7bc4a9c0d1a5" dependencies = [ "bytemuck", "cfg-if", @@ -2217,9 +2199,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -2281,6 +2263,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "fontconfig-parser" version = "0.5.7" @@ -2306,11 +2294,11 @@ dependencies = [ [[package]] name = "fontdue" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe23d02309319171d00d794c9ff48d4f903c0e481375b1b04b017470838af04" +checksum = "2e57e16b3fe8ff4364c0661fdaac543fb38b29ea9bc9c2f45612d90adf931d2b" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", "rayon", "ttf-parser 0.21.1", ] @@ -2333,7 +2321,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2461,7 +2449,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2518,9 +2506,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6efc7705f7863d37b12ad6974cbb310d35d054f5108cdc1e69037742f573c4c" +checksum = "7563afd6ff0a221edfbb70a78add5075b8d9cb48e637a40a24c3ece3fea414d0" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -2543,9 +2531,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0196720118f880f71fe7da971eff58cc43a89c9cf73f46076b7cb1e60889b15" +checksum = "4850c9d9c1aecd1a3eb14fadc1cdb0ac0a2298037e116264c7473e1740a32d60" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -2558,9 +2546,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b0e1340bd15e7a78810cf39fed9e5d85f0a8f80b1d999d384ca17dcc452b60" +checksum = "6f6eb95798e2b46f279cf59005daf297d5b69555428f185650d71974a910473a" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -2626,10 +2614,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gif" version = "0.13.1" @@ -2648,9 +2648,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a517657589a174be9f60c667f1fec8b7ac82ed5db4ebf56cf073a3b5955d8e2e" +checksum = "a4f00c70f8029d84ea7572dd0e1aaa79e5329667b4c17f329d79ffb1e6277487" dependencies = [ "futures-channel", "futures-core", @@ -2665,9 +2665,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8446d9b475730ebef81802c1738d972db42fde1c5a36a627ebc4d665fc87db04" +checksum = "160eb5250a26998c3e1b54e6a3d4ea15c6c7762a6062a19a7b63eff6e2b33f9e" dependencies = [ "glib-sys", "gobject-sys", @@ -2689,9 +2689,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f969edf089188d821a30cde713b6f9eb08b20c63fc2e584aba2892a7984a8cc0" +checksum = "707b819af8059ee5395a2de9f2317d87a53dbad8846a2f089f0bb44703f37686" dependencies = [ "bitflags 2.8.0", "futures-channel", @@ -2718,14 +2718,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "glib-sys" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b360ff0f90d71de99095f79c526a5888c9c92fc9ee1b19da06c6f5e75f0c2a53" +checksum = "a8928869a44cfdd1fccb17d6746e4ff82c8f82e41ce705aa026a52ca8dc3aefb" dependencies = [ "libc", "system-deps 7.0.3", @@ -2787,9 +2787,9 @@ dependencies = [ "glutin_glx_sys", "glutin_wgl_sys", "libloading 0.8.6", - "objc2", + "objc2 0.5.2", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.2.2", "once_cell", "raw-window-handle 0.6.2", "wayland-sys", @@ -2840,9 +2840,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a56235e971a63bfd75abb13ef70064e1346388723422a68580d8a6fbac6423" +checksum = "c773a3cb38a419ad9c26c81d177d96b4b08980e8bdbbf32dace883e96e96e7e3" dependencies = [ "glib-sys", "libc", @@ -2851,9 +2851,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f39d3bcd2e24fd9c2874a56f277b72c03e728de9bdc95a8d4ef4c962f10ced98" +checksum = "3cbc5911bfb32d68dcfa92c9510c462696c2f715548fcd7f3f1be424c739de19" dependencies = [ "glib", "graphene-sys", @@ -2874,9 +2874,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b9188db0a6219e708b6b6e7225718e459def664023dbddb8395ca1486d8102" +checksum = "61f5e72f931c8c9f65fbfc89fe0ddc7746f147f822f127a53a9854666ac1f855" dependencies = [ "cairo-rs", "gdk4", @@ -2889,9 +2889,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca10fc65d68528a548efa3d8747934adcbe7058b73695c9a7f43a25352fce14" +checksum = "755059de55fa6f85a46bde8caf03e2184c96bfda1f6206163c72fb0ea12436dc" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -2905,9 +2905,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b697ff938136625f6acf75f01951220f47a45adcf0060ee55b4671cf734dac44" +checksum = "af1c491051f030994fd0cde6f3c44f3f5640210308cff1298c7673c47408091d" dependencies = [ "cairo-rs", "field-offset", @@ -2933,14 +2933,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "gtk4-sys" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af4b680cee5d2f786a2f91f1c77e95ecf2254522f0ca4edf3a2dce6cb35cecf" +checksum = "41e03b01e54d77c310e1d98647d73f996d04b2f29b9121fe493ea525a7ec03d6" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -3007,7 +3007,6 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", - "rayon", ] [[package]] @@ -3015,6 +3014,12 @@ name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "rayon", +] [[package]] name = "heck" @@ -3246,7 +3251,7 @@ checksum = "0ec8e1d457e06e12a5fd23a5e841c994b2ce48cecdaee872c008239380189b15" dependencies = [ "quote", "serde_json", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3298,11 +3303,11 @@ dependencies = [ "i-slint-core", "i-slint-core-macros", "lyon_path", - "objc2", + "objc2 0.5.2", "objc2-app-kit", - "objc2-foundation", - "objc2-metal", - "objc2-quartz-core", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", + "objc2-quartz-core 0.2.2", "once_cell", "pin-weak", "raw-window-handle 0.6.2", @@ -3367,7 +3372,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.96", + "syn 2.0.98", "unic-langid", ] @@ -3381,7 +3386,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3522,7 +3527,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3612,7 +3617,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c191dc6138f559a0177b8413eaf2a37784d8e63c697e247aa3740930f1c9364" dependencies = [ "base64", - "fast_image_resize 5.1.1", + "fast_image_resize 5.1.2", "image 0.25.5", "rustdct", "serde", @@ -3647,12 +3652,12 @@ checksum = "2393fb7808960751a52e8a154f67e7dd3f8a2ef9bd80d1553078a7b4e8ed3f0d" dependencies = [ "ab_glyph", "approx", - "getrandom", + "getrandom 0.2.15", "image 0.25.5", "itertools 0.12.1", "nalgebra", "num", - "rand", + "rand 0.8.5", "rand_distr", "rayon", ] @@ -3681,9 +3686,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -3691,9 +3696,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", @@ -3704,18 +3709,18 @@ dependencies = [ [[package]] name = "infer" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" dependencies = [ "cfb", ] [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array", @@ -3757,7 +3762,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3801,13 +3806,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4043,9 +4048,9 @@ dependencies = [ [[package]] name = "jxl-oxide" -version = "0.11.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14dc17856a54b3f13a1459eef32626415941c81909a195d0227888c703215b9" +checksum = "063c51c4a90c90c3766180b9884aff0ca340cae0a591889c115472340be7cb6c" dependencies = [ "brotli-decompressor", "bytemuck", @@ -4073,9 +4078,9 @@ dependencies = [ [[package]] name = "jxl-render" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "337635607131c2554bf4b93f2a5dff882e475b99dca81479a1555f1a598159b5" +checksum = "875d942b09d468f78c7bc9e0ee005666b64e44cc74efd8f1b46858418da39fe4" dependencies = [ "bytemuck", "jxl-bitstream", @@ -4093,9 +4098,9 @@ dependencies = [ [[package]] name = "jxl-threadpool" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2860c68899a3c6266044fc26c6a0041e9f27145f58cc69b6eedc1b77f5ee13" +checksum = "ad9c78eaf899cce165e266300f9963d8d376d4ed95cf4d12dd7066f05542cd88" dependencies = [ "rayon", "rayon-core", @@ -4132,7 +4137,6 @@ dependencies = [ "czkawka_core", "directories-next", "fs_extra", - "handsome_logger", "home", "humansize", "i18n-embed", @@ -4142,7 +4146,6 @@ dependencies = [ "log", "once_cell", "open", - "rand", "rayon", "rfd", "rust-embed", @@ -4189,9 +4192,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libflate" @@ -4219,9 +4222,9 @@ dependencies = [ [[package]] name = "libfuzzer-sys" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" dependencies = [ "arbitrary", "cc", @@ -4300,7 +4303,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.8.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", ] [[package]] @@ -4392,9 +4395,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "lofty" -version = "0.22.1" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c45b1baaa65506d6f6fe3a7dce7efae02d7d7fbe89907731686a39ab247a49" +checksum = "781de624f162b1a8cbfbd577103ee9b8e5f62854b053ff48f4e31e68a0a7df6f" dependencies = [ "byteorder", "data-encoding", @@ -4407,20 +4410,20 @@ dependencies = [ [[package]] name = "lofty_attr" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bd4b9d8a5af74808932492521cdd272019b056f75fcc70056bd2c09fceb550" +checksum = "ed9983e64b2358522f745c1251924e3ab7252d55637e80f6a0a3de642d6a9efc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "loom" @@ -4585,9 +4588,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", "simd-adler32", @@ -4707,16 +4710,16 @@ dependencies = [ [[package]] name = "nom-exif" -version = "2.3.0" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a57d8aa24d0b90b42817a9309b56a4d1966feb443d44476bd4ea8de3114f170" +checksum = "a09f774715bfd0ca793e25f4b0d5aaa7530a230aebffe3a69e6df16eaf0af56d" dependencies = [ "bytes", "chrono", "iso6709parse", "nom", "regex", - "thiserror 1.0.69", + "thiserror 2.0.11", "tracing", ] @@ -4783,7 +4786,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4845,7 +4848,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4899,6 +4902,15 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-app-kit" version = "0.2.2" @@ -4908,11 +4920,11 @@ dependencies = [ "bitflags 2.8.0", "block2", "libc", - "objc2", + "objc2 0.5.2", "objc2-core-data", "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", ] [[package]] @@ -4923,9 +4935,9 @@ checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ "bitflags 2.8.0", "block2", - "objc2", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -4935,8 +4947,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -4947,8 +4959,18 @@ checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ "bitflags 2.8.0", "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", ] [[package]] @@ -4958,9 +4980,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ "block2", - "objc2", - "objc2-foundation", - "objc2-metal", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", ] [[package]] @@ -4970,16 +4992,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ "block2", - "objc2", + "objc2 0.5.2", "objc2-contacts", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] name = "objc2-encode" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" @@ -4991,7 +5013,18 @@ dependencies = [ "block2", "dispatch", "libc", - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", + "objc2-core-foundation", ] [[package]] @@ -5001,9 +5034,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ "block2", - "objc2", + "objc2 0.5.2", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -5014,8 +5047,19 @@ checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ "bitflags 2.8.0", "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c41bc8b0e50ea7a5304a56f25e0066f526e99641b46fd7b9ad4421dd35bff6" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", + "objc2-foundation 0.3.0", ] [[package]] @@ -5026,9 +5070,22 @@ checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ "bitflags 2.8.0", "block2", - "objc2", - "objc2-foundation", - "objc2-metal", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb3794501bb1bee12f08dcad8c61f2a5875791ad1c6f47faa71a0f033f20071" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", + "objc2-core-foundation", + "objc2-foundation 0.3.0", + "objc2-metal 0.3.0", ] [[package]] @@ -5037,8 +5094,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -5049,14 +5106,14 @@ checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ "bitflags 2.8.0", "block2", - "objc2", + "objc2 0.5.2", "objc2-cloud-kit", "objc2-core-data", "objc2-core-image", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-link-presentation", - "objc2-quartz-core", + "objc2-quartz-core 0.2.2", "objc2-symbols", "objc2-uniform-type-identifiers", "objc2-user-notifications", @@ -5069,8 +5126,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -5081,9 +5138,9 @@ checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ "bitflags 2.8.0", "block2", - "objc2", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -5115,9 +5172,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" dependencies = [ "critical-section", "portable-atomic", @@ -5161,9 +5218,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.9.2" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6520c8cc998c5741ee68ec1dc369fc47e5f0ea5320018ecf2a1ccd6328f48b" +checksum = "2a604e53c24761286860eba4e2c8b23a0161526476b1de520139d69cdb85a6b5" dependencies = [ "log", "windows-sys 0.52.0", @@ -5186,9 +5243,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e89bd74250a03a05cec047b43465469102af803be2bf5e5a1088f8b8455e087" +checksum = "6b1f5dc1b8cf9bc08bfc0843a04ee0fa2e78f1e1fa4b126844a383af4f25f0ec" dependencies = [ "gio", "glib", @@ -5198,9 +5255,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.20.7" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71787e0019b499a5eda889279e4adb455a4f3fdd6870cd5ab7f4a5aa25df6699" +checksum = "0dbb9b751673bd8fe49eb78620547973a1e719ed431372122b20abd12445bab5" dependencies = [ "glib-sys", "gobject-sys", @@ -5232,7 +5289,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", "smallvec", "windows-targets 0.52.6", ] @@ -5272,7 +5329,7 @@ dependencies = [ "deflate", "fax", "globalcache", - "indexmap 2.7.0", + "indexmap 2.7.1", "istring", "itertools 0.10.5", "jpeg-decoder", @@ -5312,22 +5369,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5438,9 +5495,9 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "portable-atomic" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" dependencies = [ "critical-section", ] @@ -5466,7 +5523,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -5476,7 +5533,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5516,7 +5573,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5544,7 +5601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5564,9 +5621,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" dependencies = [ "memchr", ] @@ -5593,8 +5650,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.2", + "zerocopy 0.8.20", ] [[package]] @@ -5604,7 +5672,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.2", ] [[package]] @@ -5613,7 +5691,17 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.20", ] [[package]] @@ -5623,7 +5711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -5652,8 +5740,8 @@ dependencies = [ "once_cell", "paste", "profiling", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "simd_helpers", "system-deps 6.2.2", "thiserror 1.0.69", @@ -5690,13 +5778,14 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "raw-window-metal" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2000e45d7daa9b6d946e88dfa1d7ae330424a81918a6545741821c989eb80a9" +checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" dependencies = [ - "objc2", - "objc2-foundation", - "objc2-quartz-core", + "objc2 0.6.0", + "objc2-core-foundation", + "objc2-foundation 0.3.0", + "objc2-quartz-core 0.3.0", ] [[package]] @@ -5760,9 +5849,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ "bitflags 2.8.0", ] @@ -5773,7 +5862,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -5848,9 +5937,9 @@ dependencies = [ "core-foundation-sys", "js-sys", "log", - "objc2", + "objc2 0.5.2", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.2.2", "pollster", "raw-window-handle 0.6.2", "urlencoding", @@ -5907,9 +5996,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.5.0" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +checksum = "0b3aba5104622db5c9fc61098de54708feb732e7763d7faa2fa625899f00bf6f" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -5918,22 +6007,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.5.0" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +checksum = "1f198c73be048d2c5aa8e12f7960ad08443e56fd39cc26336719fdb4ea0ebaae" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.96", + "syn 2.0.98", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.5.0" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +checksum = "5a2fcdc9f40c8dc2922842ca9add611ad19f332227fc651d015881ad1552bd9a" dependencies = [ "sha2", "walkdir", @@ -5986,9 +6075,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.43" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.8.0", "errno", @@ -6051,9 +6140,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "safe_arch" @@ -6121,28 +6210,28 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6158,9 +6247,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -6176,7 +6265,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6303,7 +6392,7 @@ dependencies = [ "regex", "serde_json", "tar", - "toml 0.8.19", + "toml 0.8.20", ] [[package]] @@ -6381,9 +6470,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "smithay-client-toolkit" @@ -6478,11 +6567,11 @@ dependencies = [ "js-sys", "log", "memmap2", - "objc2", - "objc2-foundation", - "objc2-quartz-core", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", "raw-window-handle 0.6.2", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", "rustix", "tiny-xlib", "wasm-bindgen", @@ -6581,7 +6670,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6592,9 +6681,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svgtypes" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794de53cc48eaabeed0ab6a3404a65f40b3e38c067e4435883a65d2aa4ca000e" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ "kurbo", "siphasher", @@ -6808,9 +6897,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -6825,7 +6914,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6846,7 +6935,7 @@ dependencies = [ "cfg-expr 0.15.8", "heck 0.5.0", "pkg-config", - "toml 0.8.19", + "toml 0.8.20", "version-compare", ] @@ -6859,7 +6948,7 @@ dependencies = [ "cfg-expr 0.17.2", "heck 0.5.0", "pkg-config", - "toml 0.8.19", + "toml 0.8.20", "version-compare", ] @@ -6871,9 +6960,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -6888,13 +6977,13 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.15.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand", - "getrandom", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -6941,7 +7030,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6952,7 +7041,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7094,9 +7183,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -7115,11 +7204,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -7146,7 +7235,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7200,15 +7289,15 @@ dependencies = [ [[package]] name = "trash" -version = "5.2.1" +version = "5.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e5ca62c20366b4685e3e41fba17bc7c9bbdcb82e65a89d6fda2ceea5fffd2f" +checksum = "22746c6b0c6d85d60a8f0d858f7057dfdf11297c132679f452ec908fba42b871" dependencies = [ "chrono", "libc", "log", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "once_cell", "percent-encoding", "scopeguard", @@ -7267,9 +7356,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "tz-rs" @@ -7282,9 +7371,9 @@ dependencies = [ [[package]] name = "udev" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d5c197b95f1769931c89f85c33c407801d1fb7a311113bc0b39ad036f1bd81" +checksum = "af4e37e9ea4401fc841ff54b9ddfc9be1079b1e89434c1a6a865dd68980f7e9f" dependencies = [ "io-lifetimes", "libc", @@ -7360,9 +7449,9 @@ checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-linebreak" @@ -7480,9 +7569,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" +checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" [[package]] name = "v_frame" @@ -7523,7 +7612,7 @@ dependencies = [ "image 0.25.5", "imageproc", "itertools 0.13.0", - "rand", + "rand 0.8.5", "winapi", ] @@ -7539,7 +7628,7 @@ dependencies = [ "image 0.25.5", "itertools 0.13.0", "ndarray", - "rand", + "rand 0.8.5", "rustdct", "serde", "thiserror 2.0.11", @@ -7575,7 +7664,7 @@ checksum = "d8502f961cf2f1359fed21a70f67c831ccb3ab9e4c0b4dd3ad40387fbe8875db" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7591,7 +7680,7 @@ dependencies = [ "crossbeam-queue", "half", "heck 0.4.1", - "indexmap 2.7.0", + "indexmap 2.7.1", "libloading 0.8.6", "objc", "once_cell", @@ -7623,6 +7712,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -7645,7 +7743,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -7680,7 +7778,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7696,9 +7794,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs", @@ -7710,9 +7808,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ "bitflags 2.8.0", "rustix", @@ -7733,9 +7831,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" +checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" dependencies = [ "rustix", "wayland-client", @@ -7744,9 +7842,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.5" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ "bitflags 2.8.0", "wayland-backend", @@ -7756,9 +7854,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" +checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" dependencies = [ "bitflags 2.8.0", "wayland-backend", @@ -7769,9 +7867,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" +checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" dependencies = [ "bitflags 2.8.0", "wayland-backend", @@ -7782,9 +7880,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", "quick-xml", @@ -7793,9 +7891,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ "dlib", "log", @@ -7953,7 +8051,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7964,7 +8062,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7975,7 +8073,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -7986,7 +8084,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8233,9 +8331,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.8" +version = "0.30.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d74280aabb958072864bff6cfbcf9025cf8bfacdde5e32b5e12920ef703b0f" +checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" dependencies = [ "ahash", "android-activity", @@ -8254,9 +8352,9 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2", + "objc2 0.5.2", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-ui-kit", "orbclient", "percent-encoding", @@ -8285,9 +8383,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.24" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" dependencies = [ "memchr", ] @@ -8301,6 +8399,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -8468,7 +8575,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -8496,7 +8603,7 @@ dependencies = [ "hex", "nix", "ordered-stream", - "rand", + "rand 0.8.5", "serde", "serde_repr", "sha1", @@ -8512,9 +8619,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.3.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "192a0d989036cd60a1e91a54c9851fb9ad5bd96125d41803eed79d2e2ef74bd7" +checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" dependencies = [ "async-broadcast", "async-executor", @@ -8529,7 +8636,7 @@ dependencies = [ "enumflags2", "event-listener", "futures-core", - "futures-util", + "futures-lite", "hex", "nix", "ordered-stream", @@ -8541,9 +8648,9 @@ dependencies = [ "windows-sys 0.59.0", "winnow", "xdg-home", - "zbus_macros 5.3.0", - "zbus_names 4.1.1", - "zvariant 5.2.0", + "zbus_macros 5.5.0", + "zbus_names 4.2.0", + "zvariant 5.4.0", ] [[package]] @@ -8555,23 +8662,23 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "zvariant_utils 2.1.0", ] [[package]] name = "zbus_macros" -version = "5.3.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3685b5c81fce630efc3e143a4ded235b107f1b1cdf186c3f115529e5e5ae4265" +checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", - "zbus_names 4.1.1", - "zvariant 5.2.0", - "zvariant_utils 3.1.0", + "syn 2.0.98", + "zbus_names 4.2.0", + "zvariant 5.4.0", + "zvariant_utils 3.2.0", ] [[package]] @@ -8587,14 +8694,14 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.1.1" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "519629a3f80976d89c575895b05677cbc45eaf9f70d62a364d819ba646409cc8" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", "winnow", - "zvariant 5.2.0", + "zvariant 5.4.0", ] [[package]] @@ -8604,7 +8711,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +dependencies = [ + "zerocopy-derive 0.8.20", ] [[package]] @@ -8615,7 +8731,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -8635,7 +8762,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -8656,7 +8783,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8678,7 +8805,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -8696,10 +8823,10 @@ dependencies = [ "displaydoc", "flate2", "hmac", - "indexmap 2.7.0", + "indexmap 2.7.1", "memchr", "pbkdf2", - "rand", + "rand 0.8.5", "sha1", "thiserror 2.0.11", "time", @@ -8761,9 +8888,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.2.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e6b9b5f1361de2d5e7d9fd1ee5f6f7fcb6060618a1f82f3472f58f2b8d4be9" +checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" dependencies = [ "endi", "enumflags2", @@ -8771,8 +8898,8 @@ dependencies = [ "static_assertions", "url", "winnow", - "zvariant_derive 5.2.0", - "zvariant_utils 3.1.0", + "zvariant_derive 5.4.0", + "zvariant_utils 3.2.0", ] [[package]] @@ -8784,21 +8911,21 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "zvariant_utils 2.1.0", ] [[package]] name = "zvariant_derive" -version = "5.2.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573a8dd76961957108b10f7a45bac6ab1ea3e9b7fe01aff88325dc57bb8f5c8b" +checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", - "zvariant_utils 3.1.0", + "syn 2.0.98", + "zvariant_utils 3.2.0", ] [[package]] @@ -8809,19 +8936,19 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "zvariant_utils" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd46446ea2a1f353bfda53e35f17633afa79f4fe290a611c94645c69fe96a50" +checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" dependencies = [ "proc-macro2", "quote", "serde", "static_assertions", - "syn 2.0.96", + "syn 2.0.98", "winnow", ] diff --git a/Changelog.md b/Changelog.md index 189ec7ad..f700795b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,21 +2,34 @@ ### Breaking changes - Video cache is now incompatible with previous versions, and needs to be regenerated +- Image cache, due using by now exif orientation, is incompatible with previous versions, and needs to be regenerated +- Duplicate cache, due using smaller prehash size, is incompatible with previous versions, and needs to be regenerated ### Known regressions -- Crashes when using similar videos(when hashing invalid files) - -### CI +- Rarely crashes when using similar videos tool with some broken videos ### Core -- Updated vid_dup_finder, now it is able to find similar videos shorter than 30 seconds - [#]() -- More supported jxl image formats(using built-in jxl -> image-rs converter) - [#]() -- Rotating all images by default, basing on their exif orientation - [#]() -- Using reusable and bigger buffer for reading files in duplicate mode - [#]() +- Rotating all images by default, basing on their exif orientation - [#1368](https://github.com/qarmin/czkawka/pull/1368) +- Fixed negative time crash in some OS - [#1369](https://github.com/qarmin/czkawka/pull/1369) +- Updated vid_dup_finder, now it is able to find similar videos shorter than 30 seconds - [#1425](https://github.com/qarmin/czkawka/pull/1425) +- More supported jxl image formats(using built-in jxl -> image-rs converter) - [#1425](https://github.com/qarmin/czkawka/pull/1425) +- Using reusable and bigger buffer for reading files in duplicate mode - [#1425](https://github.com/qarmin/czkawka/pull/1425) +- Option to use a lot of faster image resizing, to speedup image hashing - [#1458](https://github.com/qarmin/czkawka/pull/1458) +- Added to logs info about os and compiled app features - [#1458](https://github.com/qarmin/czkawka/pull/1458) +- Added size progress in duplicate and similar images mode - [#1458](https://github.com/qarmin/czkawka/pull/1458) +- Ability to stop calculating hash of bigger files in the middle of process - [#1458](https://github.com/qarmin/czkawka/pull/1458) +- Using multithreading, to filter out hard links - [#1458](https://github.com/qarmin/czkawka/pull/1458) +- Decreased prehash read file size to max 4k bytes - [#1458](https://github.com/qarmin/czkawka/pull/1458) ### Krokiet +- Changed default tab to duplicate files - [#1368](https://github.com/qarmin/czkawka/pull/1368) +- Progress bar in duplicate and similar images mode, now shows progress of processed bytes, not files - [#1458](https://github.com/qarmin/czkawka/pull/1458) ### GTK GUI +- Added window icon in wayland - [#1400](https://github.com/qarmin/czkawka/pull/1400) +- Disabled broken sort button - [#1400](https://github.com/qarmin/czkawka/pull/1400) + +### CI ### CLI diff --git a/czkawka_cli/Cargo.toml b/czkawka_cli/Cargo.toml index 775960e3..d58030c4 100644 --- a/czkawka_cli/Cargo.toml +++ b/czkawka_cli/Cargo.toml @@ -2,8 +2,8 @@ name = "czkawka_cli" version = "8.0.0" authors = ["Rafał Mikrut "] -edition = "2021" -rust-version = "1.82.0" +edition = "2024" +rust-version = "1.85.0" description = "CLI frontend of Czkawka" license = "MIT" homepage = "https://github.com/qarmin/czkawka" diff --git a/czkawka_cli/src/commands.rs b/czkawka_cli/src/commands.rs index 3fbc6f88..dc267ea9 100644 --- a/czkawka_cli/src/commands.rs +++ b/czkawka_cli/src/commands.rs @@ -1,12 +1,12 @@ use std::path::PathBuf; +use czkawka_core::CZKAWKA_VERSION; use czkawka_core::broken_files::CheckedTypes; use czkawka_core::common_dir_traversal::CheckingMethod; use czkawka_core::common_tool::DeleteMethod; use czkawka_core::duplicate::HashType; use czkawka_core::same_music::MusicSimilarity; use czkawka_core::similar_images::SimilarityPreset; -use czkawka_core::CZKAWKA_VERSION; use image_hasher::{FilterType, HashAlg}; #[derive(clap::Parser)] diff --git a/czkawka_cli/src/main.rs b/czkawka_cli/src/main.rs index 3847e041..6722e23f 100644 --- a/czkawka_cli/src/main.rs +++ b/czkawka_cli/src/main.rs @@ -6,11 +6,11 @@ use std::thread; use clap::Parser; use commands::Commands; -use crossbeam_channel::{bounded, unbounded, Receiver, Sender}; +use crossbeam_channel::{Receiver, Sender, bounded, unbounded}; use czkawka_core::bad_extensions::{BadExtensions, BadExtensionsParameters}; use czkawka_core::big_file::{BigFile, BigFileParameters, SearchMode}; use czkawka_core::broken_files::{BrokenFiles, BrokenFilesParameters, CheckedTypes}; -use czkawka_core::common::{print_version_mode, set_number_of_threads, setup_logger, DEFAULT_THREAD_SIZE}; +use czkawka_core::common::{DEFAULT_THREAD_SIZE, print_version_mode, set_number_of_threads, setup_logger}; use czkawka_core::common_tool::{CommonData, DeleteMethod}; #[allow(unused_imports)] // It is used in release for print_results_to_output(). use czkawka_core::common_traits::*; @@ -20,7 +20,7 @@ use czkawka_core::empty_folder::EmptyFolder; use czkawka_core::invalid_symlinks::InvalidSymlinks; use czkawka_core::progress_data::ProgressData; use czkawka_core::same_music::{SameMusic, SameMusicParameters}; -use czkawka_core::similar_images::{return_similarity_from_similarity_preset, test_image_conversion_speed, SimilarImages, SimilarImagesParameters}; +use czkawka_core::similar_images::{SimilarImages, SimilarImagesParameters, return_similarity_from_similarity_preset, test_image_conversion_speed}; use czkawka_core::similar_videos::{SimilarVideos, SimilarVideosParameters}; use czkawka_core::temporary::Temporary; use log::error; @@ -61,7 +61,7 @@ fn main() { Commands::BrokenFiles(broken_files_args) => broken_files(broken_files_args, &stop_receiver, &progress_sender), Commands::SimilarVideos(similar_videos_args) => similar_videos(similar_videos_args, &stop_receiver, &progress_sender), Commands::BadExtensions(bad_extensions_args) => bad_extensions(bad_extensions_args, &stop_receiver, &progress_sender), - Commands::Tester {} => test_image_conversion_speed(), + Commands::Tester => test_image_conversion_speed(), }) .expect("Failed to spawn calculation thread"); ctrlc::set_handler(move || { diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index a60321bd..a59650ec 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -2,8 +2,8 @@ name = "czkawka_core" version = "8.0.0" authors = ["Rafał Mikrut "] -edition = "2021" -rust-version = "1.82.0" +edition = "2024" +rust-version = "1.85.0" description = "Core of Czkawka app" license = "MIT" homepage = "https://github.com/qarmin/czkawka" @@ -69,7 +69,7 @@ jxl-oxide = { version = "0.11.0", features = ["image"] } # Checking for invalid extensions mime_guess = "2.0" -infer = "0.16" +infer = "0.19" # Heif/Heic libheif-rs = { version = "=0.18.0", optional = true } # Do not upgrade now, since Ubuntu 22.04 not works with newer version @@ -86,6 +86,7 @@ log = "0.4.22" handsome_logger = "0.8" fun_time = { version = "0.3", features = ["log"] } itertools = "0.14" +static_assertions = "1.1.0" # Don't update anymore! This crate has a bug. I've submitted a patch upstream, but the change is breaking. The current code relies on the bug to work correctly! # Warning by CalunVier 2024.7.15 @@ -97,7 +98,6 @@ rustc_version = "0.4" [dev-dependencies] criterion = "0.5" -const_format = "0.2" [[bench]] name = "hash_calculation_benchmark" diff --git a/czkawka_core/benches/hash_calculation_benchmark.rs b/czkawka_core/benches/hash_calculation_benchmark.rs index 87b04699..d8f47ed6 100644 --- a/czkawka_core/benches/hash_calculation_benchmark.rs +++ b/czkawka_core/benches/hash_calculation_benchmark.rs @@ -2,9 +2,10 @@ use std::env::temp_dir; use std::fs::File; use std::io::Write; use std::path::PathBuf; +use std::sync::Arc; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use czkawka_core::duplicate::{hash_calculation, DuplicateEntry, HashType}; +use criterion::{Criterion, black_box, criterion_group, criterion_main}; +use czkawka_core::duplicate::{DuplicateEntry, HashType, hash_calculation}; fn setup_test_file(size: u64) -> PathBuf { let mut path = temp_dir(); @@ -31,7 +32,7 @@ fn benchmark_hash_calculation_vec, - atomic_counter: &Arc, + items_counter: &Arc, stop_receiver: Option<&Receiver<()>>, check_was_stopped: &AtomicBool, hashmap_workarounds: &HashMap<&str, Vec<&str>>, @@ -310,7 +310,7 @@ impl BadExtensions { files_to_check .into_par_iter() .map(|file_entry| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); return None; diff --git a/czkawka_core/src/big_file.rs b/czkawka_core/src/big_file.rs index 6fe480be..11a467ec 100644 --- a/czkawka_core/src/big_file.rs +++ b/czkawka_core/src/big_file.rs @@ -3,7 +3,7 @@ use std::io::Write; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; -use humansize::{format_size, BINARY}; +use humansize::{BINARY, format_size}; use log::debug; use rayon::prelude::*; diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index 3d6a1de8..a2ad9fa4 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -8,16 +8,16 @@ use std::{fs, mem, panic}; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; use log::debug; -use pdf::file::FileOptions; -use pdf::object::ParseOptions; use pdf::PdfError; use pdf::PdfError::Try; +use pdf::file::FileOptions; +use pdf::object::ParseOptions; use rayon::prelude::*; use serde::{Deserialize, Serialize}; use crate::common::{ - check_if_stop_received, create_crash_message, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, WorkContinueStatus, AUDIO_FILES_EXTENSIONS, - IMAGE_RS_BROKEN_FILES_EXTENSIONS, PDF_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS, + AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, PDF_FILES_EXTENSIONS, WorkContinueStatus, ZIP_FILES_EXTENSIONS, check_if_stop_received, create_crash_message, + prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, }; use crate::common_cache::{extract_loaded_cache, get_broken_files_cache_file, load_cache_from_file_generalized_by_path, save_cache_to_file_generalized}; use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType}; @@ -303,14 +303,14 @@ impl BrokenFiles { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache(); - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::BrokenFilesChecking, non_cached_files_to_check.len(), self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::BrokenFilesChecking, non_cached_files_to_check.len(), self.get_test_type(), 0); debug!("look_for_broken_files - started finding for broken files"); let mut vec_file_entry: Vec = non_cached_files_to_check .into_par_iter() .map(|(_, file_entry)| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { return None; } diff --git a/czkawka_core/src/common.rs b/czkawka_core/src/common.rs index c81798f8..6692e93f 100644 --- a/czkawka_core/src/common.rs +++ b/czkawka_core/src/common.rs @@ -2,9 +2,9 @@ use std::cmp::Ordering; use std::ffi::OsString; use std::fs::{DirEntry, File, OpenOptions}; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, AtomicUsize}; -use std::sync::{atomic, Arc}; -use std::thread::{sleep, JoinHandle}; +use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize}; +use std::sync::{Arc, atomic}; +use std::thread::{JoinHandle, sleep}; use std::time::{Duration, Instant}; use std::{fs, thread}; @@ -12,8 +12,9 @@ use crossbeam_channel::Sender; use directories_next::ProjectDirs; use fun_time::fun_time; use handsome_logger::{ColorChoice, ConfigBuilder, TerminalMode}; -use log::{debug, info, warn, LevelFilter, Record}; +use log::{LevelFilter, Record, debug, info, warn}; +use crate::CZKAWKA_VERSION; // #[cfg(feature = "heif")] // use libheif_rs::LibHeif; use crate::common_dir_traversal::{CheckingMethod, ToolType}; @@ -24,7 +25,6 @@ use crate::common_tool::DeleteMethod; use crate::common_traits::ResultEntry; use crate::duplicate::make_hard_link; use crate::progress_data::{CurrentStage, ProgressData}; -use crate::CZKAWKA_VERSION; static NUMBER_OF_THREADS: state::InitCell = state::InitCell::new(); static ALL_AVAILABLE_THREADS: state::InitCell = state::InitCell::new(); @@ -39,11 +39,7 @@ pub enum WorkContinueStatus { pub fn get_number_of_threads() -> usize { let data = NUMBER_OF_THREADS.get(); - if *data >= 1 { - *data - } else { - get_all_available_threads() - } + if *data >= 1 { *data } else { get_all_available_threads() } } fn filtering_messages(record: &Record) -> bool { @@ -89,14 +85,56 @@ pub fn print_version_mode() { #[cfg(feature = "fast_image_resize")] features.push("fast_image_resize"); + #[allow(unused_mut)] + let mut app_cpu_version = "Baseline"; + let mut os_cpu_version = "Baseline"; + if cfg!(target_feature = "sse2") { + app_cpu_version = "x86-64-v1 (SSE2)"; + } + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + if is_x86_feature_detected!("sse2") { + os_cpu_version = "x86-64-v1 (SSE2)"; + } + + if cfg!(target_feature = "popcnt") { + app_cpu_version = "x86-64-v2 (SSE4.2 + POPCNT)"; + } + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + if is_x86_feature_detected!("popcnt") { + os_cpu_version = "x86-64-v2 (SSE4.2 + POPCNT)"; + } + + if cfg!(target_feature = "avx2") { + app_cpu_version = "x86-64-v3 (AVX2) or x86-64-v4 (AVX-512)"; + } + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + if is_x86_feature_detected!("avx2") { + os_cpu_version = "x86-64-v3 (AVX2)"; + } + + // TODO - https://github.com/rust-lang/rust/issues/44839 - remove "or" from above when fixed + // Currently this is always false, because cfg!(target_feature = "avx512f") is not working + // What is strange, because is_x86_feature_detected!("avx512f") is working + if cfg!(target_feature = "avx512f") { + app_cpu_version = "x86-64-v4 (AVX-512)"; + } + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + if is_x86_feature_detected!("avx512f") { + os_cpu_version = "x86-64-v4 (AVX-512)"; + } + + // TODO - probably needs to add arm and other architectures, need help, because I don't have access to them + info!( - "App version: {CZKAWKA_VERSION}, {debug_release} mode, rust {rust_version}, os {} {} [{} {}], {processors} cpu/threads, features({}): [{}]", + "App version: {CZKAWKA_VERSION}, {debug_release} mode, rust {rust_version}, os {} {} [{} {}], {processors} cpu/threads, features({}): [{}], app cpu version: [{}], os cpu version: [{}]", info.os_type(), info.version(), std::env::consts::ARCH, info.bitness(), features.len(), - features.join(", ") + features.join(", "), + app_cpu_version, + os_cpu_version, ); if cfg!(debug_assertions) { warn!("You are running debug version of app which is a lot of slower than release version."); @@ -300,7 +338,9 @@ pub fn split_path_compare(path_a: &Path, path_b: &Path) -> Ordering { } pub fn create_crash_message(library_name: &str, file_path: &str, home_library_url: &str) -> String { - format!("{library_name} library crashed when opening \"{file_path}\", please check if this is fixed with the latest version of {library_name} and if it is not fixed, please report bug here - {home_library_url}") + format!( + "{library_name} library crashed when opening \"{file_path}\", please check if this is fixed with the latest version of {library_name} and if it is not fixed, please report bug here - {home_library_url}" + ) } pub fn regex_check(expression_item: &SingleExcludedItem, directory_name: &str) -> bool { @@ -523,18 +563,21 @@ where pub fn prepare_thread_handler_common( progress_sender: Option<&Sender>, sstage: CurrentStage, - max_value: usize, + max_items: usize, test_type: (ToolType, CheckingMethod), -) -> (JoinHandle<()>, Arc, Arc, AtomicBool) { + max_size: u64, +) -> (JoinHandle<()>, Arc, Arc, AtomicBool, Arc) { let (tool_type, checking_method) = test_type; - assert_ne!(tool_type, ToolType::None, "ToolType::None should not exist"); + assert_ne!(tool_type, ToolType::None, "Cannot send progress data for ToolType::None"); let progress_thread_run = Arc::new(AtomicBool::new(true)); - let atomic_counter = Arc::new(AtomicUsize::new(0)); + let items_counter = Arc::new(AtomicUsize::new(0)); + let size_counter = Arc::new(AtomicU64::new(0)); let check_was_stopped = AtomicBool::new(false); let progress_thread_sender = if let Some(progress_sender) = progress_sender { let progress_send = progress_sender.clone(); let progress_thread_run = progress_thread_run.clone(); - let atomic_counter = atomic_counter.clone(); + let items_counter = items_counter.clone(); + let size_counter = size_counter.clone(); thread::spawn(move || { // Use earlier time, to send immediately first message let mut time_since_last_send = Instant::now().checked_sub(Duration::from_secs(10u64)).unwrap_or_else(Instant::now); @@ -546,8 +589,10 @@ pub fn prepare_thread_handler_common( checking_method, current_stage_idx: sstage.get_current_stage(), max_stage_idx: tool_type.get_max_stage(checking_method), - entries_checked: atomic_counter.load(atomic::Ordering::Relaxed), - entries_to_check: max_value, + entries_checked: items_counter.load(atomic::Ordering::Relaxed), + entries_to_check: max_items, + bytes_checked: size_counter.load(atomic::Ordering::Relaxed), + bytes_to_check: max_size, tool_type, }; @@ -565,7 +610,7 @@ pub fn prepare_thread_handler_common( } else { thread::spawn(|| {}) }; - (progress_thread_sender, progress_thread_run, atomic_counter, check_was_stopped) + (progress_thread_sender, progress_thread_run, items_counter, check_was_stopped, size_counter) } #[inline] diff --git a/czkawka_core/src/common_cache.rs b/czkawka_core/src/common_cache.rs index bfad51e1..132f3c8e 100644 --- a/czkawka_core/src/common_cache.rs +++ b/czkawka_core/src/common_cache.rs @@ -15,6 +15,7 @@ use crate::duplicate::HashType; use crate::similar_images::{convert_algorithm_to_string, convert_filters_to_string}; const CACHE_VERSION: &str = "70"; +const CACHE_DUPLICATE_VERSION: &str = "90"; #[cfg(feature = "fast_image_resize")] const CACHE_IMAGE_VERSION: &str = "90_fast_resize"; #[cfg(not(feature = "fast_image_resize"))] @@ -46,7 +47,7 @@ pub fn get_similar_music_cache_file(checking_tags: bool) -> String { pub fn get_duplicate_cache_file(type_of_hash: &HashType, is_prehash: bool) -> String { let prehash_str = if is_prehash { "_prehash" } else { "" }; - format!("cache_duplicates_{type_of_hash:?}{prehash_str}_{CACHE_VERSION}.bin") + format!("cache_duplicates_{type_of_hash:?}{prehash_str}_{CACHE_DUPLICATE_VERSION}.bin") } #[fun_time(message = "save_cache_to_file_generalized", level = "debug")] diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index f484a067..b7a0dd08 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -317,8 +317,8 @@ where // Add root folders for finding let mut folders_to_check: Vec = self.root_dirs.clone(); - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(self.progress_sender, CurrentStage::CollectingFiles, 0, (self.tool_type, self.checking_method)); + let (progress_thread_handle, progress_thread_run, items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(self.progress_sender, CurrentStage::CollectingFiles, 0, (self.tool_type, self.checking_method), 0); let DirTraversal { collect, @@ -388,7 +388,7 @@ where } if counter > 0 { // Increase counter in batch, because usually it may be slow to add multiple times atomic value - atomic_counter.fetch_add(counter, Ordering::Relaxed); + items_counter.fetch_add(counter, Ordering::Relaxed); } (dir_result, warnings, fe_result) }) @@ -629,11 +629,7 @@ pub fn inode(_fe: &FileEntry) -> Option { #[cfg(target_family = "unix")] pub fn inode(fe: &FileEntry) -> Option { - if let Ok(meta) = fs::metadata(&fe.path) { - Some(meta.ino()) - } else { - None - } + if let Ok(meta) = fs::metadata(&fe.path) { Some(meta.ino()) } else { None } } pub fn take_1_per_inode((k, mut v): (Option, Vec)) -> Vec { diff --git a/czkawka_core/src/common_image.rs b/czkawka_core/src/common_image.rs index 9c37f750..9b24e92c 100644 --- a/czkawka_core/src/common_image.rs +++ b/czkawka_core/src/common_image.rs @@ -6,8 +6,8 @@ use std::ffi::OsString; use std::fs::{DirEntry, File, OpenOptions}; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, AtomicUsize}; -use std::sync::{atomic, Arc}; -use std::thread::{sleep, JoinHandle}; +use std::sync::{Arc, atomic}; +use std::thread::{JoinHandle, sleep}; use std::time::{Duration, Instant, SystemTime}; use std::{fs, panic, thread}; @@ -25,13 +25,13 @@ use jxl_oxide::{JxlImage, PixelFormat}; use libheif_rs::{ColorSpace, HeifContext, RgbChroma}; #[cfg(feature = "libraw")] use libraw::Processor; -use log::{debug, error, info, warn, LevelFilter, Record}; +use log::{LevelFilter, Record, debug, error, info, warn}; use nom_exif::{ExifIter, ExifTag, MediaParser, MediaSource}; use rawloader::RawLoader; use symphonia::core::conv::IntoSample; use crate::common; -use crate::common::{create_crash_message, HEIC_EXTENSIONS, IMAGE_RS_EXTENSIONS, IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, JXL_IMAGE_EXTENSIONS, RAW_IMAGE_EXTENSIONS}; +use crate::common::{HEIC_EXTENSIONS, IMAGE_RS_EXTENSIONS, IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, JXL_IMAGE_EXTENSIONS, RAW_IMAGE_EXTENSIONS, create_crash_message}; // #[cfg(feature = "heif")] // use libheif_rs::LibHeif; diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 39a2009b..a70275a5 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -8,18 +8,20 @@ use std::io::{self, Error, ErrorKind}; #[cfg(target_family = "unix")] use std::os::unix::fs::MetadataExt; use std::path::{Path, PathBuf}; -use std::sync::atomic::Ordering; +use std::sync::Arc; +use std::sync::atomic::{AtomicU64, Ordering}; use std::{fs, mem}; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; -use humansize::{format_size, BINARY}; +use humansize::{BINARY, format_size}; use log::debug; use rayon::prelude::*; use serde::{Deserialize, Serialize}; +use static_assertions::const_assert; use xxhash_rust::xxh3::Xxh3; -use crate::common::{check_if_stop_received, delete_files_custom, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, WorkContinueStatus}; +use crate::common::{WorkContinueStatus, check_if_stop_received, delete_files_custom, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads}; use crate::common_cache::{get_duplicate_cache_file, load_cache_from_file_generalized_by_size, save_cache_to_file_generalized}; use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType}; use crate::common_tool::{CommonData, CommonToolData, DeleteMethod}; @@ -28,8 +30,11 @@ use crate::progress_data::{CurrentStage, ProgressData}; const TEMP_HARDLINK_FILE: &str = "rzeczek.rxrxrxl"; +pub const PREHASHING_BUFFER_SIZE: u64 = 1024 * 8; +pub const THREAD_BUFFER_SIZE: usize = 2 * 1024 * 1024; + thread_local! { - static THREAD_BUFFER: RefCell> = RefCell::new(vec![0u8; 1024 * 2024]); + static THREAD_BUFFER: RefCell> = RefCell::new(vec![0u8; THREAD_BUFFER_SIZE]); } #[derive(PartialEq, Eq, Clone, Debug, Copy, Default)] @@ -403,18 +408,22 @@ impl DuplicateFinder { DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => { self.common_data.text_messages.warnings.extend(warnings); - for (size, vec) in grouped_file_entries { - if vec.len() <= 1 { - continue; - } + self.files_with_identical_size = grouped_file_entries + .into_par_iter() + .filter_map(|(size, vec)| { + if vec.len() <= 1 { + return None; + } - let vector = if self.get_params().ignore_hard_links { filter_hard_links(&vec) } else { vec }; + let vector = if self.get_params().ignore_hard_links { filter_hard_links(&vec) } else { vec }; - if vector.len() > 1 { - self.files_with_identical_size - .insert(size, vector.into_iter().map(FileEntry::into_duplicate_entry).collect()); - } - } + if vector.len() > 1 { + Some((size, vector.into_iter().map(FileEntry::into_duplicate_entry).collect())) + } else { + None + } + }) + .collect(); self.filter_reference_folders_by_size(); self.calculate_size_stats(); @@ -556,8 +565,8 @@ impl DuplicateFinder { } let check_type = self.get_params().hash_type; - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::DuplicatePreHashCacheLoading, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::DuplicatePreHashCacheLoading, 0, self.get_test_type(), 0); let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.prehash_load_cache_at_start(); @@ -565,11 +574,15 @@ impl DuplicateFinder { if check_if_stop_received(stop_receiver) { return WorkContinueStatus::Stop; } - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, size_counter) = prepare_thread_handler_common( progress_sender, CurrentStage::DuplicatePreHashing, non_cached_files_to_check.values().map(Vec::len).sum(), self.get_test_type(), + non_cached_files_to_check + .iter() + .map(|(size, items)| items.len() as u64 * PREHASHING_BUFFER_SIZE.min(*size)) + .sum::(), ); debug!("Starting calculating prehash"); @@ -580,34 +593,41 @@ impl DuplicateFinder { let mut hashmap_with_hash: BTreeMap> = Default::default(); let mut errors: Vec = Vec::new(); - atomic_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed); + items_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); return None; } THREAD_BUFFER.with_borrow_mut(|buffer| { for mut file_entry in vec_file_entry { - match hash_calculation(buffer, &file_entry, check_type, 1024 * 32) { + match hash_calculation_limit(buffer, &file_entry, check_type, PREHASHING_BUFFER_SIZE, &size_counter) { Ok(hash_string) => { file_entry.hash = hash_string.clone(); hashmap_with_hash.entry(hash_string).or_default().push(file_entry); } Err(s) => errors.push(s), } + if check_if_stop_received(stop_receiver) { + check_was_stopped.store(true, Ordering::Relaxed); + return None; + } } - }); + + Some(()) + })?; Some((size, hashmap_with_hash, errors)) }) .while_some() .collect(); + debug!("Completed calculating prehash"); send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); // Saving into cache - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::DuplicatePreHashCacheSaving, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::DuplicatePreHashCacheSaving, 0, self.get_test_type(), 0); // Add data from cache for (size, vec_file_entry) in &records_already_cached { @@ -769,8 +789,8 @@ impl DuplicateFinder { return WorkContinueStatus::Continue; } - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::DuplicateCacheLoading, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::DuplicateCacheLoading, 0, self.get_test_type(), 0); let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.full_hashing_load_cache_at_start(pre_checked_map); @@ -779,11 +799,12 @@ impl DuplicateFinder { return WorkContinueStatus::Stop; } - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, size_counter) = prepare_thread_handler_common( progress_sender, CurrentStage::DuplicateFullHashing, non_cached_files_to_check.values().map(Vec::len).sum(), self.get_test_type(), + non_cached_files_to_check.iter().map(|(size, items)| (*size) * items.len() as u64).sum::(), ); let check_type = self.get_params().hash_type; @@ -791,31 +812,32 @@ impl DuplicateFinder { let mut full_hash_results: Vec<(u64, BTreeMap>, Vec)> = non_cached_files_to_check .into_par_iter() .map(|(size, vec_file_entry)| { + let size_counter = size_counter.clone(); let mut hashmap_with_hash: BTreeMap> = Default::default(); let mut errors: Vec = Vec::new(); - let mut exam_stopped = false; - atomic_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed); + items_counter.fetch_add(vec_file_entry.len(), Ordering::Relaxed); THREAD_BUFFER.with_borrow_mut(|buffer| { for mut file_entry in vec_file_entry { if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); - exam_stopped = true; - break; + return None; } - match hash_calculation(buffer, &file_entry, check_type, u64::MAX) { + match hash_calculation(buffer, &file_entry, check_type, &size_counter, stop_receiver) { Ok(hash_string) => { - file_entry.hash = hash_string.clone(); - hashmap_with_hash.entry(hash_string.clone()).or_default().push(file_entry); + if let Some(hash_string) = hash_string { + file_entry.hash = hash_string.clone(); + hashmap_with_hash.entry(hash_string).or_default().push(file_entry); + } else { + return None; + } } Err(s) => errors.push(s), } } - }); - if exam_stopped { - return None; - } + Some(()) + })?; Some((size, hashmap_with_hash, errors)) }) @@ -825,8 +847,8 @@ impl DuplicateFinder { // Even if clicked stop, save items to cache and show results send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::DuplicateCacheSaving, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::DuplicateCacheSaving, 0, self.get_test_type(), 0); self.full_hashing_save_cache_at_exit(records_already_cached, &mut full_hash_results, loaded_hash_map); @@ -1300,13 +1322,45 @@ pub trait MyHasher { fn finalize(&self) -> String; } -pub fn hash_calculation(buffer: &mut [u8], file_entry: &DuplicateEntry, hash_type: HashType, limit: u64) -> Result { +pub fn hash_calculation_limit(buffer: &mut [u8], file_entry: &DuplicateEntry, hash_type: HashType, limit: u64, size_counter: &Arc) -> Result { + // This function is used only to calculate hash of file with limit + // We must ensure that buffer is big enough to store all data + // We don't need to check that each time + const_assert!(PREHASHING_BUFFER_SIZE <= THREAD_BUFFER_SIZE as u64); + let mut file_handler = match File::open(&file_entry.path) { Ok(t) => t, - Err(e) => return Err(format!("Unable to check hash of file {:?}, reason {e}", file_entry.path)), + Err(e) => { + size_counter.fetch_add(limit, Ordering::Relaxed); + return Err(format!("Unable to check hash of file {:?}, reason {e}", file_entry.path)); + } + }; + let hasher = &mut *hash_type.hasher(); + let n = match file_handler.read(&mut buffer[..limit as usize]) { + Ok(t) => t, + Err(e) => return Err(format!("Error happened when checking hash of file {:?}, reason {}", file_entry.path, e)), + }; + + hasher.update(&buffer[..n]); + size_counter.fetch_add(n as u64, Ordering::Relaxed); + Ok(hasher.finalize()) +} + +pub fn hash_calculation( + buffer: &mut [u8], + file_entry: &DuplicateEntry, + hash_type: HashType, + size_counter: &Arc, + stop_receiver: Option<&Receiver<()>>, +) -> Result, String> { + let mut file_handler = match File::open(&file_entry.path) { + Ok(t) => t, + Err(e) => { + size_counter.fetch_add(file_entry.size, Ordering::Relaxed); + return Err(format!("Unable to check hash of file {:?}, reason {e}", file_entry.path)); + } }; let hasher = &mut *hash_type.hasher(); - let mut current_file_read_bytes: u64 = 0; loop { let n = match file_handler.read(buffer) { Ok(0) => break, @@ -1314,14 +1368,13 @@ pub fn hash_calculation(buffer: &mut [u8], file_entry: &DuplicateEntry, hash_typ Err(e) => return Err(format!("Error happened when checking hash of file {:?}, reason {}", file_entry.path, e)), }; - current_file_read_bytes += n as u64; hasher.update(&buffer[..n]); - - if current_file_read_bytes >= limit { - break; + size_counter.fetch_add(n as u64, Ordering::Relaxed); + if check_if_stop_received(stop_receiver) { + return Ok(None); } } - Ok(hasher.finalize()) + Ok(Some(hasher.finalize())) } impl MyHasher for blake3::Hasher { @@ -1365,7 +1418,7 @@ impl CommonData for DuplicateFinder { #[cfg(test)] mod tests { - use std::fs::{read_dir, File, Metadata}; + use std::fs::{File, Metadata, read_dir}; use std::io; #[cfg(target_family = "windows")] use std::os::fs::MetadataExt; @@ -1462,26 +1515,38 @@ mod tests { let mut buf = [0u8; 1 << 10]; let src = dir.path().join("a"); let mut file = File::create(&src)?; - file.write_all(b"aa")?; + file.write_all(b"aaAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFGGGGGGGGG")?; let e = DuplicateEntry { path: src, ..Default::default() }; - let r = hash_calculation(&mut buf, &e, HashType::Blake3, 0).expect("hash_calculation failed"); + let size_counter = Arc::new(AtomicU64::new(0)); + let r = hash_calculation(&mut buf, &e, HashType::Blake3, &size_counter, None) + .expect("hash_calculation failed") + .expect("hash_calculation returned None"); assert!(!r.is_empty()); + assert_eq!(size_counter.load(Ordering::Relaxed), 45); Ok(()) } #[test] fn test_hash_calculation_limit() -> io::Result<()> { let dir = tempfile::Builder::new().tempdir()?; - let mut buf = [0u8; 1]; + let mut buf = [0u8; 1000]; let src = dir.path().join("a"); let mut file = File::create(&src)?; file.write_all(b"aa")?; let e = DuplicateEntry { path: src, ..Default::default() }; - let r1 = hash_calculation(&mut buf, &e, HashType::Blake3, 1).expect("hash_calculation failed"); - let r2 = hash_calculation(&mut buf, &e, HashType::Blake3, 2).expect("hash_calculation failed"); - let r3 = hash_calculation(&mut buf, &e, HashType::Blake3, u64::MAX).expect("hash_calculation failed"); + let size_counter_1 = Arc::new(AtomicU64::new(0)); + let size_counter_2 = Arc::new(AtomicU64::new(0)); + let size_counter_3 = Arc::new(AtomicU64::new(0)); + let r1 = hash_calculation_limit(&mut buf, &e, HashType::Blake3, 1, &size_counter_1).expect("hash_calculation failed"); + let r2 = hash_calculation_limit(&mut buf, &e, HashType::Blake3, 2, &size_counter_2).expect("hash_calculation failed"); + let r3 = hash_calculation_limit(&mut buf, &e, HashType::Blake3, 1000, &size_counter_3).expect("hash_calculation failed"); assert_ne!(r1, r2); assert_eq!(r2, r3); + + assert_eq!(1, size_counter_1.load(Ordering::Relaxed)); + assert_eq!(2, size_counter_2.load(Ordering::Relaxed)); + assert_eq!(2, size_counter_3.load(Ordering::Relaxed)); + Ok(()) } @@ -1491,7 +1556,7 @@ mod tests { let mut buf = [0u8; 1 << 10]; let src = dir.path().join("a"); let e = DuplicateEntry { path: src, ..Default::default() }; - let r = hash_calculation(&mut buf, &e, HashType::Blake3, 0).expect_err("hash_calculation succeeded"); + let r = hash_calculation(&mut buf, &e, HashType::Blake3, &Arc::default(), None).expect_err("hash_calculation succeeded"); assert!(!r.is_empty()); Ok(()) } diff --git a/czkawka_core/src/empty_folder.rs b/czkawka_core/src/empty_folder.rs index bbcdd9e1..8d1dcca8 100644 --- a/czkawka_core/src/empty_folder.rs +++ b/czkawka_core/src/empty_folder.rs @@ -10,8 +10,8 @@ use fun_time::fun_time; use log::debug; use rayon::prelude::*; -use crate::common::{check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, WorkContinueStatus}; -use crate::common_dir_traversal::{common_get_entry_data, common_get_metadata_dir, common_read_dir, get_modified_time, ToolType}; +use crate::common::{WorkContinueStatus, check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads}; +use crate::common_dir_traversal::{ToolType, common_get_entry_data, common_get_metadata_dir, common_read_dir, get_modified_time}; use crate::common_directory::Directories; use crate::common_items::ExcludedItems; use crate::common_tool::{CommonData, CommonToolData, DeleteMethod}; @@ -105,8 +105,8 @@ impl EmptyFolder { fn check_for_empty_folders(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender>) -> WorkContinueStatus { let mut folders_to_check: Vec = self.common_data.directories.included_directories.clone(); - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::CollectingFiles, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::CollectingFiles, 0, self.get_test_type(), 0); let excluded_items = self.common_data.excluded_items.clone(); let directories = self.common_data.directories.clone(); @@ -173,7 +173,7 @@ impl EmptyFolder { } if counter > 0 { // Increase counter in batch, because usually it may be slow to add multiple times atomic value - atomic_counter.fetch_add(counter, Ordering::Relaxed); + items_counter.fetch_add(counter, Ordering::Relaxed); } (dir_result, warnings, non_empty_folder, folder_entries_list) diff --git a/czkawka_core/src/lib.rs b/czkawka_core/src/lib.rs index c4007e66..15460574 100644 --- a/czkawka_core/src/lib.rs +++ b/czkawka_core/src/lib.rs @@ -6,6 +6,7 @@ #[macro_use] extern crate bitflags; +extern crate core; pub mod big_file; pub mod broken_files; diff --git a/czkawka_core/src/localizer_core.rs b/czkawka_core/src/localizer_core.rs index dc224d8e..058946cb 100644 --- a/czkawka_core/src/localizer_core.rs +++ b/czkawka_core/src/localizer_core.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader}; +use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader}; use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer}; use once_cell::sync::Lazy; use rust_embed::RustEmbed; diff --git a/czkawka_core/src/progress_data.rs b/czkawka_core/src/progress_data.rs index fbae4485..81d22903 100644 --- a/czkawka_core/src/progress_data.rs +++ b/czkawka_core/src/progress_data.rs @@ -1,3 +1,5 @@ +use log::error; + use crate::common_dir_traversal::{CheckingMethod, ToolType}; // Empty files // 0 - Collecting files @@ -62,6 +64,8 @@ pub struct ProgressData { pub max_stage_idx: u8, pub entries_checked: usize, pub entries_to_check: usize, + pub bytes_checked: u64, + pub bytes_to_check: u64, pub tool_type: ToolType, } @@ -121,6 +125,14 @@ impl ProgressData { self.sstage ); } + + // This could be an assert, but it is possible that in duplicate finder, file that will + // be checked, will increase the size of the file between collecting file to scan and + // scanning it. So it is better to just log it + if self.bytes_checked > self.bytes_to_check { + error!("Bytes checked: {}, bytes to check: {}, stage {:?}", self.bytes_checked, self.bytes_to_check, self.sstage); + }; + let tool_type_checking_method: Option = match self.checking_method { CheckingMethod::AudioTags | CheckingMethod::AudioContent => Some(ToolType::SameMusic), CheckingMethod::Name | CheckingMethod::SizeName | CheckingMethod::Size | CheckingMethod::Hash => Some(ToolType::Duplicate), diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index fb4cbc9d..a8a299f2 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -2,31 +2,31 @@ use std::collections::{BTreeMap, HashSet}; use std::fs::File; use std::io::prelude::*; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::{mem, panic}; use anyhow::Context; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; -use humansize::{format_size, BINARY}; +use humansize::{BINARY, format_size}; use lofty::file::{AudioFile, TaggedFileExt}; use lofty::prelude::*; use lofty::read_from; use log::debug; use rayon::prelude::*; -use rusty_chromaprint::{match_fingerprints, Configuration, Fingerprinter}; +use rusty_chromaprint::{Configuration, Fingerprinter, match_fingerprints}; use serde::{Deserialize, Serialize}; use symphonia::core::audio::SampleBuffer; -use symphonia::core::codecs::{DecoderOptions, CODEC_TYPE_NULL}; +use symphonia::core::codecs::{CODEC_TYPE_NULL, DecoderOptions}; use symphonia::core::formats::FormatOptions; use symphonia::core::io::MediaSourceStream; use symphonia::core::meta::MetadataOptions; use symphonia::core::probe::Hint; use crate::common::{ - check_if_stop_received, create_crash_message, delete_files_custom, filter_reference_folders_generic, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, - WorkContinueStatus, AUDIO_FILES_EXTENSIONS, + AUDIO_FILES_EXTENSIONS, WorkContinueStatus, check_if_stop_received, create_crash_message, delete_files_custom, filter_reference_folders_generic, prepare_thread_handler_common, + send_info_and_wait_for_ending_all_threads, }; use crate::common_cache::{extract_loaded_cache, get_similar_music_cache_file, load_cache_from_file_generalized_by_path, save_cache_to_file_generalized}; use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType}; @@ -303,8 +303,8 @@ impl SameMusic { self.music_to_check = mem::take(&mut self.music_entries).into_iter().map(|e| (e.path.to_string_lossy().to_string(), e)).collect(); } - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheLoadingFingerprints, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheLoadingFingerprints, 0, self.get_test_type(), 0); let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache(false); @@ -313,11 +313,12 @@ impl SameMusic { return WorkContinueStatus::Stop; } - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, _size_counter) = prepare_thread_handler_common( progress_sender, CurrentStage::SameMusicCalculatingFingerprints, non_cached_files_to_check.len(), self.get_test_type(), + 0, ); let configuration = &self.hash_preset_config; @@ -325,7 +326,7 @@ impl SameMusic { let mut vec_file_entry = non_cached_files_to_check .into_par_iter() .map(|(path, mut music_entry)| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); return None; @@ -344,8 +345,8 @@ impl SameMusic { debug!("calculate_fingerprint - ended fingerprinting"); send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheSavingFingerprints, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheSavingFingerprints, 0, self.get_test_type(), 0); // Just connect loaded results with already calculated vec_file_entry.extend(records_already_cached.into_values()); @@ -368,8 +369,8 @@ impl SameMusic { return WorkContinueStatus::Continue; } - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheLoadingTags, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheLoadingTags, 0, self.get_test_type(), 0); let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache(true); @@ -378,15 +379,20 @@ impl SameMusic { return WorkContinueStatus::Stop; } - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicReadingTags, non_cached_files_to_check.len(), self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, _size_counter) = prepare_thread_handler_common( + progress_sender, + CurrentStage::SameMusicReadingTags, + non_cached_files_to_check.len(), + self.get_test_type(), + 0, + ); debug!("read_tags - starting reading tags"); // Clean for duplicate files let mut vec_file_entry = non_cached_files_to_check .into_par_iter() .map(|(path, mut music_entry)| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); return None; @@ -403,8 +409,8 @@ impl SameMusic { debug!("read_tags - ended reading tags"); send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); - let (progress_thread_handle, progress_thread_run, _atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheSavingTags, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, _items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicCacheSavingTags, 0, self.get_test_type(), 0); // Just connect loaded results with already calculated vec_file_entry.extend(records_already_cached.into_values()); @@ -427,8 +433,8 @@ impl SameMusic { if self.music_entries.is_empty() { return WorkContinueStatus::Continue; } - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicComparingTags, self.music_entries.len(), self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicComparingTags, self.music_entries.len(), self.get_test_type(), 0); let mut old_duplicates: Vec> = vec![self.music_entries.clone()]; let mut new_duplicates: Vec> = Vec::new(); @@ -439,7 +445,7 @@ impl SameMusic { return WorkContinueStatus::Stop; } - old_duplicates = self.check_music_item(old_duplicates, &atomic_counter, |fe| &fe.track_title, self.params.approximate_comparison); + old_duplicates = self.check_music_item(old_duplicates, &items_counter, |fe| &fe.track_title, self.params.approximate_comparison); } if (self.params.music_similarity & MusicSimilarity::TRACK_ARTIST) == MusicSimilarity::TRACK_ARTIST { if check_if_stop_received(stop_receiver) { @@ -447,7 +453,7 @@ impl SameMusic { return WorkContinueStatus::Stop; } - old_duplicates = self.check_music_item(old_duplicates, &atomic_counter, |fe| &fe.track_artist, self.params.approximate_comparison); + old_duplicates = self.check_music_item(old_duplicates, &items_counter, |fe| &fe.track_artist, self.params.approximate_comparison); } if (self.params.music_similarity & MusicSimilarity::YEAR) == MusicSimilarity::YEAR { if check_if_stop_received(stop_receiver) { @@ -455,7 +461,7 @@ impl SameMusic { return WorkContinueStatus::Stop; } - old_duplicates = self.check_music_item(old_duplicates, &atomic_counter, |fe| &fe.year, false); + old_duplicates = self.check_music_item(old_duplicates, &items_counter, |fe| &fe.year, false); } if (self.params.music_similarity & MusicSimilarity::LENGTH) == MusicSimilarity::LENGTH { if check_if_stop_received(stop_receiver) { @@ -463,7 +469,7 @@ impl SameMusic { return WorkContinueStatus::Stop; } - old_duplicates = self.check_music_item(old_duplicates, &atomic_counter, |fe| &fe.length, false); + old_duplicates = self.check_music_item(old_duplicates, &items_counter, |fe| &fe.length, false); } if (self.params.music_similarity & MusicSimilarity::GENRE) == MusicSimilarity::GENRE { if check_if_stop_received(stop_receiver) { @@ -471,7 +477,7 @@ impl SameMusic { return WorkContinueStatus::Stop; } - old_duplicates = self.check_music_item(old_duplicates, &atomic_counter, |fe| &fe.genre, false); + old_duplicates = self.check_music_item(old_duplicates, &items_counter, |fe| &fe.genre, false); } if (self.params.music_similarity & MusicSimilarity::BITRATE) == MusicSimilarity::BITRATE { if check_if_stop_received(stop_receiver) { @@ -495,7 +501,7 @@ impl SameMusic { } } } - atomic_counter.fetch_add(old_duplicates_len, Ordering::Relaxed); + items_counter.fetch_add(old_duplicates_len, Ordering::Relaxed); old_duplicates = new_duplicates; } @@ -580,7 +586,7 @@ impl SameMusic { fn compare_fingerprints( &mut self, stop_receiver: Option<&Receiver<()>>, - atomic_counter: &Arc, + items_counter: &Arc, base_files: Vec, files_to_compare: &[MusicEntry], ) -> Option>> { @@ -593,7 +599,7 @@ impl SameMusic { let mut duplicated_music_entries = Vec::new(); for f_entry in base_files { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { return None; } @@ -615,11 +621,7 @@ impl SameMusic { Err(e) => return Some(Err(format!("Error while comparing fingerprints: {e}"))), }; segments.retain(|s| s.duration(configuration) > minimum_segment_duration && s.score < maximum_difference); - if segments.is_empty() { - None - } else { - Some(Ok((e_string, e_entry))) - } + if segments.is_empty() { None } else { Some(Ok((e_string, e_entry))) } }) .flatten() .partition_map(|res| match res { @@ -653,13 +655,13 @@ impl SameMusic { let grouped_files_to_check = self.split_fingerprints_to_check(); let base_files_number = grouped_files_to_check.iter().map(|g| g.base_files.len()).sum::(); - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicComparingFingerprints, base_files_number, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SameMusicComparingFingerprints, base_files_number, self.get_test_type(), 0); let mut duplicated_music_entries = Vec::new(); for group in grouped_files_to_check { let GroupedFilesToCheck { base_files, files_to_compare } = group; - let Some(temp_music_entries) = self.compare_fingerprints(stop_receiver, &atomic_counter, base_files, &files_to_compare) else { + let Some(temp_music_entries) = self.compare_fingerprints(stop_receiver, &items_counter, base_files, &files_to_compare) else { send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); return WorkContinueStatus::Stop; }; @@ -696,7 +698,7 @@ impl SameMusic { fn check_music_item( &self, old_duplicates: Vec>, - atomic_counter: &Arc, + items_counter: &Arc, get_item: fn(&MusicEntry) -> &str, approximate_comparison: bool, ) -> Vec> { @@ -719,7 +721,7 @@ impl SameMusic { } } } - atomic_counter.fetch_add(old_duplicates_len, Ordering::Relaxed); + items_counter.fetch_add(old_duplicates_len, Ordering::Relaxed); new_duplicates } @@ -838,15 +840,7 @@ fn read_single_file_tags(path: &str, music_entry: &mut MusicEntry) -> bool { return false; }; - let Ok(possible_tagged_file) = panic::catch_unwind(move || { - match read_from(&mut file) { - Ok(t) => Some(t), - Err(_inspected) => { - // println!("Failed to open {}", path); - None - } - } - }) else { + let Ok(possible_tagged_file) = panic::catch_unwind(move || read_from(&mut file).ok()) else { let message = create_crash_message("Lofty", path, "https://github.com/image-rs/image/issues"); println!("{message}"); return false; @@ -865,10 +859,10 @@ fn read_single_file_tags(path: &str, music_entry: &mut MusicEntry) -> bool { let mut length = properties.duration().as_millis().to_string(); if let Some(tag) = tagged_file.primary_tag() { - track_title = tag.get_string(&ItemKey::TrackTitle).unwrap_or("").to_string(); - track_artist = tag.get_string(&ItemKey::TrackArtist).unwrap_or("").to_string(); - year = tag.get_string(&ItemKey::Year).unwrap_or("").to_string(); - genre = tag.get_string(&ItemKey::Genre).unwrap_or("").to_string(); + track_title = tag.get_string(&ItemKey::TrackTitle).unwrap_or_default().to_string(); + track_artist = tag.get_string(&ItemKey::TrackArtist).unwrap_or_default().to_string(); + year = tag.get_string(&ItemKey::Year).unwrap_or_default().to_string(); + genre = tag.get_string(&ItemKey::Genre).unwrap_or_default().to_string(); } for tag in tagged_file.tags() { diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index 673c196f..ab2e5c59 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -9,7 +9,7 @@ use bk_tree::BKTree; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; use hamming_bitwise_fast::hamming_bitwise_fast; -use humansize::{format_size, BINARY}; +use humansize::{BINARY, format_size}; use image::GenericImageView; use image_hasher::{FilterType, HashAlg, HasherConfig}; use log::debug; @@ -17,11 +17,11 @@ use rayon::prelude::*; use serde::{Deserialize, Serialize}; use crate::common::{ - check_if_stop_received, delete_files_custom, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, WorkContinueStatus, HEIC_EXTENSIONS, - IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, JXL_IMAGE_EXTENSIONS, RAW_IMAGE_EXTENSIONS, + HEIC_EXTENSIONS, IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, JXL_IMAGE_EXTENSIONS, RAW_IMAGE_EXTENSIONS, WorkContinueStatus, check_if_stop_received, delete_files_custom, + prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, }; use crate::common_cache::{extract_loaded_cache, get_similar_images_cache_file, load_cache_from_file_generalized_by_path, save_cache_to_file_generalized}; -use crate::common_dir_traversal::{inode, take_1_per_inode, DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType}; +use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType, inode, take_1_per_inode}; use crate::common_image::get_dynamic_image_from_path; use crate::common_tool::{CommonData, CommonToolData, DeleteMethod}; use crate::common_traits::{DebugPrint, PrintResults, ResultEntry}; @@ -203,7 +203,7 @@ impl SimilarImages { match result { DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => { self.images_to_check = grouped_file_entries - .into_iter() + .into_par_iter() .flat_map(if self.get_params().ignore_hard_links { |(_, fes)| fes } else { take_1_per_inode }) .map(|fe| { let fe_str = fe.path.to_string_lossy().to_string(); @@ -212,6 +212,7 @@ impl SimilarImages { (fe_str, image_entry) }) .collect(); + self.common_data.text_messages.warnings.extend(warnings); debug!("check_files - Found {} image files.", self.images_to_check.len()); WorkContinueStatus::Continue @@ -273,22 +274,24 @@ impl SimilarImages { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.hash_images_load_cache(); - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, size_counter) = prepare_thread_handler_common( progress_sender, CurrentStage::SimilarImagesCalculatingHashes, non_cached_files_to_check.len(), self.get_test_type(), + non_cached_files_to_check.values().map(|entry| entry.size).sum(), ); debug!("hash_images - start hashing images"); let (mut vec_file_entry, errors): (Vec, Vec) = non_cached_files_to_check .into_par_iter() .map(|(_s, mut file_entry)| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); return None; } + size_counter.fetch_add(file_entry.size, Ordering::Relaxed); if let Err(e) = self.collect_image_file_entry(&mut file_entry) { return Some(Err(e)); } @@ -452,8 +455,8 @@ impl SimilarImages { // Don't use hashes with multiple images in bktree, because they will always be master of group and cannot be find by other hashes let (base_hashes, hashes_with_multiple_images) = self.split_hashes(all_hashed_images); - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::SimilarImagesComparingHashes, base_hashes.len(), self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::SimilarImagesComparingHashes, base_hashes.len(), self.get_test_type(), 0); let mut hashes_parents: HashMap = Default::default(); // Hashes used as parent (hash, children_number_of_hash) let mut hashes_similarity: HashMap = Default::default(); // Hashes used as child, (parent_hash, similarity) @@ -465,7 +468,7 @@ impl SimilarImages { let partial_results = chunk .into_par_iter() .map(|hash_to_check| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index 5ac610ef..4c0160fb 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -6,17 +6,17 @@ use std::sync::atomic::Ordering; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; -use humansize::{format_size, BINARY}; +use humansize::{BINARY, format_size}; use log::debug; use rayon::prelude::*; use serde::{Deserialize, Serialize}; -use vid_dup_finder_lib::{ffmpeg_builder, VideoHash}; +use vid_dup_finder_lib::{VideoHash, ffmpeg_builder}; use crate::common::{ - check_if_stop_received, delete_files_custom, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, WorkContinueStatus, VIDEO_FILES_EXTENSIONS, + VIDEO_FILES_EXTENSIONS, WorkContinueStatus, check_if_stop_received, delete_files_custom, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, }; use crate::common_cache::{extract_loaded_cache, get_similar_videos_cache_file, load_cache_from_file_generalized_by_path, save_cache_to_file_generalized}; -use crate::common_dir_traversal::{inode, take_1_per_inode, DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType}; +use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ToolType, inode, take_1_per_inode}; use crate::common_tool::{CommonData, CommonToolData, DeleteMethod}; use crate::common_traits::{DebugPrint, PrintResults, ResultEntry}; use crate::flc; @@ -158,7 +158,7 @@ impl SimilarVideos { match result { DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => { self.videos_to_check = grouped_file_entries - .into_iter() + .into_par_iter() .flat_map(if self.get_params().ignore_hard_links { |(_, fes)| fes } else { take_1_per_inode }) .map(|fe| (fe.path.to_string_lossy().to_string(), fe.into_videos_entry())) .collect(); @@ -204,17 +204,18 @@ impl SimilarVideos { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache_at_start(); - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( + let (progress_thread_handle, progress_thread_run, items_counter, check_was_stopped, _size_counter) = prepare_thread_handler_common( progress_sender, CurrentStage::SimilarVideosCalculatingHashes, non_cached_files_to_check.len(), self.get_test_type(), + 0, ); let mut vec_file_entry: Vec = non_cached_files_to_check .par_iter() .map(|file_entry| { - atomic_counter.fetch_add(1, Ordering::Relaxed); + items_counter.fetch_add(1, Ordering::Relaxed); if check_if_stop_received(stop_receiver) { check_was_stopped.store(true, Ordering::Relaxed); return None; diff --git a/czkawka_core/src/temporary.rs b/czkawka_core/src/temporary.rs index 402b7bc9..7ddf765e 100644 --- a/czkawka_core/src/temporary.rs +++ b/czkawka_core/src/temporary.rs @@ -2,16 +2,16 @@ use std::fs; use std::fs::DirEntry; use std::io::prelude::*; use std::path::PathBuf; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; use crossbeam_channel::{Receiver, Sender}; use fun_time::fun_time; use rayon::prelude::*; use serde::Serialize; -use crate::common::{check_folder_children, check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, WorkContinueStatus}; -use crate::common_dir_traversal::{common_read_dir, get_modified_time, ToolType}; +use crate::common::{WorkContinueStatus, check_folder_children, check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads}; +use crate::common_dir_traversal::{ToolType, common_read_dir, get_modified_time}; use crate::common_tool::{CommonData, CommonToolData, DeleteMethod}; use crate::common_traits::*; use crate::progress_data::{CurrentStage, ProgressData}; @@ -82,8 +82,8 @@ impl Temporary { fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender>) -> WorkContinueStatus { let mut folders_to_check: Vec = self.common_data.directories.included_directories.clone(); - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, CurrentStage::CollectingFiles, 0, self.get_test_type()); + let (progress_thread_handle, progress_thread_run, items_counter, _check_was_stopped, _size_counter) = + prepare_thread_handler_common(progress_sender, CurrentStage::CollectingFiles, 0, self.get_test_type(), 0); while !folders_to_check.is_empty() { if check_if_stop_received(stop_receiver) { @@ -121,7 +121,7 @@ impl Temporary { &self.common_data.excluded_items, ); } else if file_type.is_file() { - if let Some(file_entry) = self.get_file_entry(&atomic_counter, &entry_data, &mut warnings) { + if let Some(file_entry) = self.get_file_entry(&items_counter, &entry_data, &mut warnings) { fe_result.push(file_entry); } } @@ -148,8 +148,8 @@ impl Temporary { WorkContinueStatus::Continue } - pub fn get_file_entry(&self, atomic_counter: &Arc, entry_data: &DirEntry, warnings: &mut Vec) -> Option { - atomic_counter.fetch_add(1, Ordering::Relaxed); + pub fn get_file_entry(&self, items_counter: &Arc, entry_data: &DirEntry, warnings: &mut Vec) -> Option { + items_counter.fetch_add(1, Ordering::Relaxed); let current_file_name = entry_data.path(); if self.common_data.excluded_items.is_excluded(¤t_file_name) { diff --git a/czkawka_gui/Cargo.toml b/czkawka_gui/Cargo.toml index e965c0df..640e715d 100644 --- a/czkawka_gui/Cargo.toml +++ b/czkawka_gui/Cargo.toml @@ -2,15 +2,15 @@ name = "czkawka_gui" version = "8.0.0" authors = ["Rafał Mikrut "] -edition = "2021" -rust-version = "1.82.0" +edition = "2024" +rust-version = "1.85.0" description = "GTK frontend of Czkawka" license = "MIT" homepage = "https://github.com/qarmin/czkawka" repository = "https://github.com/qarmin/czkawka" [dependencies] -gdk4 = "0.9" +gdk4 = { version = "0.9", default-features = false, features = ["v4_6"] } glib = "0.20" gtk4 = { version = "0.9", default-features = false, features = ["v4_6"] } @@ -54,6 +54,9 @@ rayon = "1.10" czkawka_core = { path = "../czkawka_core", version = "8.0.0", features = [] } +[dev-dependencies] +rand = "0.9.0" + [target.'cfg(windows)'.dependencies] winapi = { version = "0.3.9", features = ["combaseapi", "objbase", "shobjidl_core", "windef", "winerror", "wtypesbase", "winuser"] } diff --git a/czkawka_gui/README.md b/czkawka_gui/README.md index df07db51..4be2264b 100644 --- a/czkawka_gui/README.md +++ b/czkawka_gui/README.md @@ -71,7 +71,7 @@ lot build and runtime dependencies. | Program | Minimal version | |:-------:|:---------------:| -| Rust | 1.82.0 | +| Rust | 1.85.0 | | GTK | 4.6 | ### Linux (Ubuntu, but on other OS should work similar) diff --git a/czkawka_gui/i18n/en/czkawka_gui.ftl b/czkawka_gui/i18n/en/czkawka_gui.ftl index 3b16aa44..05396e48 100644 --- a/czkawka_gui/i18n/en/czkawka_gui.ftl +++ b/czkawka_gui/i18n/en/czkawka_gui.ftl @@ -485,7 +485,7 @@ progress_scanning_general_file = {$file_number -> progress_scanning_extension_of_files = Checking extension of {$file_checked}/{$all_files} file progress_scanning_broken_files = Checking {$file_checked}/{$all_files} file progress_scanning_video = Hashing of {$file_checked}/{$all_files} video -progress_scanning_image = Hashing of {$file_checked}/{$all_files} image +progress_scanning_image = Hashing of {$file_checked}/{$all_files} image ({$data_checked}/{$all_data}) progress_comparing_image_hashes = Comparing {$file_checked}/{$all_files} image hash progress_scanning_music_tags_end = Comparing tags of {$file_checked}/{$all_files} music file progress_scanning_music_tags = Reading tags of {$file_checked}/{$all_files} music file @@ -498,8 +498,8 @@ progress_scanning_empty_folders = {$folder_number -> progress_scanning_size = Scanning size of {$file_number} file progress_scanning_size_name = Scanning name and size of {$file_number} file progress_scanning_name = Scanning name of {$file_number} file -progress_analyzed_partial_hash = Analyzed partial hash of {$file_checked}/{$all_files} files -progress_analyzed_full_hash = Analyzed full hash of {$file_checked}/{$all_files} files +progress_analyzed_partial_hash = Analyzed partial hash of {$file_checked}/{$all_files} files ({$data_checked}/{$all_data}) +progress_analyzed_full_hash = Analyzed full hash of {$file_checked}/{$all_files} files ({$data_checked}/{$all_data}) progress_prehash_cache_loading = Loading prehash cache progress_prehash_cache_saving = Saving prehash cache progress_hash_cache_loading = Loading hash cache diff --git a/czkawka_gui/src/compute_results.rs b/czkawka_gui/src/compute_results.rs index 7c86b859..16708ed1 100644 --- a/czkawka_gui/src/compute_results.rs +++ b/czkawka_gui/src/compute_results.rs @@ -24,7 +24,7 @@ use czkawka_core::temporary::Temporary; use fun_time::fun_time; use gtk4::prelude::*; use gtk4::{Entry, ListStore, TextView, TreeView, Widget}; -use humansize::{format_size, BINARY}; +use humansize::{BINARY, format_size}; use rayon::prelude::*; use crate::flg; diff --git a/czkawka_gui/src/connect_things/connect_button_compare.rs b/czkawka_gui/src/connect_things/connect_button_compare.rs index 7985574d..5edb81cd 100644 --- a/czkawka_gui/src/connect_things/connect_button_compare.rs +++ b/czkawka_gui/src/connect_things/connect_button_compare.rs @@ -12,7 +12,7 @@ use crate::gui_structs::gui_data::GuiData; use crate::help_functions::{ count_number_of_groups, get_all_direct_children, get_full_name_from_path_name, get_max_file_name, get_pixbuf_from_dynamic_image, resize_pixbuf_dimension, }; -use crate::notebook_info::{NotebookObject, NOTEBOOKS_INFO}; +use crate::notebook_info::{NOTEBOOKS_INFO, NotebookObject}; const BIG_PREVIEW_SIZE: i32 = 600; const SMALL_PREVIEW_SIZE: i32 = 130; @@ -245,7 +245,7 @@ pub fn connect_button_compare(gui_data: &GuiData) { let this_tree_path = shared_using_for_preview.borrow().0.clone().expect("Missing left preview path"); if main_tree_path == this_tree_path { return; // Selected header, so we don't need to select result in treeview - // TODO this should be handled by disabling entirely check box + // TODO this should be handled by disabling entirely check box } let is_active = check_button_left_preview_text.is_active(); @@ -276,7 +276,7 @@ pub fn connect_button_compare(gui_data: &GuiData) { let this_tree_path = shared_using_for_preview.borrow().1.clone().expect("Missing right preview path"); if main_tree_path == this_tree_path { return; // Selected header, so we don't need to select result in treeview - // TODO this should be handled by disabling entirely check box + // TODO this should be handled by disabling entirely check box } let is_active = check_button_right_preview_text.is_active(); diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index 75eb9440..843743ce 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::thread; use crossbeam_channel::{Receiver, Sender}; @@ -20,8 +20,8 @@ use czkawka_core::similar_images::{SimilarImages, SimilarImagesParameters}; use czkawka_core::similar_videos::{SimilarVideos, SimilarVideosParameters}; use czkawka_core::temporary::Temporary; use fun_time::fun_time; -use gtk4::prelude::*; use gtk4::Grid; +use gtk4::prelude::*; use crate::gui_structs::gui_data::GuiData; use crate::help_combo_box::{ @@ -31,7 +31,7 @@ use crate::help_combo_box::{ use crate::help_functions::*; use crate::notebook_enums::*; use crate::taskbar_progress::tbp_flags::TBPF_NOPROGRESS; -use crate::{flg, DEFAULT_MAXIMAL_FILE_SIZE, DEFAULT_MINIMAL_CACHE_SIZE, DEFAULT_MINIMAL_FILE_SIZE}; +use crate::{DEFAULT_MAXIMAL_FILE_SIZE, DEFAULT_MINIMAL_CACHE_SIZE, DEFAULT_MINIMAL_FILE_SIZE, flg}; #[allow(clippy::too_many_arguments)] pub fn connect_button_search(gui_data: &GuiData, result_sender: Sender, progress_sender: Sender) { diff --git a/czkawka_gui/src/connect_things/connect_button_sort.rs b/czkawka_gui/src/connect_things/connect_button_sort.rs index ae7ebfd8..1338b2ef 100644 --- a/czkawka_gui/src/connect_things/connect_button_sort.rs +++ b/czkawka_gui/src/connect_things/connect_button_sort.rs @@ -3,7 +3,7 @@ use gtk4::prelude::*; use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_popovers_sort::GuiSortPopovers; use crate::help_functions::PopoverTypes; -use crate::notebook_enums::{to_notebook_main_enum, NotebookMainEnum}; +use crate::notebook_enums::{NotebookMainEnum, to_notebook_main_enum}; use crate::notebook_info::NOTEBOOKS_INFO; pub fn connect_button_sort(gui_data: &GuiData) { diff --git a/czkawka_gui/src/connect_things/connect_change_language.rs b/czkawka_gui/src/connect_things/connect_change_language.rs index a297c96a..d4fbe229 100644 --- a/czkawka_gui/src/connect_things/connect_change_language.rs +++ b/czkawka_gui/src/connect_things/connect_change_language.rs @@ -1,9 +1,9 @@ use gtk4::prelude::*; -use i18n_embed::unic_langid::LanguageIdentifier; use i18n_embed::DesktopLanguageRequester; +use i18n_embed::unic_langid::LanguageIdentifier; use crate::language_functions::get_language_from_combo_box_text; -use crate::{localizer_gui, GuiData, LANGUAGES_ALL}; +use crate::{GuiData, LANGUAGES_ALL, localizer_gui}; // use i18n_embed::{DesktopLanguageRequester, Localizer}; diff --git a/czkawka_gui/src/connect_things/connect_popovers_sort.rs b/czkawka_gui/src/connect_things/connect_popovers_sort.rs index d8ff5995..aa5f61f0 100644 --- a/czkawka_gui/src/connect_things/connect_popovers_sort.rs +++ b/czkawka_gui/src/connect_things/connect_popovers_sort.rs @@ -230,4 +230,59 @@ mod test { list_store.iter_next(&curr_iter); } } + + // TODO - This test uncovers a bug in the code, so it is disabled for now, with sort button + // #[gtk4::test] + // pub fn _fuzzer_test() { + // for _ in 0..10000 { + // let columns_types: &[Type] = &[Type::BOOL, Type::STRING]; + // let list_store = gtk4::ListStore::new(columns_types); + // let tree_view = TreeView::builder().model(&list_store).build(); + // let popover = Popover::new(); + // + // let first_row: &[(u32, &dyn ToValue)] = &[(0, &true), (1, &"AAA")]; + // list_store.set(&list_store.append(), first_row); + // + // let mut since_last_header = 0; + // + // (0..(random::() % 10 + 5)).for_each(|_| { + // let bool_val = if since_last_header < 2 { + // since_last_header += 1; + // false + // } else { + // since_last_header = 0; + // random() + // }; + // let string_val = rand::random::().to_string(); + // let a: Vec<(u32, &dyn ToValue)> = vec![(0, &bool_val), (1, &string_val)]; + // + // list_store.set(&list_store.append(), &a); + // }); + // + // if since_last_header < 2 { + // // This is invalid, and should be vec![(0, &false), (1, &"AAA")] + // // but this triggers the bug + // let a: Vec<(u32, &dyn ToValue)> = vec![(0, &true), (1, &"AAA")]; + // list_store.set(&list_store.append(), &a); + // let b: Vec<(u32, &dyn ToValue)> = vec![(0, &false), (1, &"BBB")]; + // list_store.set(&list_store.append(), &b); + // } + // + // print_two_items_model(&list_store); + // + // popover_sort_general::(&popover, &tree_view, 1, 0); + // } + // } + // + // fn print_two_items_model(model: >k4::ListStore) { + // let iter = model.iter_first().expect("Failed to get first iter"); + // loop { + // let bool_val = model.get::(&iter, 0); + // let string_val = model.get::(&iter, 1); + // println!("{bool_val} {string_val}"); + // if !model.iter_next(&iter) { + // break; + // } + // } + // } } diff --git a/czkawka_gui/src/connect_things/connect_progress_window.rs b/czkawka_gui/src/connect_things/connect_progress_window.rs index 63a0d99e..f4fa645d 100644 --- a/czkawka_gui/src/connect_things/connect_progress_window.rs +++ b/czkawka_gui/src/connect_things/connect_progress_window.rs @@ -7,14 +7,15 @@ use crossbeam_channel::Receiver; use czkawka_core::common_dir_traversal::ToolType; use czkawka_core::progress_data::{CurrentStage, ProgressData}; use glib::MainContext; -use gtk4::prelude::*; use gtk4::ProgressBar; +use gtk4::prelude::*; +use humansize::{BINARY, format_size}; use crate::flg; use crate::gui_structs::gui_data::GuiData; use crate::localizer_core::generate_translation_hashmap; -use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE; use crate::taskbar_progress::TaskbarProgress; +use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE; #[allow(clippy::too_many_arguments)] pub fn connect_progress_window(gui_data: &GuiData, progress_receiver: Receiver) { @@ -156,14 +157,21 @@ fn progress_default(gui_data: &GuiData, item: &ProgressData) { } fn common_set_data(item: &ProgressData, progress_bar_all_stages: &ProgressBar, progress_bar_current_stage: &ProgressBar, taskbar_state: &Rc>) { + let (current_items_checked, current_stage_items_to_check) = if item.bytes_to_check > 0 { + (item.bytes_checked, item.bytes_to_check) + } else { + (item.entries_checked as u64, item.entries_to_check as u64) + }; + if item.entries_to_check != 0 { - let all_stages = (item.current_stage_idx as f64 + item.entries_checked as f64 / item.entries_to_check as f64) / (item.max_stage_idx + 1) as f64; + let all_stages = (item.current_stage_idx as f64 + current_items_checked as f64 / current_stage_items_to_check as f64) / (item.max_stage_idx + 1) as f64; let all_stages = all_stages.min(0.99); progress_bar_all_stages.set_fraction(all_stages); - progress_bar_current_stage.set_fraction(item.entries_checked as f64 / item.entries_to_check as f64); + progress_bar_current_stage.set_fraction(current_items_checked as f64 / current_stage_items_to_check as f64); + taskbar_state.borrow().set_progress_value( - ((item.current_stage_idx as usize) * item.entries_to_check + item.entries_checked) as u64, - item.entries_to_check as u64 * (item.max_stage_idx + 1) as u64, + (item.current_stage_idx as u64) * current_stage_items_to_check + current_items_checked, + current_stage_items_to_check * (item.max_stage_idx + 1) as u64, ); } else { let all_stages = (item.current_stage_idx as f64) / (item.max_stage_idx + 1) as f64; @@ -179,5 +187,10 @@ fn file_number_tm(item: &ProgressData) -> HashMap<&'static str, String> { } fn progress_ratio_tm(item: &ProgressData) -> HashMap<&'static str, String> { - generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())]) + let mut v = vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())]; + if item.bytes_to_check != 0 { + v.push(("data_checked", format_size(item.bytes_checked, BINARY))); + v.push(("all_data", format_size(item.bytes_to_check, BINARY))); + } + generate_translation_hashmap(v) } diff --git a/czkawka_gui/src/connect_things/connect_selection_of_directories.rs b/czkawka_gui/src/connect_things/connect_selection_of_directories.rs index 53606738..763dd515 100644 --- a/czkawka_gui/src/connect_things/connect_selection_of_directories.rs +++ b/czkawka_gui/src/connect_things/connect_selection_of_directories.rs @@ -9,8 +9,8 @@ use gtk4::{DropTarget, FileChooserNative, Notebook, Orientation, ResponseType, T use crate::flg; use crate::gui_structs::gui_data::GuiData; -use crate::help_functions::{check_if_value_is_in_list_store, get_list_store, ColumnsExcludedDirectory, ColumnsIncludedDirectory}; -use crate::notebook_enums::{to_notebook_upper_enum, NotebookUpperEnum}; +use crate::help_functions::{ColumnsExcludedDirectory, ColumnsIncludedDirectory, check_if_value_is_in_list_store, get_list_store}; +use crate::notebook_enums::{NotebookUpperEnum, to_notebook_upper_enum}; pub fn connect_selection_of_directories(gui_data: &GuiData) { // Add manually directory diff --git a/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs b/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs index 64258ea3..2d459ff8 100644 --- a/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs +++ b/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs @@ -1,4 +1,4 @@ -use czkawka_core::similar_images::{get_string_from_similarity, SIMILAR_VALUES}; +use czkawka_core::similar_images::{SIMILAR_VALUES, get_string_from_similarity}; use gtk4::prelude::*; use crate::gui_structs::gui_data::GuiData; diff --git a/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs b/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs index 1e6c0386..bd4a6fd1 100644 --- a/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs +++ b/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs @@ -2,10 +2,10 @@ use gtk4::prelude::*; use gtk4::{GestureClick, Widget}; use crate::gui_structs::gui_data::CZK_ICON_SORT; -use crate::help_functions::{get_custom_label_from_widget, set_icon_of_button, BottomButtonsEnum}; +use crate::help_functions::{BottomButtonsEnum, get_custom_label_from_widget, set_icon_of_button}; use crate::{ - flg, CZK_ICON_COMPARE, CZK_ICON_HARDLINK, CZK_ICON_HIDE_DOWN, CZK_ICON_HIDE_UP, CZK_ICON_MOVE, CZK_ICON_SAVE, CZK_ICON_SEARCH, CZK_ICON_SELECT, CZK_ICON_SYMLINK, - CZK_ICON_TRASH, + CZK_ICON_COMPARE, CZK_ICON_HARDLINK, CZK_ICON_HIDE_DOWN, CZK_ICON_HIDE_UP, CZK_ICON_MOVE, CZK_ICON_SAVE, CZK_ICON_SEARCH, CZK_ICON_SELECT, CZK_ICON_SYMLINK, CZK_ICON_TRASH, + flg, }; #[derive(Clone)] diff --git a/czkawka_gui/src/gui_structs/gui_compare_images.rs b/czkawka_gui/src/gui_structs/gui_compare_images.rs index b46aa26b..23312fbc 100644 --- a/czkawka_gui/src/gui_structs/gui_compare_images.rs +++ b/czkawka_gui/src/gui_structs/gui_compare_images.rs @@ -5,7 +5,7 @@ use gtk4::prelude::*; use gtk4::{Builder, TreePath}; use crate::help_functions::set_icon_of_button; -use crate::{flg, CZK_ICON_LEFT, CZK_ICON_RIGHT}; +use crate::{CZK_ICON_LEFT, CZK_ICON_RIGHT, flg}; #[derive(Clone)] pub struct GuiCompareImages { diff --git a/czkawka_gui/src/gui_structs/gui_header.rs b/czkawka_gui/src/gui_structs/gui_header.rs index d720ad4b..22c641fc 100644 --- a/czkawka_gui/src/gui_structs/gui_header.rs +++ b/czkawka_gui/src/gui_structs/gui_header.rs @@ -1,7 +1,7 @@ use gtk4::prelude::*; use crate::help_functions::set_icon_of_button; -use crate::{flg, CZK_ICON_INFO, CZK_ICON_SETTINGS}; +use crate::{CZK_ICON_INFO, CZK_ICON_SETTINGS, flg}; #[derive(Clone)] pub struct GuiHeader { diff --git a/czkawka_gui/src/gui_structs/gui_main_notebook.rs b/czkawka_gui/src/gui_structs/gui_main_notebook.rs index 2b89637b..2971933d 100644 --- a/czkawka_gui/src/gui_structs/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_structs/gui_main_notebook.rs @@ -1,14 +1,14 @@ use czkawka_core::big_file::SearchMode; use czkawka_core::common_dir_traversal::CheckingMethod; use czkawka_core::localizer_core::{fnc_get_similarity_minimal, fnc_get_similarity_very_high}; -use czkawka_core::similar_images::{get_string_from_similarity, SIMILAR_VALUES}; +use czkawka_core::similar_images::{SIMILAR_VALUES, get_string_from_similarity}; use gtk4::prelude::*; use gtk4::{Builder, CheckButton, ComboBoxText, Entry, EventControllerKey, GestureClick, Image, Label, Notebook, Scale, ScrolledWindow, TreeView, Widget}; use crate::flg; use crate::help_combo_box::{AUDIO_TYPE_CHECK_METHOD_COMBO_BOX, BIG_FILES_CHECK_METHOD_COMBO_BOX, DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX}; use crate::help_functions::get_all_direct_children; -use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS}; +use crate::notebook_enums::{NUMBER_OF_NOTEBOOK_MAIN_TABS, NotebookMainEnum}; #[derive(Clone)] pub struct GuiMainNotebook { diff --git a/czkawka_gui/src/gui_structs/gui_popovers_select.rs b/czkawka_gui/src/gui_structs/gui_popovers_select.rs index b3add9f0..abfb5ba5 100644 --- a/czkawka_gui/src/gui_structs/gui_popovers_select.rs +++ b/czkawka_gui/src/gui_structs/gui_popovers_select.rs @@ -1,5 +1,5 @@ -use gtk4::prelude::*; use gtk4::Builder; +use gtk4::prelude::*; use crate::flg; diff --git a/czkawka_gui/src/gui_structs/gui_popovers_sort.rs b/czkawka_gui/src/gui_structs/gui_popovers_sort.rs index 72fe1876..78912451 100644 --- a/czkawka_gui/src/gui_structs/gui_popovers_sort.rs +++ b/czkawka_gui/src/gui_structs/gui_popovers_sort.rs @@ -1,5 +1,5 @@ -use gtk4::prelude::*; use gtk4::Builder; +use gtk4::prelude::*; use crate::flg; diff --git a/czkawka_gui/src/gui_structs/gui_progress_dialog.rs b/czkawka_gui/src/gui_structs/gui_progress_dialog.rs index e73d9a63..0f82d3c6 100644 --- a/czkawka_gui/src/gui_structs/gui_progress_dialog.rs +++ b/czkawka_gui/src/gui_structs/gui_progress_dialog.rs @@ -2,7 +2,7 @@ use gtk4::prelude::*; use gtk4::{Builder, EventControllerKey, Window}; use crate::help_functions::{get_custom_label_from_widget, set_icon_of_button}; -use crate::{flg, CZK_ICON_STOP}; +use crate::{CZK_ICON_STOP, flg}; #[derive(Clone)] pub struct GuiProgressDialog { diff --git a/czkawka_gui/src/gui_structs/gui_upper_notebook.rs b/czkawka_gui/src/gui_structs/gui_upper_notebook.rs index e22845ee..cdb4b9fe 100644 --- a/czkawka_gui/src/gui_structs/gui_upper_notebook.rs +++ b/czkawka_gui/src/gui_structs/gui_upper_notebook.rs @@ -3,7 +3,7 @@ use gtk4::{EventControllerKey, GestureClick, TreeView}; use crate::help_functions::{get_all_direct_children, get_custom_label_from_widget, set_icon_of_button}; use crate::notebook_enums::NotebookUpperEnum; -use crate::{flg, CZK_ICON_ADD, CZK_ICON_DELETE, CZK_ICON_MANUAL_ADD}; +use crate::{CZK_ICON_ADD, CZK_ICON_DELETE, CZK_ICON_MANUAL_ADD, flg}; #[derive(Clone)] pub struct GuiUpperNotebook { diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 4a418d40..1e8f0368 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -2,7 +2,7 @@ use std::cell::RefCell; use std::cmp::Ordering; use std::collections::HashMap; use std::io::BufReader; -use std::path::{PathBuf, MAIN_SEPARATOR}; +use std::path::{MAIN_SEPARATOR, PathBuf}; use std::rc::Rc; use czkawka_core::bad_extensions::BadExtensions; @@ -28,7 +28,7 @@ use once_cell::sync::OnceCell; use crate::flg; use crate::notebook_enums::{NotebookMainEnum, NotebookUpperEnum}; -use crate::notebook_info::{NotebookObject, NOTEBOOKS_INFO}; +use crate::notebook_info::{NOTEBOOKS_INFO, NotebookObject}; pub const KEY_DELETE: u32 = 119; pub const KEY_ENTER: u32 = 36; @@ -319,6 +319,14 @@ pub fn add_text_to_text_view(text_view: &TextView, string_to_append: &str) { pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[Widget], button_names: &[BottomButtonsEnum]) { for (index, button) in buttons_array.iter().enumerate() { + if button_names[index] == BottomButtonsEnum::Sort { + // TODO - sort button is broken, I don't have skills and time to fix it + // The problem is that to speedup sorting, we operate on item iters + // To fix this, we should just take entire model and sort it, which will be slow in some cases + // Alternatively, just current operations on iters should be fixed(I cannot find exact problem) + continue; + } + if *hashmap.get_mut(&button_names[index]).expect("Invalid button name") { button.show(); } else { @@ -805,8 +813,8 @@ pub fn scale_step_function(scale: &Scale, _scroll_type: ScrollType, value: f64) #[cfg(test)] mod test { - use glib::types::Type; use glib::Value; + use glib::types::Type; use gtk4::prelude::*; use gtk4::{Orientation, TreeView}; use image::DynamicImage; diff --git a/czkawka_gui/src/localizer_gui.rs b/czkawka_gui/src/localizer_gui.rs index 8ad9a978..e0577178 100644 --- a/czkawka_gui/src/localizer_gui.rs +++ b/czkawka_gui/src/localizer_gui.rs @@ -1,4 +1,4 @@ -use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader}; +use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader}; use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer}; use once_cell::sync::Lazy; use rust_embed::RustEmbed; diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index 65e01ba4..ade94958 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -27,13 +27,13 @@ use connect_things::connect_selection_of_directories::*; use connect_things::connect_settings::*; use connect_things::connect_show_hide_ui::*; use connect_things::connect_similar_image_size_change::*; -use crossbeam_channel::{unbounded, Receiver, Sender}; +use crossbeam_channel::{Receiver, Sender, unbounded}; use czkawka_core::common::{get_number_of_threads, print_version_mode, set_number_of_threads, setup_logger}; use czkawka_core::progress_data::ProgressData; use czkawka_core::*; +use gtk4::Application; use gtk4::gio::ApplicationFlags; use gtk4::prelude::*; -use gtk4::Application; use gui_structs::gui_data::*; use log::info; diff --git a/czkawka_gui/src/notebook_info.rs b/czkawka_gui/src/notebook_info.rs index 5f8833e6..0c036fd2 100644 --- a/czkawka_gui/src/notebook_info.rs +++ b/czkawka_gui/src/notebook_info.rs @@ -4,7 +4,7 @@ use crate::help_functions::{ BottomButtonsEnum, ColumnsBadExtensions, ColumnsBigFiles, ColumnsBrokenFiles, ColumnsDuplicates, ColumnsEmptyFiles, ColumnsEmptyFolders, ColumnsInvalidSymlinks, ColumnsSameMusic, ColumnsSimilarImages, ColumnsSimilarVideos, ColumnsTemporaryFiles, PopoverTypes, }; -use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS}; +use crate::notebook_enums::{NUMBER_OF_NOTEBOOK_MAIN_TABS, NotebookMainEnum}; #[derive(Debug)] pub struct NotebookObject { diff --git a/czkawka_gui/src/opening_selecting_records.rs b/czkawka_gui/src/opening_selecting_records.rs index 6df3b4f0..c68e474c 100644 --- a/czkawka_gui/src/opening_selecting_records.rs +++ b/czkawka_gui/src/opening_selecting_records.rs @@ -1,6 +1,6 @@ use gdk4::{Key, ModifierType}; -use gtk4::prelude::*; use gtk4::GestureClick; +use gtk4::prelude::*; use crate::help_functions::*; use crate::notebook_enums::NotebookUpperEnum; diff --git a/czkawka_gui/src/saving_loading.rs b/czkawka_gui/src/saving_loading.rs index 8fa27c35..7f4ee609 100644 --- a/czkawka_gui/src/saving_loading.rs +++ b/czkawka_gui/src/saving_loading.rs @@ -19,7 +19,7 @@ use crate::gui_structs::gui_settings::GuiSettings; use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook; use crate::help_combo_box::DUPLICATES_CHECK_METHOD_COMBO_BOX; use crate::help_functions::*; -use crate::language_functions::{get_language_from_combo_box_text, LANGUAGES_ALL}; +use crate::language_functions::{LANGUAGES_ALL, get_language_from_combo_box_text}; const SAVE_FILE_NAME: &str = "czkawka_gui_config_4.txt"; @@ -559,27 +559,27 @@ pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb // Comboboxes main notebook saving_struct.save_var( hashmap_ls[&LoadText::ComboBoxDuplicateHashType].clone(), - &main_notebook.combo_box_duplicate_hash_type.active().unwrap_or(0), + &main_notebook.combo_box_duplicate_hash_type.active().unwrap_or_default(), ); saving_struct.save_var( hashmap_ls[&LoadText::ComboBoxDuplicateCheckMethod].clone(), - &main_notebook.combo_box_duplicate_check_method.active().unwrap_or(0), + &main_notebook.combo_box_duplicate_check_method.active().unwrap_or_default(), ); saving_struct.save_var( hashmap_ls[&LoadText::ComboBoxImageResizeAlgorithm].clone(), - &main_notebook.combo_box_image_resize_algorithm.active().unwrap_or(0), + &main_notebook.combo_box_image_resize_algorithm.active().unwrap_or_default(), ); saving_struct.save_var( hashmap_ls[&LoadText::ComboBoxImageHashType].clone(), - &main_notebook.combo_box_image_hash_algorithm.active().unwrap_or(0), + &main_notebook.combo_box_image_hash_algorithm.active().unwrap_or_default(), ); saving_struct.save_var( hashmap_ls[&LoadText::ComboBoxImageHashSize].clone(), - &main_notebook.combo_box_image_hash_size.active().unwrap_or(0), + &main_notebook.combo_box_image_hash_size.active().unwrap_or_default(), ); saving_struct.save_var( hashmap_ls[&LoadText::ComboBoxBigFiles].clone(), - &main_notebook.combo_box_big_files_mode.active().unwrap_or(0), + &main_notebook.combo_box_big_files_mode.active().unwrap_or_default(), ); // Other2 diff --git a/czkawka_gui/src/taskbar_progress.rs b/czkawka_gui/src/taskbar_progress.rs index 3bf52c7e..80c44e19 100644 --- a/czkawka_gui/src/taskbar_progress.rs +++ b/czkawka_gui/src/taskbar_progress.rs @@ -1,4 +1,4 @@ #[cfg(not(target_os = "windows"))] -pub use crate::taskbar_progress_dummy::{tbp_flags, TaskbarProgress}; +pub use crate::taskbar_progress_dummy::{TaskbarProgress, tbp_flags}; #[cfg(target_os = "windows")] -pub use crate::taskbar_progress_win::{tbp_flags, TaskbarProgress}; +pub use crate::taskbar_progress_win::{TaskbarProgress, tbp_flags}; diff --git a/czkawka_gui/src/taskbar_progress_win.rs b/czkawka_gui/src/taskbar_progress_win.rs index 994e75b8..892568df 100644 --- a/czkawka_gui/src/taskbar_progress_win.rs +++ b/czkawka_gui/src/taskbar_progress_win.rs @@ -5,13 +5,13 @@ use std::cell::RefCell; use std::convert::From; use std::ptr; +use winapi::Interface; use winapi::ctypes::c_void; use winapi::shared::windef::HWND; use winapi::shared::winerror::{E_POINTER, S_OK}; use winapi::shared::wtypesbase::CLSCTX_INPROC_SERVER; use winapi::um::shobjidl_core::{CLSID_TaskbarList, ITaskbarList3, TBPFLAG}; use winapi::um::{combaseapi, objbase, winuser}; -use winapi::Interface; pub mod tbp_flags { pub use winapi::um::shobjidl_core::{TBPF_ERROR, TBPF_INDETERMINATE, TBPF_NOPROGRESS, TBPF_NORMAL, TBPF_PAUSED}; diff --git a/czkawka_gui/src/tests.rs b/czkawka_gui/src/tests.rs index e43b96cc..7cb5b019 100644 --- a/czkawka_gui/src/tests.rs +++ b/czkawka_gui/src/tests.rs @@ -1,7 +1,7 @@ +use crate::GuiData; use crate::help_functions::get_notebook_enum_from_tree_view; use crate::notebook_enums::to_notebook_main_enum; use crate::notebook_info::NOTEBOOKS_INFO; -use crate::GuiData; pub fn validate_notebook_data(gui_data: &GuiData) { // Test treeviews names, each treeview should have set name same as variable name diff --git a/czkawka_gui/ui/about_dialog.ui b/czkawka_gui/ui/about_dialog.ui index 2bab60ff..9b87ffad 100644 --- a/czkawka_gui/ui/about_dialog.ui +++ b/czkawka_gui/ui/about_dialog.ui @@ -1,12 +1,14 @@ - + 2020 - 2025 Rafał Mikrut (qarmin) and contributors -This program is free to use and will always be. +This program is free to use and will always be. +App is now in maintenance mode, so check Krokiet, the sucessor of Czkawka. + mit-x11 help-about-symbolic Czkawka diff --git a/czkawka_gui/ui/compare_images.ui b/czkawka_gui/ui/compare_images.ui index f0edba02..8a13755f 100644 --- a/czkawka_gui/ui/compare_images.ui +++ b/czkawka_gui/ui/compare_images.ui @@ -1,5 +1,5 @@ - + diff --git a/czkawka_gui/ui/czkawka.cmb b/czkawka_gui/ui/czkawka.cmb index ddd152c2..fb4b7a90 100755 --- a/czkawka_gui/ui/czkawka.cmb +++ b/czkawka_gui/ui/czkawka.cmb @@ -1,6 +1,6 @@ - + (3,None,"about_dialog.ui","about_dialog.ui",None,None,None,None,None,None,None), (4,None,"compare_images.ui","compare_images.ui",None,None,None,None,None,None,None), @@ -344,7 +344,7 @@ (10,7,"GtkButton","buttons_popover_sort_selection",2,None,None,None,4,None,None) - (3,1,"GtkAboutDialog","comments","2020 - 2025\nRafał Mikrut (qarmin) and contributors\nThis program is free to use and will always be.",1,None,None,None,None,None,None,None,None), + (3,1,"GtkAboutDialog","comments","2020 - 2025\nRafał Mikrut (qarmin) and contributors\nThis program is free to use and will always be.\nApp is now in maintenance mode, so check Krokiet, the sucessor of Czkawka",1,None,None,None,None,None,None,None,None), (3,1,"GtkAboutDialog","license-type","mit-x11",None,None,None,None,None,None,None,None,None), (3,1,"GtkAboutDialog","logo-icon-name","help-about-symbolic",None,None,None,None,None,None,None,None,None), (3,1,"GtkAboutDialog","program-name","Czkawka",None,None,None,None,None,None,None,None,None), diff --git a/czkawka_gui/ui/main_window.ui b/czkawka_gui/ui/main_window.ui index d2a22301..7be76715 100644 --- a/czkawka_gui/ui/main_window.ui +++ b/czkawka_gui/ui/main_window.ui @@ -1,5 +1,5 @@ - + diff --git a/czkawka_gui/ui/popover_right_click.ui b/czkawka_gui/ui/popover_right_click.ui index 2edc5345..207c37f6 100644 --- a/czkawka_gui/ui/popover_right_click.ui +++ b/czkawka_gui/ui/popover_right_click.ui @@ -1,5 +1,5 @@ - + diff --git a/czkawka_gui/ui/popover_select.ui b/czkawka_gui/ui/popover_select.ui index ff5f6f95..10f6f82e 100644 --- a/czkawka_gui/ui/popover_select.ui +++ b/czkawka_gui/ui/popover_select.ui @@ -1,5 +1,5 @@ - + diff --git a/czkawka_gui/ui/popover_sort.ui b/czkawka_gui/ui/popover_sort.ui index 0958c4ba..99769e97 100644 --- a/czkawka_gui/ui/popover_sort.ui +++ b/czkawka_gui/ui/popover_sort.ui @@ -1,5 +1,5 @@ - + diff --git a/czkawka_gui/ui/progress.ui b/czkawka_gui/ui/progress.ui index af3a49a2..fa5cc98d 100644 --- a/czkawka_gui/ui/progress.ui +++ b/czkawka_gui/ui/progress.ui @@ -1,5 +1,5 @@ - + diff --git a/czkawka_gui/ui/settings.ui b/czkawka_gui/ui/settings.ui index 44d3d58f..0ae1e152 100644 --- a/czkawka_gui/ui/settings.ui +++ b/czkawka_gui/ui/settings.ui @@ -1,5 +1,5 @@ - + diff --git a/instructions/Compilation.md b/instructions/Compilation.md index 2246f6e5..37eb4bdd 100644 --- a/instructions/Compilation.md +++ b/instructions/Compilation.md @@ -20,7 +20,7 @@ New versions of GTK fixes some bugs, so e.g. middle button selection will work o | Program | Min | What for | |---------|--------|--------------------------------------------------------------------------------------| -| Rust | 1.82.0 | The minimum version of rust does not depend on anything, so it can change frequently | +| Rust | 1.85.0 | The minimum version of rust does not depend on anything, so it can change frequently | | GTK | 4.6 | Only for the `GTK` backend | #### Debian / Ubuntu diff --git a/justfile b/justfile index 6e7ae7b6..70f5e1eb 100644 --- a/justfile +++ b/justfile @@ -43,6 +43,8 @@ check: check_all: cargo check +checkc: + CARGO_PROFILE_DEV_CODEGEN_BACKEND=cranelift cargo +nightly check -Zcodegen-backend build_krokiet: cargo build --bin krokiet diff --git a/krokiet/Cargo.toml b/krokiet/Cargo.toml index 16db1886..91cf0e6a 100644 --- a/krokiet/Cargo.toml +++ b/krokiet/Cargo.toml @@ -3,7 +3,7 @@ name = "krokiet" version = "8.0.0" authors = ["Rafał Mikrut "] edition = "2021" -rust-version = "1.82.0" +rust-version = "1.85.0" description = "Slint frontend of Czkawka Core" license = "GPL-3.0-only" homepage = "https://github.com/qarmin/czkawka" @@ -11,12 +11,10 @@ repository = "https://github.com/qarmin/czkawka" build = "build.rs" [dependencies] -rand = "0.8" czkawka_core = { version = "8.0.0", path = "../czkawka_core" } chrono = "0.4.38" open = "5.3" crossbeam-channel = "0.5" -handsome_logger = "0.8" rfd = { version = "0.15", default-features = false, features = ["xdg-portal", "async-std"] } home = "0.5" log = "0.4.22" diff --git a/krokiet/src/connect_progress_receiver.rs b/krokiet/src/connect_progress_receiver.rs index a3f9cdf2..2d61e088 100644 --- a/krokiet/src/connect_progress_receiver.rs +++ b/krokiet/src/connect_progress_receiver.rs @@ -3,6 +3,7 @@ use std::thread; use crossbeam_channel::Receiver; use czkawka_core::common_dir_traversal::ToolType; use czkawka_core::progress_data::{CurrentStage, ProgressData}; +use humansize::{format_size, BINARY}; use slint::ComponentHandle; use crate::{MainWindow, ProgressToSend}; @@ -42,10 +43,11 @@ fn progress_save_load_cache(item: &ProgressData) -> ProgressToSend { CurrentStage::DuplicateCacheSaving => "Saving hash cache", _ => unreachable!(), }; - let (all_progress, current_progress) = common_get_data(item); + let (all_progress, current_progress, current_progress_size) = common_get_data(item); ProgressToSend { all_progress, current_progress, + current_progress_size, step_name: step_name.into(), } } @@ -73,6 +75,7 @@ fn progress_collect_items(item: &ProgressData, files: bool) -> ProgressToSend { ProgressToSend { all_progress, current_progress, + current_progress_size: -1, step_name: step_name.into(), } } @@ -92,7 +95,13 @@ fn progress_default(item: &ProgressData) -> ProgressToSend { format!("Comparing content of {}/{} audio file", item.entries_checked, item.entries_to_check) } CurrentStage::SimilarImagesCalculatingHashes => { - format!("Hashing of {}/{} image", item.entries_checked, item.entries_to_check) + format!( + "Hashing of {}/{} image ({}/{})", + item.entries_checked, + item.entries_to_check, + format_size(item.bytes_checked, BINARY), + format_size(item.bytes_to_check, BINARY) + ) } CurrentStage::SimilarImagesComparingHashes => { format!("Comparing {}/{} image hash", item.entries_checked, item.entries_to_check) @@ -107,17 +116,30 @@ fn progress_default(item: &ProgressData) -> ProgressToSend { format!("Checking {}/{} file", item.entries_checked, item.entries_to_check) } CurrentStage::DuplicatePreHashing => { - format!("Analyzing partial hash of {}/{} files", item.entries_checked, item.entries_to_check) + format!( + "Analyzing partial hash of {}/{} files ({}/{})", + item.entries_checked, + item.entries_to_check, + format_size(item.bytes_checked, BINARY), + format_size(item.bytes_to_check, BINARY) + ) } CurrentStage::DuplicateFullHashing => { - format!("Analyzing full hash of {}/{} files", item.entries_checked, item.entries_to_check) + format!( + "Analyzing full hash of {}/{} files ({}/{})", + item.entries_checked, + item.entries_to_check, + format_size(item.bytes_checked, BINARY), + format_size(item.bytes_to_check, BINARY) + ) } _ => unreachable!(), }; - let (all_progress, current_progress) = common_get_data(item); + let (all_progress, current_progress, current_progress_size) = common_get_data(item); ProgressToSend { all_progress, current_progress, + current_progress_size, step_name: step_name.into(), } } @@ -131,17 +153,30 @@ fn no_current_stage_get_data(item: &ProgressData) -> (i32, i32) { } // Used to calculate number of files to check and also to calculate current progress according to number of files to check and checked -fn common_get_data(item: &ProgressData) -> (i32, i32) { +fn common_get_data(item: &ProgressData) -> (i32, i32, i32) { + let (current_items_checked, current_stage_items_to_check) = if item.bytes_to_check > 0 { + (item.bytes_checked, item.bytes_to_check) + } else { + (item.entries_checked as u64, item.entries_to_check as u64) + }; + if item.entries_to_check != 0 { - let all_stages = (item.current_stage_idx as f64 + item.entries_checked as f64 / item.entries_to_check as f64) / (item.max_stage_idx + 1) as f64; + let all_stages = (item.current_stage_idx as f64 + current_items_checked as f64 / current_stage_items_to_check as f64) / (item.max_stage_idx + 1) as f64; let all_stages = all_stages.min(0.99); - let current_stage = item.entries_checked as f64 / item.entries_to_check as f64; + let current_stage = current_items_checked as f64 / current_stage_items_to_check as f64; let current_stage = current_stage.min(0.99); - ((all_stages * 100.0) as i32, (current_stage * 100.0) as i32) + + let current_stage_size = if item.bytes_to_check != 0 { + ((item.bytes_checked as f64 / item.bytes_to_check as f64).min(0.99) * 100.0) as i32 + } else { + -1 + }; + + ((all_stages * 100.0) as i32, (current_stage * 100.0) as i32, current_stage_size) } else { let all_stages = (item.current_stage_idx as f64) / (item.max_stage_idx + 1) as f64; let all_stages = all_stages.min(0.99); - ((all_stages * 100.0) as i32, 0) + ((all_stages * 100.0) as i32, 0, -1) } } diff --git a/krokiet/src/connect_scan.rs b/krokiet/src/connect_scan.rs index b448bc4c..0f86686e 100644 --- a/krokiet/src/connect_scan.rs +++ b/krokiet/src/connect_scan.rs @@ -55,6 +55,7 @@ pub fn connect_scan_button(app: &MainWindow, progress_sender: Sender {{ + ($message_id:literal, $($args:expr_2021),*) => {{ i18n_embed_fl::fl!($crate::localizer_krokiet::LANGUAGE_LOADER_GUI, $message_id, $($args), *) }}; } diff --git a/krokiet/ui/common.slint b/krokiet/ui/common.slint index b93f9ba8..2ded9ceb 100644 --- a/krokiet/ui/common.slint +++ b/krokiet/ui/common.slint @@ -21,6 +21,7 @@ export enum TypeOfOpenedItem { export struct ProgressToSend { current_progress: int, + current_progress_size: int, all_progress: int, step_name: string, } diff --git a/krokiet/ui/progress.slint b/krokiet/ui/progress.slint index 5f632e33..ed69cd23 100644 --- a/krokiet/ui/progress.slint +++ b/krokiet/ui/progress.slint @@ -37,7 +37,7 @@ export component Progress { ProgressIndicator { visible: progress_datas.current_progress >= -0.001; height: 8px; - progress: progress_datas.current_progress / 100.0; + progress: progress_datas.current_progress_size == -1 ? progress_datas.current_progress / 100.0 : progress_datas.current_progress_size / 100.0; } } @@ -55,7 +55,7 @@ export component Progress { Text { visible: progress_datas.current_progress >= -0.001; vertical-alignment: TextVerticalAlignment.center; - text: progress_datas.current_progress + "%"; + text: (progress_datas.current_progress_size == -1 ? progress_datas.current_progress : progress_datas.current_progress_size) + "%"; } Text { diff --git a/misc/test_image_perf/src/main.rs b/misc/test_image_perf/src/main.rs index 8383f4a8..f32ac73a 100644 --- a/misc/test_image_perf/src/main.rs +++ b/misc/test_image_perf/src/main.rs @@ -4,12 +4,13 @@ use std::env; use std::process::Command; use walkdir::WalkDir; -const DIR_TO_CHECK: &str = "/media/rafal/Kotyk/Rafał/Camera"; +const DIR_TO_CHECK: &str = "/home/rafal/Desktop/TODOOOOOOOOOOOOOOOOOO/DCIM/Camera"; +const ITERATIONS_ON_IMAGE: usize = 10; const ITERATIONS: usize = 5; const HASH_ALG: HashAlg = HashAlg::Gradient; const FILTER_TYPE: FilterType = FilterType::Lanczos3; -const HASH_SIZE: u32 = 64; +const HASH_SIZE: u32 = 8; #[cfg(not(feature = "fast_image_resize"))] const MODE: &str = "NORMAL"; @@ -37,7 +38,7 @@ fn main() { }) .collect::>(); - println!("Collected {} image files", collected_image_files.len()); + println!("Collected {} image files with mode {MODE}", collected_image_files.len()); let mut times = vec![]; @@ -48,7 +49,9 @@ fn main() { let start = std::time::Instant::now(); collected_image_files.par_iter().for_each(|e| { - let _ = hash_image(e); + for _ in 0..ITERATIONS_ON_IMAGE { + let _ = hash_image(e); + } }); let elapsed = start.elapsed(); diff --git a/misc/test_read_perf/src/main.rs b/misc/test_read_perf/src/main.rs index 1fea4d3f..96fc9e7b 100644 --- a/misc/test_read_perf/src/main.rs +++ b/misc/test_read_perf/src/main.rs @@ -5,6 +5,7 @@ use std::cell::RefCell; use std::collections::HashMap; use std::env; use std::process::Command; +use std::sync::Arc; use std::time::UNIX_EPOCH; use strum::Display; use walkdir::WalkDir; @@ -96,38 +97,38 @@ fn main() { fn array16(files: &Vec) { files.into_par_iter().for_each(|f| { let mut buffer = [0u8; 16 * 1024]; - let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, u64::MAX); + let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, Arc::default(), None); }); } fn array256(files: &Vec) { files.into_par_iter().for_each(|f| { let mut buffer = [0u8; 256 * 1024]; - let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, u64::MAX); + let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, Arc::default(), None); }); } fn vec16(files: &Vec) { files.into_par_iter().for_each(|f| { let mut buffer = vec![0u8; 16 * 1024]; - let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, u64::MAX); + let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, Arc::default(), None); }); } fn vec1024(files: &Vec) { files.into_par_iter().for_each(|f| { let mut buffer = vec![0u8; 1024 * 1024]; - let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, u64::MAX); + let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, Arc::default(), None); }); } fn vec1024_locking(files: &Vec) { files.into_par_iter().for_each(|f| { let _lock = GLOBAL_HDD_LOCK.lock().unwrap(); let mut buffer = vec![0u8; 1024 * 1024]; - let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, u64::MAX); + let _ = hash_calculation(&mut buffer, &f, HashType::Blake3, Arc::default(), None); }); } fn vec1024_thread(files: &Vec) { files.into_par_iter().for_each(|f| { BUFFER.with(|buffer| { - let _ = hash_calculation(&mut buffer.borrow_mut(), &f, HashType::Blake3, u64::MAX); + let _ = hash_calculation(&mut buffer.borrow_mut(), &f, HashType::Blake3, Arc::default(), None); }); }); } diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 49c7f9eb..d189301e 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -17,7 +17,7 @@ donation: https://github.com/sponsors/qarmin parts: rust-deps: plugin: nil - override-pull: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.82.0 + override-pull: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.85.0 czkawka: plugin: rust after: [ rust-deps ]