cargo-outdated-0.14.0/.cargo/config.toml000064400000000000000000000004141046102023000161220ustar 00000000000000[alias] clippy-outdated = "clippy --all-features --all-targets --all -- --deny clippy::dbg_macro --deny clippy::unimplemented --deny clippy::todo --deny warnings --deny missing_docs --deny broken_intra_doc_links --forbid unused_must_use --deny clippy::result_unit_err"cargo-outdated-0.14.0/.cargo_vcs_info.json0000644000000001360000000000100140200ustar { "git": { "sha1": "d60b274a495177a4c696a05d38d96fef0560cef2" }, "path_in_vcs": "" }cargo-outdated-0.14.0/.clog.toml000064400000000000000000000003511046102023000145060ustar 00000000000000[clog] repository = "https://github.com/kbknapp/cargo-outdated" outfile = "CHANGELOG.md" from-latest-tag = true [sections] Performance = ["perf"] Improvements = ["impr", "im", "imp"] Documentation = ["docs"] Deprecations = ["depr"] cargo-outdated-0.14.0/.github/workflows/ci-pr.yml000064400000000000000000000044501046102023000177450ustar 00000000000000name: CI-PR on: pull_request: branches: [master, main] concurrency: group: ci-pr-${{ github.ref }} cancel-in-progress: true jobs: ci-pr: name: CI-PR needs: [test-minimal, test-full] runs-on: ubuntu-latest steps: - name: Done run: exit 0 test-minimal: name: Tests (Minimal) env: FLAGS: --no-default-features strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macOS-latest] rust: [stable] runs-on: ${{ matrix.os }} steps: - name: Install rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ matrix.rust }} override: true - name: Cache Builds uses: Swatinem/rust-cache@v1 - name: Checkout uses: actions/checkout@v2 - name: Compile run: cargo test --no-run ${{ env.FLAGS }} - name: Test run: cargo test ${{ env.FLAGS }} test-full: name: Tests (Full) env: FLAGS: --all-features strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macOS-latest] rust: [stable] runs-on: ${{ matrix.os }} steps: - name: Install rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ matrix.rust }} override: true - name: Cache Builds uses: Swatinem/rust-cache@v1 - name: Checkout uses: actions/checkout@v2 - name: Compile run: cargo test --no-run ${{ env.FLAGS }} - name: Test run: cargo test ${{ env.FLAGS }} run: name: Run cargo-outdated env: FLAGS: --all-features strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macOS-latest] rust: [stable] runs-on: ${{ matrix.os }} steps: - name: Install rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ matrix.rust }} override: true - name: Cache Builds uses: Swatinem/rust-cache@v1 - name: Checkout uses: actions/checkout@v2 - name: Compile run: cargo build ${{ env.FLAGS }} - name: Test continue-on-error: true run: cargo run ${{ env.FLAGS }} -- outdated cargo-outdated-0.14.0/.github/workflows/ci.yml000064400000000000000000000034601046102023000173260ustar 00000000000000name: CI on: push: branches: [staging, trying] jobs: ci: name: CI needs: [test] runs-on: ubuntu-latest steps: - name: Done run: exit 0 test: name: Tests strategy: fail-fast: true matrix: rust: [stable, beta] os: [windows-latest, macOS-latest, ubuntu-latest] target: - x86_64-pc-windows-msvc - x86_64-pc-windows-gnu - x86_64-unknown-linux-gnu - x86_64-apple-darwin exclude: # Exclude combinations that don't make sense - os: windows-latest target: x86_64-apple-darwin - os: windows-latest target: x86_64-unknown-linux-gnu - os: macos-latest target: x86_64-pc-windows-msvc - os: macos-latest target: x86_64-pc-windows-gnu - os: macos-latest target: x86_64-unknown-linux-gnu - os: ubuntu-latest target: x86_64-pc-windows-msvc - os: ubuntu-latest target: x86_64-pc-windows-gnu - os: ubuntu-latest target: x86_64-apple-darwin runs-on: ${{ matrix.os }} steps: - name: Install rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} override: true - name: Checkout uses: actions/checkout@v2 - name: Install Just run: cargo install just cargo-nextest - name: Install linker if: matrix.target == 'x86_64-pc-windows-gnu' uses: egor-tensin/setup-mingw@v2 - name: OpenSSL Libs if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install libssl-dev - name: Test run: just test cargo-outdated-0.14.0/.github/workflows/deploy.yml000064400000000000000000000074421046102023000202330ustar 00000000000000name: release on: push: tags: - 'v*.*.*' jobs: create-windows-binaries: runs-on: windows-latest steps: - uses: actions/checkout@v3 - name: Install stable uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - name: Build cargo-outdated run: | cargo build --release - name: Get the version shell: bash id: tagName run: | VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) echo "::set-output name=tag::$VERSION" - name: Build package id: package shell: bash run: | ARCHIVE_TARGET="x86_64-pc-windows-msvc" ARCHIVE_NAME="cargo-outdated-${{ steps.tagName.outputs.tag }}-$ARCHIVE_TARGET" ARCHIVE_FILE="${ARCHIVE_NAME}.zip" 7z a ${ARCHIVE_FILE} ./target/release/cargo-outdated.exe echo "::set-output name=file::${ARCHIVE_FILE}" echo "::set-output name=name::${ARCHIVE_NAME}.zip" - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: ${{ steps.package.outputs.name }} path: ${{ steps.package.outputs.file }} create-unix-binaries: strategy: matrix: os: [ubuntu-latest, macos-latest] include: - os: ubuntu-latest target: x86_64-unknown-linux-musl - os: macos-latest target: x86_64-apple-darwin runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Install Rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable target: ${{ matrix.target }} override: true - name: Install musl if: contains(matrix.target, 'linux-musl') run: | sudo apt-get install musl-tools - name: Build cargo-outdated run: | # TODO: Remember to add RUSTFLAGS=+crt-static for musl target when # static linkage will not be the default behaviour cargo build --release --features vendored-openssl --target ${{ matrix.target }} - name: Strip binary run: | strip target/${{ matrix.target }}/release/cargo-outdated - name: Get the version id: tagName run: | VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) echo "::set-output name=tag::$VERSION" - name: Build package id: package run: | TAR_FILE=cargo-outdated-${{ steps.tagName.outputs.tag }}-${{ matrix.target }} cd target/${{ matrix.target }}/release tar -czvf $GITHUB_WORKSPACE/$TAR_FILE.tar.gz cargo-outdated echo ::set-output "name=name::${TAR_FILE}" echo ::set-output "name=file::${TAR_FILE}.tar.gz " - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: ${{ steps.package.outputs.name }} path: ${{ steps.package.outputs.file }} deploy: needs: [create-windows-binaries, create-unix-binaries] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - name: Create Cargo.lock run: | cargo update - name: Get version id: tagName run: | VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) echo "::set-output name=tag::$VERSION" - name: Download artifacts uses: actions/download-artifact@v2 with: path: ./binaries - name: Create a release uses: softprops/action-gh-release@v1 with: name: v${{ steps.tagName.outputs.tag }} files: | ./binaries/**/*.zip ./binaries/**/*.tar.gz env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} cargo-outdated-0.14.0/.github/workflows/lint.yml000064400000000000000000000032551046102023000177030ustar 00000000000000name: Lint on: pull_request: branches: [master, main] push: branches: [staging, trying] concurrency: group: lint-${{ github.ref }} cancel-in-progress: true jobs: ci: runs-on: ubuntu-latest strategy: matrix: rust: - nightly - 1.70.0 # MSRV - stable steps: - uses: actions/checkout@v2 - name: OpenSSL Libs if: matrix.os == 'ubuntu-latest' && matrix.features == 'all' run: | sudo apt-get update sudo apt-get install libssl-dev - uses: actions-rs/toolchain@v1 with: profile: minimal components: clippy, rustfmt toolchain: ${{ matrix.rust }} override: true - uses: Swatinem/rust-cache@v1 - name: Spell Check uses: crate-ci/typos@master - name: Install Just if: ${{ matrix.rust == 'nightly' || matrix.rust == 'stable' }} run: cargo install just - name: Check Formatting if: ${{ matrix.rust == 'nightly' }} run: just fmt-check - name: Clippy if: ${{ matrix.rust == 'stable' }} run: just lint - name: MSRV Check if: ${{ matrix.rust == '1.70.0' }} # Note we have to actually _run_ the application to check the MSRV. # The standard `cargo check` may successfully build on an earlier # Rust, but cargo-oudated by not be able to successfully run in such # environments. # # Note2: we exclude git2-curl because it requires libgit2-sys which # must match the same version that our internal cargo transitively # requires run: cargo run -- outdated -x git2-curl cargo-outdated-0.14.0/.gitignore000064400000000000000000000002351046102023000146000ustar 00000000000000# Compiled files *.o *.so *.rlib *.dll # Executables *.exe # Generated by Cargo /target # Temp files .*~ # Test files *.test # Backup Files *.orig *.bk cargo-outdated-0.14.0/.typos.toml000064400000000000000000000000631046102023000147400ustar 00000000000000[default.extend-identifiers] 8ba28c73 = "8ba28c73" cargo-outdated-0.14.0/CHANGELOG.md000064400000000000000000000346051046102023000144310ustar 00000000000000 ### v0.14.0 (2023-11-01) #### Changes * MSRV is now as 1.70.0 #### Fixes * `[patch]` table is now included (Thanks to [@rmja](https://github.com/rmja)) (Fixes [#275](https://github.com/kbknapp/cargo-outdated/issues/275)) #### Maintenance * `cargo` was updated to v0.72 (Thanks to [@cuviper](https://github.com/cuviper)) * Use of `serde` vs `serde_derive` was cleaned up (Thanks to [@tottoto](https://github.com/tottoto)) * bump deps * Typo cleanups (Thanks to [@Treeway7](https://github.com/Treeway7)) ### v0.13.1 (2023-06-19) #### Maintenance * bump `tempfile` due to [RUSTSEC-2023-0018](https://rustsec.org/advisories/RUSTSEC-2023-0018) ### v0.13.0 (2023-06-19) #### Changes * MSRV is now properly noted as 1.67.0. A note has been added that while you may be able to compile on an earlier version of Rust, the MSRV is what is required to _run_ `cargo-oudated` because it uses `cargo` internally. #### Maintenance * bump `strum` to v0.25 ### v0.12.0 (2023-06-17) #### Changes * MSRV is now 1.65.0 #### Improvements * update to cargo v0.71 (this allows using sparse regitstry protocol :tada:) * update to clap v4 #### Maintenance * Streamline CI and use `just` as the driving command runner * Bump deps ### v0.11.2 (2023-01-22) #### Bug Fixes * Typo in `--aggressive` arg ([35dfbe1a](https://github.com/kbknapp/cargo-outdated/commit/35dfbe1ab5705b7004b4cb93db53c1bd2d6f93ef)) * Updates `cargo` to v0.65 to fix crash when deps come from workspace ([a09a13da](https://github.com/kbknapp/cargo-outdated/pull/339/commits/a09a13da7433d3cce2bee88bc47a4bc166753b22)) ### v0.11.1 (2022-04-16) #### Bug Fixes * Update cargo to v0.61.1, git2-curl to v0.15 ([215ff0f5](https://github.com/kbknapp/cargo-outdated/commit/215ff0f520b5d3eecb11d6113f99b19380be9922), closes [#307](https://github.com/kbknapp/cargo-outdated/issues/307)) ## v0.11.0 (2022-03-02) #### Improvements * **CLI:** uses clap to parse command line ([a0a06cdb](https://github.com/kbknapp/cargo-outdated/commit/a0a06cdb09341d3e93d9e2d3c332a0107aa289c3)) #### Bug Fixes * remove non-json line when run in workspace mode. ([9ae14d79](https://github.com/kbknapp/cargo-outdated/commit/9ae14d7948a4b7f4e12a98dc044449559ce64dc7), closes [#299](https://github.com/kbknapp/cargo-outdated/issues/299)) * **285:** Added switch ignore-external-rel to workaround issue 285 ([ffbb2493](https://github.com/kbknapp/cargo-outdated/commit/ffbb2493587cbb102db0e75e5addcd5c620043ca)) ## v0.10.1 (2021-11-16) * Fix acquiring package cache lock (`d38926b`) ## v0.10.0 (2021-11-10) * Adds the ability to run offline against a local registry via `--offline` (`2a5bf77`) ## v0.9.18 (2021-11-10) * Improve errors and unwraps (`4585424 `) * Upgrade cargo to support the 2021 edition (`235ad47`) * Add packaging status for cargo-outdated in README (`f39c8de `) * Update dependencies for openssl 3.0 support (`a22e1cd `) * Fix lints (`8a74214 `) * Add the missing `cargo-features` entry in `Manifest`. (`a3f732e `) * Added new CI stages for linting and clippy, ran rustfmt and clippy to fix any current issues, added .cargo/config.toml for a clippy alias (`99bc8a6 `) * This patch fixes the feature issue where package is used to redirect a feature to a specific version of the dependency (`97a2e29 `) ## 0.8.0 * Update Cargo dependency for compatibility with Rust 2018 edition ## 0.7.1 (2018-09-23) #### Documentation * update contributor list ([eae6c697](https://github.com/kbknapp/cargo-outdated/commit/eae6c697b07d0453a5fcf5bbaad397bc5c649f59)) * updates usage text ([642ecbd1](https://github.com/kbknapp/cargo-outdated/commit/642ecbd1e1b40702142d644c560e39d8d58c3f82)) #### Bug Fixes * Remove extra reference taking per clippy. ([9efa1e8d](https://github.com/kbknapp/cargo-outdated/commit/9efa1e8da16461b4d3f698b4d4c7343b64c5bd92)) #### Others * Update dependencies and related codes for compatibility. ([d5813a13](https://github.com/kbknapp/cargo-outdated/pull/135/commits/d5813a13b538981e9ed7e60dc9f9c804ef9fe24e)) ## v0.7.0 (2017-11-23) #### Bug Fixes * Treats optional dependencies as features as well (closes [#100](https://github.com/kbknapp/cargo-outdated/issues/100), [f67634f](https://github.com/kbknapp/cargo-outdated/pull/107/commits/f67634f1ccda77a1ff86e72d6f0e32e6c94ee717)) * Filters yanked packages out from candidates (closes [#101](https://github.com/kbknapp/cargo-outdated/issues/101), [c42a4ef](https://github.com/kbknapp/cargo-outdated/pull/109/commits/c42a4ef33e6242c26b94017be2e6dee3136072f3)) * Rewrites the algorithm of dependency tree comparison (closes [#105](https://github.com/kbknapp/cargo-outdated/issues/105), [5cd414a](https://github.com/kbknapp/cargo-outdated/pull/111/commits/5cd414aa766b5d7ca1bc8ec8687d8af91878116c)) #### Improvements * Uses [`docopt`](https://crates.io/crates/docopt) instead of [`clap`](https://crates.io/crates/clap) to make `cargo-outdated` more native (closes [#110](https://github.com/kbknapp/cargo-outdated/issues/110), [71cd8ed](https://github.com/kbknapp/cargo-outdated/pull/112/commits/71cd8edb693fef2c24df352ff8d087fd06c4ce4e), [9497bd8](https://github.com/kbknapp/cargo-outdated/pull/114/commits/9497bd8d9b365db234f2ce02b3f7cd988752931a)) #### Documentation * Adds crates.io version badge to readme ([7e64221](https://github.com/kbknapp/cargo-outdated/pull/104/commits/7e64221c30fbbcc5e9dcfacf12537ba3ac28207c)) * Removes dependency graph from readme ([3792687](https://github.com/kbknapp/cargo-outdated/pull/113/commits/37926871132de526519ddbd39790d357bc5ce28a)) ## v0.6.3 (2017-11-07) #### Documentation * Adds a CONTRIBUTORS.md and a just target to update it ([062845e](https://github.com/kbknapp/cargo-outdated/pull/102/commits/062845e6a9e54c31a9bfe42307115e80decf47b2)) #### Others * Adds crates.io categories and badges ([e99f31d](https://github.com/kbknapp/cargo-outdated/pull/102/commits/e99f31d39b0429c1405eff7e93b9310deeebc56d)) ## v0.6.2 (2017-10-28) #### Bug Fixes * Replaces relative paths with absolute ones in latest manifests (closes [#96](https://github.com/kbknapp/cargo-outdated/issues/96), [ec431cd](https://github.com/kbknapp/cargo-outdated/pull/97/commits/ec431cd1bfe6680b4ccd89703c05a9840874c1ae)) ## v0.6.1 (2017-10-25) #### Bug Fixes * Fixes `--exit-code`, `--color` (upstream) (closes [#63](https://github.com/kbknapp/cargo-outdated/issues/63), [4d4b6a8](https://github.com/kbknapp/cargo-outdated/pull/90/commits/4d4b6a85b9a6e2c212683eee35efc421188c2051)) * Calls `Source::update()` on non-default sources before `Registry::query()` (closes [#91](https://github.com/kbknapp/cargo-outdated/issues/91), [9e7b774](https://github.com/kbknapp/cargo-outdated/pull/93/commits/9e7b774b833c38e4b9ea842b205348ab2576034d)) #### Performance * Replaces `format!()` with `Path.join()` (closes [#73](https://github.com/kbknapp/cargo-outdated/issues/73), [4d28c02](https://github.com/kbknapp/cargo-outdated/pull/94/commits/4d28c028fcd7cfce42df7e9223858ad5b046c9e7)) #### Tests * Runs Travis CI only on `master` to avoid redundant builds ## v0.6.0 (2017-10-21) #### Improvements * Queries [`crates.io`](https://crates.io) API for new versions with a channel-aware policy for latest ones (can be ignored by `--aggressive`) (closes [#75](https://github.com/kbknapp/cargo-outdated/issues/75), [7d57929](https://github.com/kbknapp/cargo-outdated/pull/87/commits/7d5792943fd28e17e57589520818b08b55cb667f)) #### Bug Fixes * Queries [`crates.io`](https://crates.io) API for feature changes to avoid "Package does not have these features" errors and warns user of obsolete features (can be suppressed by `--quiet`) (closes [#84](https://github.com/kbknapp/cargo-outdated/issues/84), [7d57929](https://github.com/kbknapp/cargo-outdated/pull/87/commits/7d5792943fd28e17e57589520818b08b55cb667f)) #### Documentation * Updates dependency graph in `README.md` (closes [#86](https://github.com/kbknapp/cargo-outdated/issues/86), [cf773eb](https://github.com/kbknapp/cargo-outdated/pull/88/commits/cf773eb1643ee4770dc107579f668ea2a5fd6d3a)) #### Others * Updates `cargo` to `0.22.0` ([29ce666](https://github.com/kbknapp/cargo-outdated/pull/85/commits/29ce6661cab50dcc9624d0a02be0facf4d5da067)) ## v0.5.3 (2017-10-10) #### Improvements * Provides `--workspace` flag to enforce workspace mode so that it can loop through workspace members even if it's not executed against a virtual manifest (closes [#81](https://github.com/kbknapp/cargo-outdated/issues/81), [f690a7a](https://github.com/kbknapp/cargo-outdated/pull/82/commits/f690a7a22a3c1f56e67c7ee784e69d96f537c301)) ## v0.5.2 (2017-10-06) #### Documentation * Briefly explains how `cargo-outdated` works in `README.md` ([8c35c61](https://github.com/kbknapp/cargo-outdated/commit/8c35c6148b4a29d50b55f1b064045e611fc5aa9b)) #### Features * Loops through all workspace members if executed against a virtual manifest (closes [#58](https://github.com/kbknapp/cargo-outdated/issues/58), [cd36aed](https://github.com/kbknapp/cargo-outdated/commit/cd36aed8f6b540d58ff4eb805cb2a20985f0122e)) #### Bug Fixes * Fixes missing dependency issue for debug build (closes [#77](https://github.com/kbknapp/cargo-outdated/issues/77), [c82e928](https://github.com/kbknapp/cargo-outdated/pull/78/commits/c82e92859e4659effcc08362081042b441004a1d)) #### Tests * Debug build is now part of CI ([05ada44](https://github.com/kbknapp/cargo-outdated/pull/78/commits/05ada447863f775ff58e6bfcaa764582af62f2cc)) ## v0.5.1 (2017-09-23) #### Documentation * Fixes a typo ([38e37c6](https://github.com/kbknapp/cargo-outdated/pull/66/commits/38e37c6ee77a6ff252bb0702033d7a0b03eac226)) #### Improvements * Enables `--all-features` by default (closes [#57](https://github.com/kbknapp/cargo-outdated/issues/57), [f24c3a6](https://github.com/kbknapp/cargo-outdated/pull/64/commits/f24c3a6a8e050cbb651661bfbc9221546d987c41)) * Prints a dashed line under the table header ([b076bb1](https://github.com/kbknapp/cargo-outdated/pull/65/commits/b076bb144818b2c5d7efcc3af0acf85ae83f44e1)) #### Bug Fixes * Correctly shows error messages (closes [#60](https://github.com/kbknapp/cargo-outdated/issues/60), [daab865](https://github.com/kbknapp/cargo-outdated/pull/61/commits/daab865647715cf467fc28f1333afcd1fe2cf447)) * Excludes default features if not explicitly specified by user (closes [#69](https://github.com/kbknapp/cargo-outdated/issues/69), [7074fc8](https://github.com/kbknapp/cargo-outdated/pull/70/commits/7074fc8754d0cf231ff84070307ee92c1cedf065)) ## v0.5.0 (2017-09-18) #### Refactoring * Introduces [`cargo`](https://crates.io/crates/cargo) as a dependency ([0539a61](https://github.com/kbknapp/cargo-outdated/pull/51/commits/0539a619d30175fd287a979a9eecb1143df0f2f6)) #### Improvements * Replaces `RM` with `Removed` (closes [#46](https://github.com/kbknapp/cargo-outdated/issues/46)) * Adds `Kind`, `Platform` in output #### Features * Supports `cargo` workspaces (closes [#28](https://github.com/kbknapp/cargo-outdated/issues/28)) * Supports embedded dependencies (fixes [#50](https://github.com/kbknapp/cargo-outdated/issues/50)) * Supports build/development/target-specific dependencies (closes [#20](https://github.com/kbknapp/cargo-outdated/issues/20), fixes [#49](https://github.com/kbknapp/cargo-outdated/issues/49)) * Adds `--all-features`, `--features`, `--no-default-features` ## v0.4.0 (2017-08-04) #### Documentation * Spelling ([6d309060](https://github.com/kbknapp/cargo-outdated/commit/6d3090601d03694838a848e044f157764d0271cb)) #### Bug Fixes * Sets bin.path in the temp manifest ([a0231de5](https://github.com/kbknapp/cargo-outdated/commit/a0231de51428e5238dcab0d73cdce2d2443f8a7e), closes [#41](https://github.com/kbknapp/cargo-outdated/issues/41)) * Correctly handles dependencies with multiple occurrences ([03d3e74cf](https://github.com/kbknapp/cargo-outdated/commit/03d3e74cf38156adecc1620271ec8beb9c442865)) ## v0.3.0 (2016-12-05) #### Features * adds a --manifest-path and --lockfile-path to allow use with other projects ([5f886d27](https://github.com/kbknapp/cargo-outdated/commit/5f886d27d3fefbc0b7fec9ffef651c137f58420d), closes [#29](https://github.com/kbknapp/cargo-outdated/issues/29)) ## v0.2.0 * **Exit Codes:** adds feature for custom exit code on new vers ([61c8bb9b](https://github.com/kbknapp/cargo-outdated/commit/61c8bb9b52af8745fd16fad646bc2f4dcce336c7), closes [#23](https://github.com/kbknapp/cargo-outdated/issues/23)) #### Improvements * sort output ([b137e050](https://github.com/kbknapp/cargo-outdated/commit/b137e050ffb861f7ff725324be5cdb527d724a49)) ## v0.1.3 (2015-11-14) #### Documentation * adds demo ([c2192aac](https://github.com/kbknapp/cargo-outdated/commit/c2192aac903e764a43fc103251e56ce50b89a8eb)) * updates readme with cargo install instructions ([e936a454](https://github.com/kbknapp/cargo-outdated/commit/e936a45443fc02ab65be15d6a872609a95f7dc00)) #### Bug Fixes * fixes build error on windows due to upstream dep ([af4e1a70](https://github.com/kbknapp/cargo-outdated/commit/af4e1a704a70d5524e76c9ad6fd320cd576c4a2c)) ### v0.1.1 (2015-11-04) #### Documentation * adds crate level docs ([8ba28c73](https://github.com/kbknapp/cargo-outdated/commit/8ba28c73e084bf0535e0df72653c529886d025a5)) #### Improvements * various fixes from clippy run ([b8b633fc](https://github.com/kbknapp/cargo-outdated/commit/b8b633fc148b8be38fec8a8efc73d30bc2917716)) ## v0.1.0 Initial Implementation (2015-08-11) ### Features * Initial implementation ([e5d5a82e](https://github.com/kbknapp/cargo-outdated/commit/e5d5a82e95b86f088c53fe5665dc4f8219b7db49)) #### Improvements * adds better error handling ([9032454c](https://github.com/kbknapp/cargo-outdated/commit/9032454cd1fcbd2d1cadbb924b8664ced04e2406)) #### Documentation * **CHANGELOG.md:** adds a changelog ([9d1c1601](https://github.com/kbknapp/cargo-outdated/commit/9d1c1601c0729a6f60d51c86936a061f1376b06a)) * **README.md:** adds a readme ([67bc5556](https://github.com/kbknapp/cargo-outdated/commit/67bc555669159f11907f9bb90913e45af232b277)) cargo-outdated-0.14.0/CONTRIBUTING.md000064400000000000000000000047101046102023000150430ustar 00000000000000# How to Contribute Contributions are always welcome! Please use the following guidelines when contributing to `cargo-outdated` ## Justfile We use [`just`](https://github.com/Casey/just) as a command runner which should simplify running the same tests on your changes locally that will be run in CI. After installing `just` (`cargo install`, via Github Release binaries, etc.) you can run `just help` to see a list of valid targets. Most importantly `just ci` should run the entire CI suit against your changes (except only for your native OS and architecture). `just lint` is a good recipe to run while developing to run the linting and formatting checks prior to trying to run the entire test suite. At the time of this writing the recipes look like this: ``` $ just help Available recipes: bench $RUSTFLAGS='-Ctarget-cpu=native' # Run benchmarks ci # Run all the checks required for CI to pass clean debug TEST default fmt # Format the code fmt-check # Check the formatting of the code but don't actually format it help # Get a list of recipes you can run lint # Lint the code run-test TEST run-tests setup # Install required tools for development spell-check # Check for typos test TEST_RUNNER='cargo nextest run' # Run the test suite update-contributors ``` ## Commit Subjects As you make your commit messages; please note that we use a [conventional](https://github.com/ajoslin/conventional-changelog/blob/master/CONVENTIONS.md) changelog format so we can update my changelog using [clog](https://github.com/clog-tool/clog-cli) * Format your commit subject line using the following format: `TYPE(COMPONENT): MESSAGE` where `TYPE` is one of the following: * `feat` - A new feature * `imp` - An improvement to an existing feature * `perf` - A performance improvement * `docs` - Changes to documentation only * `tests` - Changes to the testing framework or tests only * `fix` - A bug fix * `refactor` - Code functionality doesn't change, but underlying structure may * `style` - Stylistic changes only, no functionality changes * `wip` - A work in progress commit (Should typically be `git rebase`'ed away) * `chore` - Catch all or things that have to do with the build system, etc * The `COMPONENT` is optional, and may be a single file, directory, or logical component. Can be omitted if commit applies globally cargo-outdated-0.14.0/CONTRIBUTORS.md000064400000000000000000000065071046102023000150770ustar 00000000000000the following is a list of contributors: [Frederick888](https://github.com/Frederick888) |[kbknapp](https://github.com/kbknapp) |[homu](https://github.com/homu) |[waywardmonkeys](https://github.com/waywardmonkeys) |[AerialX](https://github.com/AerialX) |[Vinatorul](https://github.com/Vinatorul) | :---: |:---: |:---: |:---: |:---: |:---: | [Frederick888](https://github.com/Frederick888) |[kbknapp](https://github.com/kbknapp) |[homu](https://github.com/homu) |[waywardmonkeys](https://github.com/waywardmonkeys) |[AerialX](https://github.com/AerialX) |[Vinatorul](https://github.com/Vinatorul) | [mbrubeck](https://github.com/mbrubeck) |[sinkuu](https://github.com/sinkuu) |[mathstuf](https://github.com/mathstuf) |[TimNN](https://github.com/TimNN) |[wdv4758h](https://github.com/wdv4758h) |[neosilky](https://github.com/neosilky) | :---: |:---: |:---: |:---: |:---: |:---: | [mbrubeck](https://github.com/mbrubeck) |[sinkuu](https://github.com/sinkuu) |[mathstuf](https://github.com/mathstuf) |[TimNN](https://github.com/TimNN) |[wdv4758h](https://github.com/wdv4758h) |[neosilky](https://github.com/neosilky) | [dimbleby](https://github.com/dimbleby) |[jonas-schievink](https://github.com/jonas-schievink) |[killercup](https://github.com/killercup) |[gitter-badger](https://github.com/gitter-badger) |[chpio](https://github.com/chpio) |[bjgill](https://github.com/bjgill) | :---: |:---: |:---: |:---: |:---: |:---: | [dimbleby](https://github.com/dimbleby) |[jonas-schievink](https://github.com/jonas-schievink) |[killercup](https://github.com/killercup) |[gitter-badger](https://github.com/gitter-badger) |[chpio](https://github.com/chpio) |[bjgill](https://github.com/bjgill) | This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list) cargo-outdated-0.14.0/Cargo.lock0000644000002131630000000000100120010ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom", "once_cell", "version_check", "zerocopy", ] [[package]] name = "aho-corasick" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "anstream" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "arc-swap" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" [[package]] name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitmaps" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" dependencies = [ "typenum", ] [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bstr" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" dependencies = [ "memchr", "regex-automata", "serde", ] [[package]] name = "btoi" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad" dependencies = [ "num-traits", ] [[package]] name = "bumpalo" version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytesize" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" [[package]] name = "cargo" version = "0.72.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "171aca76a3199e771ea0b94ec260984ed9cba62af8e478142974dbaa594d583b" dependencies = [ "anyhow", "base64", "bytesize", "cargo-platform", "cargo-util", "clap", "crates-io", "curl", "curl-sys", "env_logger", "filetime", "flate2", "fwdansi", "git2", "git2-curl", "gix", "gix-features", "glob", "hex", "hmac", "home", "http-auth", "humantime", "ignore", "im-rc", "indexmap 1.9.3", "is-terminal", "itertools", "jobserver", "lazy_static", "lazycell", "libc", "libgit2-sys", "log", "memchr", "opener", "openssl", "os_info", "pasetors", "pathdiff", "rand", "rustfix", "semver", "serde", "serde-value", "serde_ignored", "serde_json", "sha1", "shell-escape", "strip-ansi-escapes", "tar", "tempfile", "termcolor", "time", "toml", "toml_edit", "unicode-width", "unicode-xid", "url", "walkdir", "windows-sys", ] [[package]] name = "cargo-outdated" version = "0.14.0" dependencies = [ "anyhow", "cargo", "clap", "env_logger", "git2-curl", "pretty_assertions", "semver", "serde", "serde_json", "strum", "tabwriter", "tempfile", "termcolor", "toml", ] [[package]] name = "cargo-platform" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" dependencies = [ "serde", ] [[package]] name = "cargo-util" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77042b5b585f701f1cfb4b6b12ebc02b9b0cefbc8dcce235906b6bf376d4245d" dependencies = [ "anyhow", "core-foundation", "filetime", "hex", "jobserver", "libc", "miow", "same-file", "sha2", "shell-escape", "tempfile", "tracing", "walkdir", "windows-sys", ] [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", "libc", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", "terminal_size", ] [[package]] name = "clap_derive" version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", "syn 2.0.38", ] [[package]] name = "clap_lex" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "clru" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807" [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "const-oid" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "core-foundation" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "core-foundation-sys" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] name = "crates-io" version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876aa69b4afca5f2eb5e23daa3445930faf829bcb67075a20ffa884f11f8c57c" dependencies = [ "anyhow", "curl", "percent-encoding", "serde", "serde_json", "url", ] [[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] [[package]] name = "crypto-bigint" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" dependencies = [ "generic-array", "rand_core", "subtle", "zeroize", ] [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "ct-codecs" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3b7eb4404b8195a9abb6356f4ac07d8ba267045c8d6d220ac4dc992e6cc75df" [[package]] name = "curl" version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", "socket2", "winapi", ] [[package]] name = "curl-sys" version = "0.4.68+curl-8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4a0d18d88360e374b16b2273c832b5e57258ffc1d4aa4f96b108e0738d5752f" dependencies = [ "cc", "libc", "libnghttp2-sys", "libz-sys", "openssl-sys", "pkg-config", "vcpkg", "windows-sys", ] [[package]] name = "der" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "pem-rfc7468", "zeroize", ] [[package]] name = "deranged" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" dependencies = [ "powerfmt", ] [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "const-oid", "crypto-common", "subtle", ] [[package]] name = "dunce" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "ecdsa" version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", "digest", "elliptic-curve", "rfc6979", "signature", "spki", ] [[package]] name = "ed25519-compact" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a3d382e8464107391c8706b4c14b087808ecb909f6c15c34114bc42e53a9e4c" dependencies = [ "getrandom", ] [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" dependencies = [ "base16ct", "crypto-bigint", "digest", "ff", "generic-array", "group", "hkdf", "pem-rfc7468", "pkcs8", "rand_core", "sec1", "subtle", "zeroize", ] [[package]] name = "env_logger" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" dependencies = [ "humantime", "is-terminal", "log", "regex", "termcolor", ] [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ "libc", "windows-sys", ] [[package]] name = "faster-hex" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239f7bfb930f820ab16a9cd95afc26f88264cf6905c960b340a615384aa3338a" dependencies = [ "serde", ] [[package]] name = "fastrand" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "ff" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core", "subtle", ] [[package]] name = "fiat-crypto" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a481586acf778f1b1455424c343f71124b048ffa5f4fc3f8f6ae9dc432dcb3c7" [[package]] name = "filetime" version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if", "libc", "redox_syscall 0.3.5", "windows-sys", ] [[package]] name = "flate2" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "libz-sys", "miniz_oxide", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] [[package]] name = "fwdansi" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08c1f5787fe85505d1f7777268db5103d80a7a374d2316a7ce262e57baf8f208" dependencies = [ "memchr", "termcolor", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", "zeroize", ] [[package]] name = "getrandom" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "js-sys", "libc", "wasi", "wasm-bindgen", ] [[package]] name = "git2" version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044" dependencies = [ "bitflags 1.3.2", "libc", "libgit2-sys", "log", "openssl-probe", "openssl-sys", "url", ] [[package]] name = "git2-curl" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8f8b7432b72928cff76f69e59ed5327f94a52763731e71274960dee72fe5f8c" dependencies = [ "curl", "git2", "log", "url", ] [[package]] name = "gix" version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf41b61f7df395284f7a579c0fa1a7e012c5aede655174d4e91299ef1cac643" dependencies = [ "gix-actor", "gix-attributes", "gix-config", "gix-credentials", "gix-date", "gix-diff", "gix-discover", "gix-features", "gix-fs", "gix-glob", "gix-hash", "gix-hashtable", "gix-ignore", "gix-index", "gix-lock", "gix-mailmap", "gix-object", "gix-odb", "gix-pack", "gix-path", "gix-prompt", "gix-protocol", "gix-ref", "gix-refspec", "gix-revision", "gix-sec", "gix-tempfile", "gix-transport", "gix-traverse", "gix-url", "gix-utils", "gix-validate", "gix-worktree", "log", "once_cell", "prodash", "signal-hook", "smallvec", "thiserror", "unicode-normalization", ] [[package]] name = "gix-actor" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "848efa0f1210cea8638f95691c82a46f98a74b9e3524f01d4955ebc25a8f84f3" dependencies = [ "bstr", "btoi", "gix-date", "itoa", "nom", "thiserror", ] [[package]] name = "gix-attributes" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3015baa01ad2122fbcaab7863c857a603eb7b7ec12ac8141207c42c6439805e2" dependencies = [ "bstr", "gix-glob", "gix-path", "gix-quote", "kstring", "log", "smallvec", "thiserror", "unicode-bom", ] [[package]] name = "gix-bitmap" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ccab4bc576844ddb51b78d81b4a42d73e6229660fa614dfc3d3999c874d1959" dependencies = [ "thiserror", ] [[package]] name = "gix-chunk" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b42ea64420f7994000130328f3c7a2038f639120518870436d31b8bde704493" dependencies = [ "thiserror", ] [[package]] name = "gix-command" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c576cfbf577f72c097b5f88aedea502cd62952bdc1fb3adcab4531d5525a4c7" dependencies = [ "bstr", ] [[package]] name = "gix-config" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d252a0eddb6df74600d3d8872dc9fe98835a7da43110411d705b682f49d4ac1" dependencies = [ "bstr", "gix-config-value", "gix-features", "gix-glob", "gix-path", "gix-ref", "gix-sec", "log", "memchr", "nom", "once_cell", "smallvec", "thiserror", "unicode-bom", ] [[package]] name = "gix-config-value" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e874f41437441c02991dcea76990b9058fadfc54b02ab4dd06ab2218af43897" dependencies = [ "bitflags 2.4.1", "bstr", "gix-path", "libc", "thiserror", ] [[package]] name = "gix-credentials" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4874a4fc11ffa844a3c2b87a66957bda30a73b577ef1acf15ac34df5745de5ff" dependencies = [ "bstr", "gix-command", "gix-config-value", "gix-path", "gix-prompt", "gix-sec", "gix-url", "thiserror", ] [[package]] name = "gix-date" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc164145670e9130a60a21670d9b6f0f4f8de04e5dd256c51fa5a0340c625902" dependencies = [ "bstr", "itoa", "thiserror", "time", ] [[package]] name = "gix-diff" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "644a0f2768bc42d7a69289ada80c9e15c589caefc6a315d2307202df83ed1186" dependencies = [ "gix-hash", "gix-object", "imara-diff", "thiserror", ] [[package]] name = "gix-discover" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a6b61363e63e7cdaa3e6f96acb0257ebdb3d8883e21eba5930c99f07f0a5fc0" dependencies = [ "bstr", "dunce", "gix-hash", "gix-path", "gix-ref", "gix-sec", "thiserror", ] [[package]] name = "gix-features" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf69b0f5c701cc3ae22d3204b671907668f6437ca88862d355eaf9bc47a4f897" dependencies = [ "bytes", "crc32fast", "crossbeam-channel", "flate2", "gix-hash", "libc", "once_cell", "parking_lot", "prodash", "sha1_smol", "thiserror", "walkdir", ] [[package]] name = "gix-fs" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b37a1832f691fdc09910bd267f9a2e413737c1f9ec68c6e31f9e802616278a9" dependencies = [ "gix-features", ] [[package]] name = "gix-glob" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07c98204529ac3f24b34754540a852593d2a4c7349008df389240266627a72a" dependencies = [ "bitflags 2.4.1", "bstr", "gix-features", "gix-path", ] [[package]] name = "gix-hash" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b422ff2ad9a0628baaad6da468cf05385bf3f5ab495ad5a33cce99b9f41092f" dependencies = [ "hex", "thiserror", ] [[package]] name = "gix-hashtable" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "385f4ce6ecf3692d313ca3aa9bd3b3d8490de53368d6d94bedff3af8b6d9c58d" dependencies = [ "gix-hash", "hashbrown 0.14.2", "parking_lot", ] [[package]] name = "gix-ignore" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba205b6df563e2906768bb22834c82eb46c5fdfcd86ba2c347270bc8309a05b2" dependencies = [ "bstr", "gix-glob", "gix-path", "unicode-bom", ] [[package]] name = "gix-index" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f39c1ccc8f1912cbbd5191efc28dbc5f0d0598042aa56bc09427b7c34efab3ba" dependencies = [ "bitflags 2.4.1", "bstr", "btoi", "filetime", "gix-bitmap", "gix-features", "gix-hash", "gix-lock", "gix-object", "gix-traverse", "itoa", "memmap2", "smallvec", "thiserror", ] [[package]] name = "gix-lock" version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c693d7f05730fa74a7c467150adc7cea393518410c65f0672f80226b8111555" dependencies = [ "gix-tempfile", "gix-utils", "thiserror", ] [[package]] name = "gix-mailmap" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8856cec3bdc3610c06970d28b6cb20a0c6621621cf9a8ec48cbd23f2630f362" dependencies = [ "bstr", "gix-actor", "thiserror", ] [[package]] name = "gix-object" version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d96bd620fd08accdd37f70b2183cfa0b001b4f1c6ade8b7f6e15cb3d9e261ce" dependencies = [ "bstr", "btoi", "gix-actor", "gix-features", "gix-hash", "gix-validate", "hex", "itoa", "nom", "smallvec", "thiserror", ] [[package]] name = "gix-odb" version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bca2f324aa67672b6d0f2c0fa93f96eb6a7029d260e4c1df5dce3c015f5e5add" dependencies = [ "arc-swap", "gix-features", "gix-hash", "gix-object", "gix-pack", "gix-path", "gix-quote", "parking_lot", "tempfile", "thiserror", ] [[package]] name = "gix-pack" version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "164a515900a83257ae4aa80e741655bee7a2e39113fb535d7a5ac623b445ff20" dependencies = [ "clru", "gix-chunk", "gix-diff", "gix-features", "gix-hash", "gix-hashtable", "gix-object", "gix-path", "gix-tempfile", "gix-traverse", "memmap2", "parking_lot", "smallvec", "thiserror", ] [[package]] name = "gix-packetline" version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a8384b1e964151aff0d5632dd9b191059d07dff358b96bd940f1b452600d7ab" dependencies = [ "bstr", "faster-hex", "thiserror", ] [[package]] name = "gix-path" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18609c8cbec8508ea97c64938c33cd305b75dfc04a78d0c3b78b8b3fd618a77c" dependencies = [ "bstr", "gix-trace", "home", "once_cell", "thiserror", ] [[package]] name = "gix-prompt" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c22decaf4a063ccae2b2108820c8630c01bd6756656df3fe464b32b8958a5ea" dependencies = [ "gix-command", "gix-config-value", "parking_lot", "rustix", "thiserror", ] [[package]] name = "gix-protocol" version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877e49417f1730f4dbc2f7d9a2ab0f8b2f49ef08f97270691403ecde3d961e3a" dependencies = [ "bstr", "btoi", "gix-credentials", "gix-features", "gix-hash", "gix-transport", "maybe-async", "nom", "thiserror", ] [[package]] name = "gix-quote" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "475c86a97dd0127ba4465fbb239abac9ea10e68301470c9791a6dd5351cdc905" dependencies = [ "bstr", "btoi", "thiserror", ] [[package]] name = "gix-ref" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e03989e9d49954368e1b526578230fc7189d1634acdfbe79e9ba1de717e15d5" dependencies = [ "gix-actor", "gix-features", "gix-fs", "gix-hash", "gix-lock", "gix-object", "gix-path", "gix-tempfile", "gix-validate", "memmap2", "nom", "thiserror", ] [[package]] name = "gix-refspec" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6ea733820df67e4cd7797deb12727905824d8f5b7c59d943c456d314475892" dependencies = [ "bstr", "gix-hash", "gix-revision", "gix-validate", "smallvec", "thiserror", ] [[package]] name = "gix-revision" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "810f35e9afeccca999d5d348b239f9c162353127d2e13ff3240e31b919e35476" dependencies = [ "bstr", "gix-date", "gix-hash", "gix-hashtable", "gix-object", "thiserror", ] [[package]] name = "gix-sec" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9615cbd6b456898aeb942cd75e5810c382fbfc48dbbff2fa23ebd2d33dcbe9c7" dependencies = [ "bitflags 2.4.1", "gix-path", "libc", "windows", ] [[package]] name = "gix-tempfile" version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71a0d32f34e71e86586124225caefd78dabc605d0486de580d717653addf182" dependencies = [ "gix-fs", "libc", "once_cell", "parking_lot", "signal-hook", "signal-hook-registry", "tempfile", ] [[package]] name = "gix-trace" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96b6d623a1152c3facb79067d6e2ecdae48130030cf27d6eb21109f13bd7b836" [[package]] name = "gix-transport" version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f01c2bf7b989c679695ef635fc7d9e80072e08101be4b53193c8e8b649900102" dependencies = [ "base64", "bstr", "curl", "gix-command", "gix-credentials", "gix-features", "gix-packetline", "gix-quote", "gix-sec", "gix-url", "thiserror", ] [[package]] name = "gix-traverse" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5be1e807f288c33bb005075111886cceb43ed8a167b3182a0f62c186e2a0dd1" dependencies = [ "gix-hash", "gix-hashtable", "gix-object", "thiserror", ] [[package]] name = "gix-url" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc77f89054297cc81491e31f1bab4027e554b5ef742a44bd7035db9a0f78b76" dependencies = [ "bstr", "gix-features", "gix-path", "home", "thiserror", "url", ] [[package]] name = "gix-utils" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b85d89dc728613e26e0ed952a19583744e7f5240fcd4aa30d6c824ffd8b52f0f" dependencies = [ "fastrand", ] [[package]] name = "gix-validate" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba9b3737b2cef3dcd014633485f0034b0f1a931ee54aeb7d8f87f177f3c89040" dependencies = [ "bstr", "thiserror", ] [[package]] name = "gix-worktree" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a69eaff0ae973a9d37c40f02ae5ae50fa726c8fc2fd3ab79d0a19eb61975aafa" dependencies = [ "bstr", "filetime", "gix-attributes", "gix-features", "gix-fs", "gix-glob", "gix-hash", "gix-ignore", "gix-index", "gix-object", "gix-path", "io-close", "thiserror", ] [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" dependencies = [ "aho-corasick", "bstr", "fnv", "log", "regex", ] [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core", "subtle", ] [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hkdf" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" dependencies = [ "hmac", ] [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ "digest", ] [[package]] name = "home" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ "windows-sys", ] [[package]] name = "http-auth" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5430cacd7a1f9a02fbeb350dfc81a0e5ed42d81f3398cb0ba184017f85bdcfbc" dependencies = [ "memchr", ] [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "idna" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] name = "ignore" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" dependencies = [ "globset", "lazy_static", "log", "memchr", "regex", "same-file", "thread_local", "walkdir", "winapi-util", ] [[package]] name = "im-rc" version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" dependencies = [ "bitmaps", "rand_core", "rand_xoshiro", "sized-chunks", "typenum", "version_check", ] [[package]] name = "imara-diff" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e98c1d0ad70fc91b8b9654b1f33db55e59579d3b3de2bffdced0fdb810570cb8" dependencies = [ "ahash", "hashbrown 0.12.3", ] [[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", ] [[package]] name = "indexmap" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.2", ] [[package]] name = "io-close" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc" dependencies = [ "libc", "winapi", ] [[package]] name = "is-terminal" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", "windows-sys", ] [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] [[package]] name = "kstring" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747" dependencies = [ "static_assertions", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lazycell" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libgit2-sys" version = "0.15.2+1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa" dependencies = [ "cc", "libc", "libssh2-sys", "libz-sys", "openssl-sys", "pkg-config", ] [[package]] name = "libnghttp2-sys" version = "0.1.8+1.55.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fae956c192dadcdb5dace96db71fa0b827333cce7c7b38dc71446f024d8a340" dependencies = [ "cc", "libc", ] [[package]] name = "libssh2-sys" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" dependencies = [ "cc", "libc", "libz-sys", "openssl-sys", "pkg-config", "vcpkg", ] [[package]] name = "libz-sys" version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" dependencies = [ "cc", "libc", "pkg-config", "vcpkg", ] [[package]] name = "linux-raw-sys" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "maybe-async" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f1b8c13cb1f814b634a96b2c725449fe7ed464a7b8781de8688be5ffbd3f305" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "memchr" version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "miow" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "359f76430b20a79f9e20e115b3428614e654f04fab314482fc0fda0ebd3c6044" dependencies = [ "windows-sys", ] [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "num-traits" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] [[package]] name = "num_threads" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opener" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "293c15678e37254c15bd2f092314abb4e51d7fdde05c2021279c12631b54f005" dependencies = [ "bstr", "winapi", ] [[package]] name = "openssl" version = "0.10.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9dfc0783362704e97ef3bd24261995a699468440099ef95d869b4d9732f829a" dependencies = [ "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", "once_cell", "openssl-macros", "openssl-sys", ] [[package]] name = "openssl-macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" version = "300.1.6+3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" dependencies = [ "cc", ] [[package]] name = "openssl-sys" version = "0.9.94" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f55da20b29f956fb01f0add8683eb26ee13ebe3ebd935e49898717c6b4b2830" dependencies = [ "cc", "libc", "openssl-src", "pkg-config", "vcpkg", ] [[package]] name = "ordered-float" version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" dependencies = [ "num-traits", ] [[package]] name = "orion" version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abdb10181903c8c4b016ba45d6d6d5af1a1e2a461aa4763a83b87f5df4695e5" dependencies = [ "fiat-crypto", "subtle", "zeroize", ] [[package]] name = "os_info" version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" dependencies = [ "log", "serde", "winapi", ] [[package]] name = "p384" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" dependencies = [ "ecdsa", "elliptic-curve", "primeorder", "sha2", ] [[package]] name = "parking_lot" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", "redox_syscall 0.4.1", "smallvec", "windows-targets", ] [[package]] name = "pasetors" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba765699a309908d55950919a3445e9491453e89b2587b1b2abe4143a48894c0" dependencies = [ "ct-codecs", "ed25519-compact", "getrandom", "orion", "p384", "rand_core", "regex", "serde", "serde_json", "sha2", "subtle", "time", "zeroize", ] [[package]] name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pem-rfc7468" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" dependencies = [ "base64ct", ] [[package]] name = "percent-encoding" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", ] [[package]] name = "pkg-config" version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty_assertions" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ "diff", "yansi", ] [[package]] name = "primeorder" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] [[package]] name = "prodash" version = "23.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9516b775656bc3e8985e19cd4b8c0c0de045095074e453d2c0a513b5f978392d" dependencies = [ "parking_lot", ] [[package]] name = "quote" version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "rand_xoshiro" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" dependencies = [ "rand_core", ] [[package]] name = "redox_syscall" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rfc6979" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ "hmac", "subtle", ] [[package]] name = "rustfix" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecd2853d9e26988467753bd9912c3a126f642d05d229a4b53f5752ee36c56481" dependencies = [ "anyhow", "log", "serde", "serde_json", ] [[package]] name = "rustix" version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", "windows-sys", ] [[package]] name = "rustversion" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "schannel" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ "windows-sys", ] [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", "generic-array", "pkcs8", "subtle", "zeroize", ] [[package]] name = "semver" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] [[package]] name = "serde" version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde-value" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" dependencies = [ "ordered-float", "serde", ] [[package]] name = "serde_derive" version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] [[package]] name = "serde_ignored" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80c31d5c53fd39f208e770f5a20a0bb214dee2a8d0d8adba18e19ad95a482ca5" dependencies = [ "serde", ] [[package]] name = "serde_json" version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sha1_smol" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "shell-escape" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" [[package]] name = "signal-hook" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-registry" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "signature" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ "digest", "rand_core", ] [[package]] name = "sized-chunks" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" dependencies = [ "bitmaps", "typenum", ] [[package]] name = "smallvec" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] [[package]] name = "spki" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", ] [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strip-ansi-escapes" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8" dependencies = [ "vte", ] [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", "syn 2.0.38", ] [[package]] name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "tabwriter" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08e1173ee641651a3095fe95d86ae314cd1f959888097debce3e0f9ca532eef1" dependencies = [ "unicode-width", ] [[package]] name = "tar" version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", ] [[package]] name = "tempfile" version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.4.1", "rustix", "windows-sys", ] [[package]] name = "termcolor" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" dependencies = [ "winapi-util", ] [[package]] name = "terminal_size" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ "rustix", "windows-sys", ] [[package]] name = "thiserror" version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] [[package]] name = "thread_local" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", "once_cell", ] [[package]] name = "time" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", "libc", "num_threads", "powerfmt", "serde", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] [[package]] name = "tinyvec" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "tracing" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] [[package]] name = "tracing-core" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-bom" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98e90c70c9f0d4d1ee6d0a7d04aa06cb9bbd53d8cfbdd62a0269a7c2eb640552" [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "url" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" dependencies = [ "arrayvec", "utf8parse", "vte_generate_state_changes", ] [[package]] name = "vte_generate_state_changes" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" dependencies = [ "proc-macro2", "quote", ] [[package]] name = "walkdir" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn 2.0.38", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ "windows-targets", ] [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "176b6138793677221d420fd2f0aeeced263f197688b36484660da767bca2fa32" dependencies = [ "memchr", ] [[package]] name = "yansi" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "686b7e407015242119c33dab17b8f61ba6843534de936d94368856528eae4dcc" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "020f3dfe25dfc38dfea49ce62d5d45ecdd7f0d8a724fa63eb36b6eba4ec76806" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] [[package]] name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" cargo-outdated-0.14.0/Cargo.toml0000644000000036050000000000100120220ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" rust-version = "1.70.0" name = "cargo-outdated" version = "0.14.0" authors = [ "Kevin K. ", "Frederick Z. ", "Ricky H. ", ] exclude = ["*.png"] description = "Cargo subcommand for displaying when dependencies are out of date" readme = "README.md" keywords = [ "cargo", "subcommand", "dependencies", "cargo-subcommand", "deps", ] categories = [ "development-tools", "development-tools::cargo-plugins", ] license = "MIT" repository = "https://github.com/kbknapp/cargo-outdated.git" [profile.release] lto = true [[bin]] name = "cargo-outdated" [dependencies.anyhow] version = "1.0" [dependencies.cargo] version = "0.72.0" [dependencies.clap] version = "4.1.4" features = ["derive"] [dependencies.env_logger] version = "0.10.0" [dependencies.git2-curl] version = "0.18.0" [dependencies.semver] version = "1.0.0" [dependencies.serde] version = "1.0.114" features = ["derive"] [dependencies.serde_json] version = "1.0.56" [dependencies.strum] version = "0.25.0" features = ["derive"] [dependencies.tabwriter] version = "1.2.1" [dependencies.tempfile] version = "3.6" [dependencies.termcolor] version = "1.0" optional = true [dependencies.toml] version = "0.7.4" [dev-dependencies.pretty_assertions] version = "1.2.0" [features] debug = ["termcolor"] default = [] vendored-openssl = ["cargo/vendored-openssl"] cargo-outdated-0.14.0/Cargo.toml.orig000064400000000000000000000022771046102023000155070ustar 00000000000000[package] name = "cargo-outdated" version = "0.14.0" authors = [ "Kevin K. ", "Frederick Z. ", "Ricky H. ", ] categories = ["development-tools", "development-tools::cargo-plugins"] edition = "2021" exclude = ["*.png"] keywords = [ "cargo", "subcommand", "dependencies", "cargo-subcommand", "deps", ] license = "MIT" readme = "README.md" repository = "https://github.com/kbknapp/cargo-outdated.git" description = "Cargo subcommand for displaying when dependencies are out of date" rust-version = "1.70.0" # MSRV [[bin]] name = "cargo-outdated" [dependencies] anyhow = "1.0" cargo = "0.72.0" env_logger = "0.10.0" git2-curl = "0.18.0" semver = "1.0.0" serde = {version="1.0.114", features = ["derive"]} serde_json = "1.0.56" tabwriter = "1.2.1" tempfile = "3.6" toml = "0.7.4" clap = { version = "4.1.4", features = ["derive"] } strum = { version = "0.25.0", features = ["derive"] } [dependencies.termcolor] optional = true version = "1.0" [features] debug = ["termcolor"] vendored-openssl = ["cargo/vendored-openssl"] default = [] [profile.release] lto = true [dev-dependencies] pretty_assertions = "1.2.0" cargo-outdated-0.14.0/LICENSE-MIT000064400000000000000000000020641046102023000142460ustar 00000000000000The MIT License (MIT) Copyright (c) 2015 Kevin K. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. cargo-outdated-0.14.0/README.md000064400000000000000000000165301046102023000140740ustar 00000000000000# cargo-outdated [![Join the chat at https://gitter.im/kbknapp/cargo-outdated](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kbknapp/cargo-outdated?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![crates.io](https://img.shields.io/crates/v/cargo-outdated.svg)](https://crates.io/crates/cargo-outdated) Linux: [![Build Status](https://travis-ci.org/kbknapp/cargo-outdated.svg?branch=master)](https://travis-ci.org/kbknapp/cargo-outdated) A cargo subcommand for displaying when Rust dependencies are out of date ## About `cargo-outdated` is for displaying when dependencies have newer versions available. ## How it works The functionality of `cargo-outdated` largely depends on the `cargo` builtin command `cargo update`. To retrieve the list of available SemVer compatible dependencies, `cargo-outdated` firstly creates a temporary workspace, then executes `cargo update` against it, finally compares the temporary dependency tree with the original one. Similarly, to check the latest dependencies, `cargo-outdated` replaces the SemVer requirements of *direct* dependencies with wildcards then goes through the same process. ## Demo Once installed (see below) running `cargo outdated` in a project directory looks like the following: ```text $ cargo outdated Name Project Compat Latest Kind Platform ---- ------- ------ ------ ---- -------- clap 2.20.0 2.20.5 2.26.0 Normal --- clap->bitflags 0.7.0 --- 0.9.1 Normal --- clap->libc 0.2.18 0.2.29 Removed Normal --- clap->term_size 0.2.1 0.2.3 0.3.0 Normal --- clap->vec_map 0.6.0 --- 0.8.0 Normal --- num_cpus 1.6.0 --- 1.6.2 Development --- num_cpus->libc 0.2.18 0.2.29 0.2.29 Normal --- pkg-config 0.3.8 0.3.9 0.3.9 Build --- term 0.4.5 --- 0.4.6 Normal --- term_size->libc 0.2.18 0.2.29 0.2.29 Normal cfg(not(target_os = "windows")) ``` ## Installing Packaging status The latest version of `cargo-outdated` can be installed or updated with `cargo install`: ```sh cargo install --locked cargo-outdated ``` or ```sh cargo install --locked --git https://github.com/kbknapp/cargo-outdated ``` ## Compiling Follow these instructions to compile `cargo-outdated`, then skip down to Installation. 1. Ensure you have current version of `cargo` and [Rust](https://www.rust-lang.org) installed 2. Clone the project `$ git clone https://github.com/kbknapp/cargo-outdated && cd cargo-outdated` 3. Build the project `$ cargo build --release` 4. Once complete, the binary will be located at `target/release/cargo-outdated` ## Installation and Usage All you need to do is place `cargo-outdated` somewhere in your `$PATH`. Then run `cargo outdated` anywhere in your project directory. For full details see below. ### Linux / OS X You have two options, place `cargo-outdated` into a directory that is already located in your `$PATH` variable (To see which directories those are, open a terminal and type `echo "${PATH//:/\n}"`, the quotation marks are important), or you can add a custom directory to your `$PATH` **Option 1** If you have write permission to a directory listed in your `$PATH` or you have root permission (or via `sudo`), simply copy the `cargo-outdated` to that directory `# sudo cp cargo-outdated /usr/local/bin` **Option 2** If you do not have root, `sudo`, or write permission to any directory already in `$PATH` you can create a directory inside your home directory, and add that. Many people use `$HOME/.bin` to keep it hidden (and not clutter your home directory), or `$HOME/bin` if you want it to be always visible. Here is an example to make the directory, add it to `$PATH`, and copy `cargo-outdated` there. Simply change `bin` to whatever you'd like to name the directory, and `.bashrc` to whatever your shell startup file is (usually `.bashrc`, `.bash_profile`, or `.zshrc`) ```sh mkdir ~/bin echo "export PATH=$PATH:$HOME/bin" >> ~/.bashrc cp cargo-outdated ~/bin source ~/.bashrc ``` ### MacOS This library depends on OpenSSL. On MacOS a newer version of OpenSSL than is installed by default is needed. This can be installed with Homebrew via `brew install openssl` or openssl can be vendored in with `--features vendored-openssl`. [Learn more about building OpenSSL here](https://docs.rs/openssl/0.10.30/openssl/#building), ### Windows On Windows 7/8 you can add directory to the `PATH` variable by opening a command line as an administrator and running ```sh setx path "%path%;C:\path\to\cargo-outdated\binary" ``` Otherwise, ensure you have the `cargo-outdated` binary in the directory which you operating in the command line from, because Windows automatically adds your current directory to PATH (i.e. if you open a command line to `C:\my_project\` to use `cargo-outdated` ensure `cargo-outdated.exe` is inside that directory as well). ### Options There are a few options for using `cargo-outdated` which should be somewhat self explanatory. ```text Displays information about project dependency versions USAGE: cargo outdated [options] Options: -a, --aggressive Ignores channels for latest updates -h, --help Prints help information --format FORMAT Output formatting [default: list] [values: list, json] -i, --ignore DEPENDENCIES Comma separated list of dependencies to not print in the output -x, --exclude DEPENDENCIES Comma separated list of dependencies to exclude from building -q, --quiet Suppresses warnings -R, --root-deps-only Only check root dependencies (Equivalent to --depth=1) -V, --version Prints version information -v, --verbose ... Use verbose output -w, --workspace Checks updates for all workspace members rather than only the root package --color COLOR Coloring: auto, always, never [default: auto] [values: auto, always, never] -d, --depth NUM How deep in the dependency chain to search (Defaults to all dependencies when omitted) --exit-code NUM The exit code to return on new versions found [default: 0] --features FEATURES Space-separated list of features -m, --manifest-path FILE Path to the Cargo.toml file to use (Defaults to Cargo.toml in project root) -p, --packages PKGS Packages to inspect for updates -r, --root ROOT Package to treat as the root package ``` ## Minimum Supported Rust Version (MSRV) The MSRV of this crate is what is required to _run_ `cargo outdated`, you may be able to compile `cargo outdated` itself on an earlier version of Rust. However, because `cargo outdated` uses `cargo` internally, it requires a specific minimum version to run successfully. The current MSRV can be found in the `Cargo.toml` under the `package.rust-version` field. ## License `cargo-outdated` is released under the terms of either the MIT or Apache 2.0 license. See the LICENSE-MIT or LICENSE-APACHE file for the details. cargo-outdated-0.14.0/bors.toml000064400000000000000000000003121046102023000144460ustar 00000000000000status = [ "CI", ] pr_status = [ "CI-PR", "Lint", ] timeout_sec = 7200 prerun_timeout_sec = 7200 delete_merged_branches = true cut_body_after = "" block_labels = ["M: blocked", "M: require changes"] cargo-outdated-0.14.0/justfile000064400000000000000000000041361046102023000143640ustar 00000000000000default: help # Get a list of recipes you can run @help: just --list # Install required tools for development setup: (_cargo-install 'cargo-nextest') _install-spell-check # Run all the checks required for CI to pass ci: spell-check lint test # Format the code fmt: cargo +nightly fmt --all # Check the formatting of the code but don't actually format it fmt-check: cargo +nightly fmt --all --check # Lint the code lint: fmt-check cargo clippy --all-targets -- -Dwarnings cargo clippy --all-targets --no-default-features -- -Dwarnings cargo clippy --all-targets --all-features -- -Dwarnings # Run benchmarks bench $RUSTFLAGS='-Ctarget-cpu=native': cargo bench # Run the test suite test TEST_RUNNER='cargo nextest run': setup {{ TEST_RUNNER }} {{ TEST_RUNNER }} --no-default-features {{ TEST_RUNNER }} --all-features # Check for typos spell-check: _install-spell-check @update-contributors: echo 'Removing old CONTRIBUTORS.md' mv CONTRIBUTORS.md CONTRIBUTORS.md.bak echo 'Downloading a list of new contributors' echo "the following is a list of contributors:" > CONTRIBUTORS.md echo "" >> CONTRIBUTORS.md echo "" >> CONTRIBUTORS.md githubcontrib --owner kbknapp --repo cargo-outdated --sha master --cols 6 --format md --showlogin true --sortBy contributions --sortOrder desc >> CONTRIBUTORS.md echo "" >> CONTRIBUTORS.md echo "" >> CONTRIBUTORS.md echo "This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list)" >> CONTRIBUTORS.md rm CONTRIBUTORS.md.bak run-test TEST: cargo test --test {{TEST}} debug TEST: cargo test --test {{TEST}} --features debug run-tests: cargo test --features "yaml unstable" clean: cargo clean ## # # Helpers ## [unix] _install-spell-check: #!/usr/bin/env bash set -euo pipefail if ! command -v typos 2>&1 >/dev/null ; then cargo install typos-cli --force fi [windows] _install-spell-check: #!powershell.exe $ret = Get-Command typos >$null 2>$null if (! $?) { cargo install typos-cli --force } _cargo-install TOOL: cargo install {{TOOL}} cargo-outdated-0.14.0/rust-toolchain.toml000064400000000000000000000001651046102023000164620ustar 00000000000000[toolchain] channel = "nightly" profile = "default" components = ["rust-src", "rustfmt", "clippy", "rust-analyzer"] cargo-outdated-0.14.0/rustfmt.toml000064400000000000000000000022301046102023000152060ustar 00000000000000# https://rust-lang.github.io/rustfmt/?version=master&search=#edition edition = "2021" # https://rust-lang.github.io/rustfmt/?version=master&search=#fn_single_line fn_single_line = true # https://rust-lang.github.io/rustfmt/?version=master&search=#format_code_in_doc_comments format_code_in_doc_comments = true # https://rust-lang.github.io/rustfmt/?version=master&search=#format_macro_matchers format_macro_matchers = true # https://rust-lang.github.io/rustfmt/?version=master&search=#imports_granularity imports_granularity = "Crate" # https://rust-lang.github.io/rustfmt/?version=master&search=#normalize_comments normalize_comments = true # https://rust-lang.github.io/rustfmt/?version=master&search=#reorder_impl_items reorder_impl_items = true # https://rust-lang.github.io/rustfmt/?version=master&search=#unstable_features unstable_features = true # https://rust-lang.github.io/rustfmt/?version=master&search=#use_field_init_shorthand use_field_init_shorthand = true # https://rust-lang.github.io/rustfmt/?version=master&search=#use_try_shorthand use_try_shorthand = true # https://rust-lang.github.io/rustfmt/?version=master&search=#wrap_comments wrap_comments = true cargo-outdated-0.14.0/src/cargo_ops/elaborate_workspace.rs000064400000000000000000000425641046102023000217500ustar 00000000000000use std::{ cell::RefCell, cmp::Ordering, collections::{BTreeSet, HashMap, HashSet, VecDeque}, io::{self, Write}, rc::Rc, }; use anyhow::anyhow; use cargo::{ core::{ compiler::{CompileKind, RustcTargetData}, dependency::DepKind, resolver::{ features::{ForceAllTargets, HasDevUnits}, CliFeatures, }, Dependency, FeatureValue, Package, PackageId, Workspace, }, ops::{self, Packages}, util::{interning::InternedString, CargoResult, Config}, }; use serde::{Deserialize, Serialize}; use tabwriter::TabWriter; use crate::error::OutdatedError; use super::{pkg_status::*, Options}; /// An elaborate workspace containing resolved dependencies and /// the update status of packages pub struct ElaborateWorkspace<'ela> { pub workspace: &'ela Workspace<'ela>, pub pkgs: HashMap, pub pkg_deps: HashMap>, /// Map of package status pub pkg_status: RefCell, PkgStatus>>, /// Whether using workspace mode pub workspace_mode: bool, } /// A struct to serialize to json with serde #[derive(Serialize, Deserialize)] pub struct CrateMetadata { pub crate_name: String, pub dependencies: BTreeSet, } #[derive(Serialize, Deserialize, Eq, PartialEq)] pub struct Metadata { pub name: String, pub project: String, pub compat: String, pub latest: String, pub kind: Option, pub platform: Option, } impl Ord for Metadata { fn cmp(&self, other: &Self) -> Ordering { self.name.cmp(&other.name) } } impl PartialOrd for Metadata { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl<'ela> ElaborateWorkspace<'ela> { /// Elaborate a `Workspace` pub fn from_workspace( workspace: &'ela Workspace<'_>, options: &Options, ) -> CargoResult> { // new in cargo 0.54.0 let flag_features: BTreeSet = options .features .iter() .map(|feature| FeatureValue::new(InternedString::from(feature))) .collect(); let specs = Packages::All.to_package_id_specs(workspace)?; let cli_features = CliFeatures { features: Rc::new(flag_features), all_features: options.all_features(), uses_default_features: options.no_default_features(), }; // The CompileKind, this has no target since it's the temp workspace // targets are blank since we don't need to fully build for the targets to get // the dependencies let compile_kind = CompileKind::from_requested_targets(workspace.config(), &[])?; let target_data = RustcTargetData::new(workspace, &compile_kind)?; let ws_resolve = ops::resolve_ws_with_opts( workspace, &target_data, &compile_kind, &cli_features, &specs, HasDevUnits::Yes, ForceAllTargets::Yes, )?; let packages = ws_resolve.pkg_set; let resolve = ws_resolve .workspace_resolve .expect("Error getting workspace resolved"); let mut pkgs = HashMap::new(); let mut pkg_deps = HashMap::new(); for pkg in packages.get_many(packages.package_ids())? { let pkg_id = pkg.package_id(); pkgs.insert(pkg_id, pkg.clone()); let deps = pkg.dependencies(); let mut dep_map = HashMap::new(); for dep_id in resolve.deps(pkg_id) { for d in deps { if d.matches_id(dep_id.0) { dep_map.insert(dep_id.0, d.clone()); break; } } } pkg_deps.insert(pkg_id, dep_map); } Ok(ElaborateWorkspace { workspace, pkgs, pkg_deps, pkg_status: RefCell::new(HashMap::new()), workspace_mode: options.workspace || workspace.current().is_err(), }) } /// Determine root package based on current workspace and CLI options pub fn determine_root(&self, options: &Options) -> CargoResult { if let Some(ref root_name) = options.root { if let Ok(workspace_root) = self.workspace.current() { if root_name == workspace_root.name().as_str() { Ok(workspace_root.package_id()) } else { for direct_dep in self.pkg_deps[&workspace_root.package_id()].keys() { if self.pkgs[direct_dep].name().as_str() == root_name { return Ok(*direct_dep); } } Err(anyhow!( "Root is neither the workspace root nor a direct dependency", )) } } else { Err(anyhow!( "--root is not allowed when running against a virtual manifest", )) } } else { Ok(self.workspace.current()?.package_id()) } } /// Find a member based on member name fn find_member(&self, member: PackageId) -> CargoResult { for m in self.workspace.members() { // members with the same name in a workspace is not allowed // even with different paths if member.name() == m.name() { return Ok(m.package_id()); } } Err(anyhow!("Workspace member {} not found", member.name())) } /// Find a contained package, which is a member or dependency inside the /// workspace fn find_contained_package(&self, name: &str) -> CargoResult { let root_path = self.workspace.root(); for (pkg_id, pkg) in &self.pkgs { if pkg.manifest_path().starts_with(root_path) && pkg.name().as_str() == name { return Ok(*pkg_id); } } Err(anyhow!("Cannot find package {} in workspace", name)) } /// Find a direct dependency of a contained package pub fn find_direct_dependency( &self, dependency_name: &str, dependent_package_name: &str, ) -> CargoResult { let dependent_package = self.find_contained_package(dependent_package_name)?; for direct_dep in self.pkg_deps[&dependent_package].keys() { if direct_dep.name().as_str() == dependency_name { return Ok(*direct_dep); } } for (pkg_id, pkg) in &self.pkgs { if pkg.name().as_str() == dependency_name { return Ok(*pkg_id); } } Err(anyhow!( "Direct dependency {} not found for package {}", dependency_name, dependent_package_name )) } /// Resolve compatible and latest status from the corresponding /// `ElaborateWorkspace`s pub fn resolve_status( &'ela self, compat: &ElaborateWorkspace<'_>, latest: &ElaborateWorkspace<'_>, options: &Options, _config: &Config, root: PackageId, skip: &HashSet, ) -> CargoResult<()> { self.pkg_status.borrow_mut().clear(); let (compat_root, latest_root) = if self.workspace_mode { (compat.find_member(root)?, latest.find_member(root)?) } else { ( compat.determine_root(options)?, latest.determine_root(options)?, ) }; let mut queue = VecDeque::new(); queue.push_back((vec![root], Some(compat_root), Some(latest_root))); while let Some((path, compat_pkg, latest_pkg)) = queue.pop_front() { let pkg = path.last().ok_or(OutdatedError::EmptyPath)?; let depth = path.len() as i32 - 1; // generate pkg_status let status = PkgStatus { compat: Status::from_versions(pkg.version(), compat_pkg.map(PackageId::version)), latest: Status::from_versions(pkg.version(), latest_pkg.map(PackageId::version)), }; debug!( _config, "STATUS => PKG: {}; PATH: {:?}; COMPAT: {:?}; LATEST: {:?}; STATUS: {:?}", pkg, path, compat_pkg, latest_pkg, status ); self.pkg_status.borrow_mut().insert(path.clone(), status); // next layer // this unwrap is safe since we first check if it is None :) if options.depth.is_none() || depth < options.depth.unwrap() { self.pkg_deps[pkg] .keys() .filter(|dep| !path.contains(dep)) .filter(|&dep| !skip.contains(dep.name().as_str())) .for_each(|&dep| { let name = dep.name(); let compat_pkg = compat_pkg .and_then(|id| compat.pkg_deps.get(&id)) .map(HashMap::keys) .and_then(|mut deps| deps.find(|dep| dep.name() == name)) .cloned(); let latest_pkg = latest_pkg .and_then(|id| latest.pkg_deps.get(&id)) .map(HashMap::keys) .and_then(|mut deps| deps.find(|dep| dep.name() == name)) .cloned(); let mut path = path.clone(); path.push(dep); queue.push_back((path, compat_pkg, latest_pkg)); }); } } Ok(()) } /// Print package status to `TabWriter` pub fn print_list( &'ela self, options: &Options, root: PackageId, preceding_line: bool, skip: &HashSet, ) -> CargoResult { let mut lines = BTreeSet::new(); let mut queue = VecDeque::new(); queue.push_back(vec![root]); while let Some(path) = queue.pop_front() { let pkg = path.last().ok_or(OutdatedError::EmptyPath)?; let name = pkg.name().to_string(); if options.ignore.contains(&name) { continue; } let depth = path.len() as i32 - 1; // generate lines let status = &self.pkg_status.borrow_mut()[&path]; if (status.compat.is_changed() || status.latest.is_changed()) && (options.packages.is_empty() || options.packages.contains(&name)) { // name version compatible latest kind platform let parent = path.get(path.len() - 2); if let Some(parent) = parent { let dependency = &self.pkg_deps[parent][pkg]; let label = if self.workspace_mode || parent == &self.workspace.current()?.package_id() { name } else { format!("{}->{}", self.pkgs[parent].name(), name) }; let line = format!( "{}\t{}\t{}\t{}\t{:?}\t{}\n", label, pkg.version(), status.compat.to_string(), status.latest.to_string(), dependency.kind(), dependency .platform() .map(ToString::to_string) .unwrap_or_else(|| "---".to_owned()) ); lines.insert(line); } else { let line = format!( "{}\t{}\t{}\t{}\t---\t---\n", name, pkg.version(), status.compat.to_string(), status.latest.to_string() ); lines.insert(line); } } // next layer // this unwrap is safe since we first check if it is None :) if options.depth.is_none() || depth < options.depth.unwrap() { self.pkg_deps[pkg] .keys() .filter(|dep| !path.contains(dep)) .filter(|&dep| { !self.workspace_mode || !self.workspace.members().any(|mem| &mem.package_id() == dep) }) .filter(|&dep| !skip.contains(dep.name().as_str())) .for_each(|&dep| { let mut path = path.clone(); path.push(dep); queue.push_back(path); }); } } if lines.is_empty() { if !self.workspace_mode { println!("All dependencies are up to date, yay!"); } } else { if preceding_line { println!(); } if self.workspace_mode { println!("{}\n================", root.name()); } let mut tw = TabWriter::new(vec![]); writeln!(&mut tw, "Name\tProject\tCompat\tLatest\tKind\tPlatform")?; writeln!(&mut tw, "----\t-------\t------\t------\t----\t--------")?; for line in &lines { write!(&mut tw, "{line}")?; } tw.flush()?; write!(io::stdout(), "{}", String::from_utf8(tw.into_inner()?)?)?; io::stdout().flush()?; } Ok(lines.len() as i32) } pub fn print_json( &'ela self, options: &Options, root: PackageId, skip: &HashSet, ) -> CargoResult { let mut crate_graph = CrateMetadata { crate_name: root.name().to_string(), dependencies: BTreeSet::new(), }; let mut queue = VecDeque::new(); queue.push_back(vec![root]); while let Some(path) = queue.pop_front() { let pkg = path.last().ok_or(OutdatedError::EmptyPath)?; let name = pkg.name().to_string(); if options.ignore.contains(&name) { continue; } let depth = path.len() as i32 - 1; // generate lines let status = &self.pkg_status.borrow_mut()[&path]; if (status.compat.is_changed() || status.latest.is_changed()) && (options.packages.is_empty() || options.packages.contains(&name)) { // name version compatible latest kind platform // safely get the parent index let parent = if path.len() > 1 { path.get(path.len() - 2) } else { None }; let line = if let Some(parent) = parent { let dependency = &self.pkg_deps[parent][pkg]; let label = if self.workspace_mode || parent == &self.workspace.current()?.package_id() { name } else { format!("{}->{}", self.pkgs[parent].name(), name) }; let dependency_type = match dependency.kind() { DepKind::Normal => "Normal", DepKind::Development => "Development", DepKind::Build => "Build", }; Metadata { name: label, project: pkg.version().to_string(), compat: status.compat.to_string(), latest: status.latest.to_string(), kind: Some(dependency_type.to_string()), platform: dependency.platform().map(|p| p.to_string()), } } else { Metadata { name, project: pkg.version().to_string(), compat: status.compat.to_string(), latest: status.latest.to_string(), kind: None, platform: None, } }; crate_graph.dependencies.insert(line); } // next layer // this unwrap is safe since we first check if it is None :) if options.depth.is_none() || depth < options.depth.unwrap() { self.pkg_deps[pkg] .keys() .filter(|dep| !path.contains(dep)) .filter(|dep| { !self.workspace_mode || !self .workspace .members() .any(|mem| mem.package_id() == **dep) }) .filter(|&dep| !skip.contains(dep.name().as_str())) .for_each(|dep| { let mut path = path.clone(); path.push(*dep); queue.push_back(path); }); } } println!("{}", serde_json::to_string(&crate_graph)?); Ok(crate_graph.dependencies.len() as i32) } } cargo-outdated-0.14.0/src/cargo_ops/mod.rs000064400000000000000000000025741046102023000165100ustar 00000000000000use super::Options; use toml::value::{Table, Value}; mod elaborate_workspace; mod pkg_status; mod temp_project; pub use self::{elaborate_workspace::ElaborateWorkspace, pkg_status::*, temp_project::TempProject}; /// A continent struct for quick parsing and manipulating manifest #[derive(Debug, serde::Serialize, serde::Deserialize)] struct Manifest { #[serde(rename = "cargo-features", skip_serializing_if = "Option::is_none")] pub cargo_features: Option, pub package: Table, #[serde(skip_serializing_if = "Option::is_none")] pub dependencies: Option, #[serde(rename = "dev-dependencies", skip_serializing_if = "Option::is_none")] pub dev_dependencies: Option
, #[serde(rename = "build-dependencies", skip_serializing_if = "Option::is_none")] pub build_dependencies: Option
, pub lib: Option
, pub bin: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub workspace: Option
, #[serde(skip_serializing_if = "Option::is_none")] pub target: Option
, pub features: Option, #[serde(rename = "patch", skip_serializing_if = "Option::is_none")] pub patch: Option
, } impl Manifest { pub fn name(&self) -> String { match self.package["name"] { Value::String(ref name) => name.clone(), _ => unreachable!(), } } } cargo-outdated-0.14.0/src/cargo_ops/pkg_status.rs000064400000000000000000000016501046102023000201070ustar 00000000000000use semver::Version; /// Enum which represents the update status of a package #[derive(Debug)] pub enum Status { Unchanged, Removed, Version(Version), } impl Status { pub fn from_versions(from: &Version, to: Option<&Version>) -> Status { if let Some(to) = to { if from == to { Status::Unchanged } else { Status::Version(to.clone()) } } else { Status::Removed } } pub fn is_changed(&self) -> bool { !matches!(*self, Status::Unchanged) } } impl ::std::string::ToString for Status { fn to_string(&self) -> String { match *self { Status::Unchanged => "---".to_owned(), Status::Removed => "Removed".to_owned(), Status::Version(ref v) => v.to_string(), } } } #[derive(Debug)] pub struct PkgStatus { pub compat: Status, pub latest: Status, } cargo-outdated-0.14.0/src/cargo_ops/temp_project.rs000064400000000000000000000777271046102023000204400ustar 00000000000000use std::{ cell::RefCell, collections::HashSet, env, fs::{self, File, OpenOptions}, io::{Read, Write}, path::{Path, PathBuf}, rc::Rc, }; use anyhow::{anyhow, Context}; use cargo::{ core::{Dependency, PackageId, QueryKind, Source, Summary, Verbosity, Workspace}, ops::{update_lockfile, UpdateOptions}, sources::config::SourceConfigMap, util::{network::PollExt, CargoResult, Config}, }; use semver::{Version, VersionReq}; use tempfile::{Builder, TempDir}; use toml::{value::Table, Value}; use super::{ElaborateWorkspace, Manifest}; use crate::{error::OutdatedError, Options}; /// A temporary project pub struct TempProject<'tmp> { pub workspace: Rc>>>, pub temp_dir: TempDir, manifest_paths: Vec, config: Config, relative_manifest: String, options: &'tmp Options, is_workspace_project: bool, } impl<'tmp> TempProject<'tmp> { /// Copy needed manifest and lock files from an existing workspace pub fn from_workspace( orig_workspace: &ElaborateWorkspace<'_>, orig_manifest: &str, options: &'tmp Options, ) -> CargoResult> { // e.g. /path/to/project let workspace_root = orig_workspace.workspace.root(); let workspace_root_str = workspace_root.to_string_lossy(); let temp_dir = Builder::new().prefix("cargo-outdated").tempdir()?; let manifest_paths = manifest_paths(orig_workspace)?; let mut tmp_manifest_paths = vec![]; for from in &manifest_paths { // e.g. /path/to/project/src/sub let mut from_dir = from.clone(); from_dir.pop(); let from_dir_str = from_dir.to_string_lossy(); // e.g. /tmp/cargo.xxx/src/sub let mut dest = if workspace_root_str.len() < from_dir_str.len() { temp_dir .path() .join(&from_dir_str[workspace_root_str.len() + 1..]) } else { temp_dir.path().to_owned() }; fs::create_dir_all(&dest)?; // e.g. /tmp/cargo.xxx/src/sub/Cargo.toml dest.push("Cargo.toml"); tmp_manifest_paths.push(dest.clone()); fs::copy(from, &dest)?; // removing default-run key if it exists to check dependencies let mut om: Manifest = { let mut buf = String::new(); let mut file = File::open(&dest)?; file.read_to_string(&mut buf)?; ::toml::from_str(&buf)? }; if om.package.contains_key("default-run") { om.package.remove("default-run"); let om_serialized = ::toml::to_string(&om).expect("Cannot format as toml file"); let mut cargo_toml = OpenOptions::new() .read(true) .write(true) .truncate(true) .open(&dest)?; write!(cargo_toml, "{om_serialized}")?; } // if build script is specified in the original Cargo.toml (from links or build) // remove it as we do not need it for checking dependencies if om.package.contains_key("links") { om.package.remove("links"); let om_serialized = ::toml::to_string(&om).expect("Cannot format as toml file"); let mut cargo_toml = OpenOptions::new() .read(true) .write(true) .truncate(true) .open(&dest)?; write!(cargo_toml, "{om_serialized}")?; } if om.package.contains_key("build") { om.package.remove("build"); let om_serialized = ::toml::to_string(&om).expect("Cannot format as toml file"); let mut cargo_toml = OpenOptions::new() .read(true) .write(true) .truncate(true) .open(&dest)?; write!(cargo_toml, "{om_serialized}")?; } let lockfile = from_dir.join("Cargo.lock"); if lockfile.is_file() { dest.pop(); dest.push("Cargo.lock"); fs::copy(lockfile, dest)?; } } // virtual root let mut virtual_root = workspace_root.join("Cargo.toml"); if !manifest_paths.contains(&virtual_root) && virtual_root.is_file() { fs::copy(&virtual_root, temp_dir.path().join("Cargo.toml"))?; virtual_root.pop(); virtual_root.push("Cargo.lock"); if virtual_root.is_file() { fs::copy(&virtual_root, temp_dir.path().join("Cargo.lock"))?; } } //.cargo/config.toml // this is the preferred way // https://doc.rust-lang.org/cargo/reference/config.html if workspace_root.join(".cargo/config.toml").is_file() { fs::create_dir_all(temp_dir.path().join(".cargo"))?; fs::copy( workspace_root.join(".cargo/config.toml"), temp_dir.path().join(".cargo/config.toml"), )?; } //.cargo/config // this is legacy support for config files without the `.toml` extension if workspace_root.join(".cargo/config").is_file() { fs::create_dir_all(temp_dir.path().join(".cargo"))?; fs::copy( workspace_root.join(".cargo/config"), temp_dir.path().join(".cargo/config"), )?; } let relative_manifest = String::from(&orig_manifest[workspace_root_str.len() + 1..]); let config = Self::generate_config(temp_dir.path(), &relative_manifest, options)?; Ok(TempProject { workspace: Rc::new(RefCell::new(None)), temp_dir, manifest_paths: tmp_manifest_paths, config, relative_manifest, options, is_workspace_project: orig_workspace.workspace_mode, }) } fn generate_config( root: &Path, relative_manifest: &str, options: &Options, ) -> CargoResult { let shell = ::cargo::core::Shell::new(); let cwd = env::current_dir() .with_context(|| "Cargo couldn't get the current directory of the process")?; let homedir = ::cargo::util::homedir(&cwd).ok_or_else(|| { anyhow!( "Cargo couldn't find your home directory. \ This probably means that $HOME was not set.", ) })?; let mut cwd = Path::new(root).join(relative_manifest); cwd.pop(); // Check if $CARGO_HOME is set before capturing the config environment // if it is, set it in the configure options let cargo_home_path = std::env::var_os("CARGO_HOME").map(std::path::PathBuf::from); let mut config = Config::new(shell, cwd, homedir); config.configure( 0, options.verbose == 0, Some(&options.color.to_string().to_ascii_lowercase()), options.frozen(), options.locked(), options.offline, &cargo_home_path, &[], &[], )?; Ok(config) } /// Run `cargo update` against the temporary project pub fn cargo_update(&self) -> CargoResult<()> { let update_opts = UpdateOptions { aggressive: false, precise: None, to_update: Vec::new(), config: &self.config, dry_run: false, workspace: self.is_workspace_project, }; update_lockfile( self.workspace .borrow() .as_ref() .ok_or(OutdatedError::NoWorkspace)?, &update_opts, )?; Ok(()) } fn write_manifest>(manifest: &Manifest, path: P) -> CargoResult<()> { let mut file = File::create(path)?; let serialized = ::toml::to_string(manifest).expect("Failed to serialized Cargo.toml"); write!(file, "{serialized}")?; Ok(()) } fn manipulate_dependencies(manifest: &mut Manifest, f: &mut F) -> CargoResult<()> where F: FnMut(&mut Table) -> CargoResult<()>, { if let Some(dep) = manifest.dependencies.as_mut() { f(dep)?; } if let Some(dep) = manifest.dev_dependencies.as_mut() { f(dep)?; } if let Some(dep) = manifest.build_dependencies.as_mut() { f(dep)?; } if let Some(t) = manifest.target.as_mut() { for (_key, target) in t.iter_mut() { if let Value::Table(ref mut target) = *target { for dependency_tables in &["dependencies", "dev-dependencies", "build-dependencies"] { if let Some(&mut Value::Table(ref mut dep_table)) = target.get_mut(*dependency_tables) { f(dep_table)?; } } } } } if let Some(t) = manifest.patch.as_mut() { for (_key, patch) in t.iter_mut() { if let Value::Table(ref mut patch) = *patch { f(patch)?; } } } Ok(()) } /// Write manifests with SemVer requirements pub fn write_manifest_semver>( &'tmp self, orig_root: P, tmp_root: P, workspace: &ElaborateWorkspace<'_>, skipped: &mut HashSet, ) -> CargoResult<()> { let bin = { let mut bin = Table::new(); bin.insert("name".to_owned(), Value::String("test".to_owned())); bin.insert("path".to_owned(), Value::String("test.rs".to_owned())); bin }; for manifest_path in &self.manifest_paths { let mut manifest: Manifest = { let mut buf = String::new(); let mut file = File::open(manifest_path)?; file.read_to_string(&mut buf)?; ::toml::from_str(&buf)? }; manifest.bin = Some(vec![bin.clone()]); // provide lib.path if let Some(lib) = manifest.lib.as_mut() { lib.insert("path".to_owned(), Value::String("test_lib.rs".to_owned())); } Self::manipulate_dependencies(&mut manifest, &mut |deps| { Self::replace_path_with_absolute( self, deps, orig_root.as_ref(), tmp_root.as_ref(), manifest_path, skipped, ) })?; let package_name = manifest.name(); let features = manifest.features.clone(); Self::manipulate_dependencies(&mut manifest, &mut |deps| { self.update_version_and_feature(deps, &features, workspace, &package_name, false) })?; Self::write_manifest(&manifest, manifest_path)?; } let root_manifest = self.temp_dir.path().join(&self.relative_manifest); *self.workspace.borrow_mut() = Some(Workspace::new(Path::new(&root_manifest), &self.config)?); Ok(()) } /// Write manifests with wildcard requirements pub fn write_manifest_latest>( &'tmp self, orig_root: P, tmp_root: P, workspace: &ElaborateWorkspace<'_>, skipped: &mut HashSet, ) -> CargoResult<()> { let bin = { let mut bin = Table::new(); bin.insert("name".to_owned(), Value::String("test".to_owned())); bin.insert("path".to_owned(), Value::String("test.rs".to_owned())); bin }; for manifest_path in &self.manifest_paths { let mut manifest: Manifest = { let mut buf = String::new(); let mut file = File::open(manifest_path)?; file.read_to_string(&mut buf)?; ::toml::from_str(&buf)? }; manifest.bin = Some(vec![bin.clone()]); // provide lib.path if let Some(lib) = manifest.lib.as_mut() { lib.insert("path".to_owned(), Value::String("test_lib.rs".to_owned())); } Self::manipulate_dependencies(&mut manifest, &mut |deps| { Self::replace_path_with_absolute( self, deps, orig_root.as_ref(), tmp_root.as_ref(), manifest_path, skipped, ) })?; let package_name = manifest.name(); let features = manifest.features.clone(); Self::manipulate_dependencies(&mut manifest, &mut |deps| { self.update_version_and_feature(deps, &features, workspace, &package_name, true) })?; Self::write_manifest(&manifest, manifest_path)?; } let root_manifest = self.temp_dir.path().join(&self.relative_manifest); *self.workspace.borrow_mut() = Some(Workspace::new(Path::new(&root_manifest), &self.config)?); Ok(()) } fn find_update( &self, name: &str, dependent_package_name: &str, requirement: Option<&str>, workspace: &ElaborateWorkspace<'_>, find_latest: bool, ) -> CargoResult { let package_id = workspace.find_direct_dependency(name, dependent_package_name)?; let version = package_id.version(); let source_id = package_id.source_id().with_precise(None); let query_result = { let ws_config = workspace.workspace.config(); let _lock = ws_config.acquire_package_cache_lock()?; let source_config = SourceConfigMap::new(ws_config)?; let mut source = source_config.load(source_id, &HashSet::new())?; if !source_id.is_crates_io() { source.invalidate_cache(); } source.block_until_ready()?; let dependency = Dependency::parse(name, None, source_id)?; let mut query_result = source .query_vec(&dependency, QueryKind::Exact)? .expect("Source should be ready"); query_result.sort_by(|a, b| b.version().cmp(a.version())); query_result }; let version_req = match requirement { Some(requirement) => Some(VersionReq::parse(requirement)?), None => None, }; let latest_result = query_result.iter().find(|summary| { if summary.version() < version { false } else if version_req.is_none() { true } else if find_latest { // this unwrap is safe since we check if `version_req` is `None` before this // (which is only `None` if `requirement` is `None`) self.options.aggressive || valid_latest_version(requirement.unwrap(), summary.version()) } else { // this unwrap is safe since we check if `version_req` is `None` before this version_req.as_ref().unwrap().matches(summary.version()) } }); let latest_summary = match latest_result { Some(summary) => summary, None => { // If the version_req cannot be found use the version // this happens when we use a git repository as a dependency, without specifying // the version in Cargo.toml, preventing us from needing an unwrap below in the // warn let ver_req = match version_req { Some(v_r) => format!("{v_r}"), None => format!("{version}"), }; // this should be safe it should only fail if we cannot get // access to write to the terminal // if this fails it's a cargo (as a dependency) issue self.warn(format!( "cannot compare {} crate version found in toml {} with crates.io latest {}", name, ver_req, query_result[0].version() ))?; // this returns the latest version &query_result[0] } }; Ok(latest_summary.clone()) } fn feature_includes(&self, name: &str, optional: bool, features_table: &Option) -> bool { if self.options.all_features() { return true; } if !optional && self.options.features.contains(&String::from("default")) { return true; } let features_table = match *features_table { Some(Value::Table(ref features_table)) => features_table, _ => return false, }; let mut to_resolve: Vec<&str> = self .options .features .iter() .filter(|f| !f.is_empty()) .map(String::as_str) .collect(); let mut visited: HashSet<&str> = HashSet::new(); while let Some(feature) = to_resolve.pop() { if feature == name { return true; } if visited.contains(feature) { continue; } visited.insert(feature); if features_table.contains_key(feature) { let specified_features = match features_table.get(feature) { None => panic!("Feature {feature} does not exist"), Some(Value::Array(ref specified_features)) => specified_features, _ => panic!("Feature {feature} is not mapped to an array"), }; for spec in specified_features { if let Value::String(ref spec) = *spec { to_resolve.push(spec.as_str()); } } } } false } fn update_version_and_feature( &self, dependencies: &mut Table, features: &Option, workspace: &ElaborateWorkspace<'_>, package_name: &str, version_to_latest: bool, ) -> CargoResult<()> { let dep_keys: Vec<_> = dependencies.keys().cloned().collect(); for dep_key in dep_keys { // this, by brute force, allows a user to exclude a dependency by not writing // it to the temp project's manifest // In short this allows cargo to build the package with semver minor // compatibilities issues https://github.com/rust-lang/cargo/issues/6584 // https://github.com/kbknapp/cargo-outdated/issues/230 if self.options.exclude.contains(&dep_key) { continue; } let original = dependencies .get(&dep_key) .cloned() .ok_or(OutdatedError::NoMatchingDependency)?; match original { Value::String(requirement) => { let name = dep_key; if version_to_latest { match self.find_update( &name, package_name, Some(requirement.as_str()), workspace, version_to_latest, ) { Result::Ok(val) => dependencies .insert(name.clone(), Value::String(val.version().to_string())), Result::Err(_err) => { eprintln!( "Updates to dependency {} could not be found", name.clone() ); None } }; } } Value::Table(ref t) => { let mut name = match t.get("package") { Some(Value::String(ref s)) => s, Some(_) => panic!("'package' of dependency {dep_key} is not a string"), None => &dep_key, }; let mut orig_name = ""; if t.contains_key("package") { orig_name = name; name = &dep_key; } if !(version_to_latest || t.contains_key("features")) { continue; } let optional = t .get("optional") .map(|optional| { if let Value::Boolean(optional) = *optional { optional } else { false } }) .unwrap_or(false); if !self.feature_includes(name, optional, features) { continue; } let mut replaced = t.clone(); let requirement = match t.get("version") { Some(Value::String(ref requirement)) => Some(requirement.as_str()), Some(_) => panic!("Version of {name} is not a string"), _ => None, }; let r_summary = self.find_update( if orig_name.is_empty() { name } else { orig_name }, package_name, requirement, workspace, version_to_latest, ); let summary = match r_summary { Result::Ok(val) => val, Result::Err(_) => { eprintln!("Update for {} could not be found!", name.clone()); return Ok(()); } }; if version_to_latest && t.contains_key("version") { replaced.insert( "version".to_owned(), Value::String(summary.version().to_string()), ); } if replaced.contains_key("features") { let features = match replaced.get("features") { Some(Value::Array(ref features)) => features .iter() .filter(|&feature| { let feature = match *feature { Value::String(ref feature) => feature, _ => panic!( "Features section of {name} is not an array of strings" ), }; let retained = features_and_options(&summary).contains(feature.as_str()); // this unwrap should be safe it should only fail if we cannot // get access to write to // the terminal // if this fails it's a cargo (as a dependency) issue if !retained { self.warn(format!( "Feature {} of package {} \ has been obsolete in version {}", feature, name, summary.version() )) .unwrap(); } retained }) .cloned() .collect::>(), _ => panic!("Features section of {name} is not an array"), }; replaced.insert("features".to_owned(), Value::Array(features)); } dependencies.insert(name.clone(), Value::Table(replaced)); } _ => panic!("Dependency spec is neither a string nor a table {dep_key}"), } } Ok(()) } fn replace_path_with_absolute( &self, dependencies: &mut Table, orig_root: &Path, tmp_root: &Path, tmp_manifest: &Path, skipped: &mut HashSet, ) -> CargoResult<()> { let dep_names: Vec<_> = dependencies.keys().cloned().collect(); for name in dep_names { let original = dependencies .get(&name) .cloned() .ok_or(OutdatedError::NoMatchingDependency)?; match original { Value::Table(ref t) if t.contains_key("path") => { if let Value::String(ref orig_path) = t["path"] { let orig_path = Path::new(orig_path); if orig_path.is_relative() { let relative = { let delimiter: &[_] = &['/', '\\']; let relative = &tmp_manifest.to_string_lossy() [tmp_root.to_string_lossy().len()..]; let mut relative = PathBuf::from(relative.trim_start_matches(delimiter)); relative.pop(); relative.join(orig_path) }; if !tmp_root.join(&relative).join("Cargo.toml").exists() { if self.options.root_deps_only { dependencies.remove(&name); if t.contains_key("package") { if let Value::String(ref package_name) = t["package"] { skipped.insert(package_name.to_string()); } else { skipped.insert(name); } } else { skipped.insert(name); } } else { let mut replaced = t.clone(); replaced.insert( "path".to_owned(), Value::String( fs::canonicalize(orig_root.join(relative))? .to_string_lossy() .to_string(), ), ); dependencies.insert(name, Value::Table(replaced)); } } } } } _ => {} } } Ok(()) } fn warn(&self, message: T) -> CargoResult<()> { let original_verbosity = self.config.shell().verbosity(); self.config.shell().set_verbosity(if self.options.quiet { Verbosity::Quiet } else { Verbosity::Normal }); self.config.shell().warn(message)?; self.config.shell().set_verbosity(original_verbosity); Ok(()) } } /// Features and optional dependencies of a Summary fn features_and_options(summary: &Summary) -> HashSet<&str> { let mut result: HashSet<&str> = summary.features().keys().map(|s| s.as_str()).collect(); summary .dependencies() .iter() .filter(|d| d.is_optional()) .map(Dependency::package_name) .for_each(|d| { result.insert(d.as_str()); }); result } /// Paths of all manifest files in current workspace fn manifest_paths(elab: &ElaborateWorkspace<'_>) -> CargoResult> { let mut visited: HashSet = HashSet::new(); let mut manifest_paths = vec![]; fn manifest_paths_recursive( pkg_id: PackageId, elab: &ElaborateWorkspace<'_>, workspace_path: &str, visited: &mut HashSet, manifest_paths: &mut Vec, ) -> CargoResult<()> { if visited.contains(&pkg_id) { return Ok(()); } visited.insert(pkg_id); let pkg = &elab.pkgs[&pkg_id]; let pkg_path = pkg.root().to_string_lossy(); // Checking if there's a CARGO_HOME set and that it is not an empty string let cargo_home_path = match std::env::var_os("CARGO_HOME") { Some(path) if !path.is_empty() => Some( path.into_string() .expect("Error getting string from OsString"), ), _ => None, }; // If there is a CARGO_HOME make sure we do not crawl the registry for more // Cargo.toml files Otherwise add all Cargo.toml files to the manifest // paths if pkg.root().starts_with(PathBuf::from(workspace_path)) && (cargo_home_path.is_none() || !pkg_path .starts_with(&cargo_home_path.expect("Error extracting CARGO_HOME string"))) { manifest_paths.push(pkg.manifest_path().to_owned()); } for &dep in elab.pkg_deps[&pkg_id].keys() { manifest_paths_recursive(dep, elab, workspace_path, visited, manifest_paths)?; } Ok(()) } // executed against a virtual manifest let workspace_path = elab.workspace.root().to_string_lossy(); // if cargo workspace is not explicitly used, the package itself would be a // member for member in elab.workspace.members() { let root_pkg_id = member.package_id(); manifest_paths_recursive( root_pkg_id, elab, &workspace_path, &mut visited, &mut manifest_paths, )?; } Ok(manifest_paths) } fn valid_latest_version(mut requirement: &str, version: &Version) -> bool { match (requirement.contains('-'), !version.pre.is_empty()) { // if user was on a stable channel, it's unlikely for him to update to an unstable one (false, true) => false, // both are stable, leave for further filters // ...or... // user was on an unstable one, newer stable ones are still candidates (false, false) | (true, false) => true, // both are unstable, must be in the same channel (true, true) => { requirement = requirement.trim_start_matches(&['=', ' ', '~', '^'][..]); let requirement_version = Version::parse(requirement) .expect("Error could not parse requirement into a semantic version"); let requirement_channel = requirement_version.pre.split('.').next().unwrap(); let requirement_channel_numeric = requirement_channel.bytes().all(|b| b.is_ascii_digit()); let version_channel = version.pre.split('.').next().unwrap(); let version_channel_numeric = version_channel.bytes().all(|b| b.is_ascii_digit()); match (requirement_channel_numeric, version_channel_numeric) { (false, false) => requirement_channel == version_channel, (true, true) => true, _ => false, } } } } cargo-outdated-0.14.0/src/cli.rs000064400000000000000000000250441046102023000145210ustar 00000000000000use std::ffi::OsString; use clap::{error::Result, ArgAction, Parser, Subcommand, ValueEnum}; #[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Default, strum::Display)] #[strum(ascii_case_insensitive, serialize_all = "lowercase")] pub enum Format { #[default] List, Json, } #[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Default, strum::Display)] #[strum(ascii_case_insensitive, serialize_all = "lowercase")] pub enum Color { #[default] Auto, Never, Always, } #[derive(Parser, Debug)] #[clap(bin_name = "cargo")] struct Cargo { #[command(subcommand)] command: CargoCommand, } #[derive(Subcommand, Debug)] enum CargoCommand { Outdated(Options), } /// Options from CLI arguments #[derive(Parser, Debug, PartialEq, Default)] #[command(version)] #[command(about = "Displays information about project dependency versions")] pub struct Options { /// Output formatting #[arg(long, value_enum, ignore_case = true, default_value_t = Default::default())] pub format: Format, /// Output coloring #[arg(long, value_enum, ignore_case = true, default_value_t = Default::default())] pub color: Color, /// Space-separated list of features #[arg(long, use_value_delimiter = true)] pub features: Vec, /// Dependencies to not print in the output (comma separated or one per /// '--ignore' argument) #[arg(short, long, value_name = "DEPENDENCIES", use_value_delimiter = true)] pub ignore: Vec, /// Dependencies to exclude from building (comma separated or one per /// '--exclude' argument) #[arg( short = 'x', long, value_name = "DEPENDENCIES", use_value_delimiter = true )] pub exclude: Vec, /// Path to the Cargo.toml file to use (Default to Cargo.toml in project /// root) #[arg(short, long, value_name = "PATH")] pub manifest_path: Option, /// Suppresses warnings #[arg(short, long)] pub quiet: bool, /// Use verbose output #[arg(short, long, action = ArgAction::Count)] pub verbose: u8, /// The exit code to return on new versions found #[arg(long, value_name = "NUM", default_value_t = Default::default())] pub exit_code: i32, /// Packages to inspect for updates (comma separated or one per --packages' /// argument) #[arg(short, long, value_name = "PKGS", use_value_delimiter = true)] pub packages: Vec, /// Package to treat as the root package #[arg(short, long)] pub root: Option, /// How deep in the dependency chain to search (Defaults to all /// dependencies) #[arg(short, long, value_name = "NUM")] pub depth: Option, /// Only check root dependencies (Equivalent to --depth=1) #[arg(short = 'R', long)] pub root_deps_only: bool, /// Checks updates for all workspace members rather than only the root /// package #[arg(short, long)] pub workspace: bool, /// Ignores channels for latest updates #[arg(short, long)] pub aggressive: bool, /// Ignore relative dependencies external to workspace and check root /// dependencies only #[arg(short = 'e', long = "ignore-external-rel")] pub workspace_only: bool, /// Run without accessing the network (useful for testing w/ local /// registries) #[arg(short, long)] pub offline: bool, } impl Options { pub fn all_features(&self) -> bool { self.features.is_empty() } pub fn no_default_features(&self) -> bool { !(self.features.is_empty() || self.features.contains(&"default".to_owned())) } pub fn locked(&self) -> bool { false } pub fn frozen(&self) -> bool { false } } pub fn parse() -> Options { match try_parse_from(std::env::args_os()) { Ok(opts) => opts, Err(clap_err) => clap_err.exit(), } } fn split_elem_by_ascii_whitespace(slice: &[String]) -> Vec { slice .iter() .flat_map(|x| x.split_ascii_whitespace()) .map(ToOwned::to_owned) .collect() } fn try_parse_from(args: impl IntoIterator + Clone>) -> Result { let CargoCommand::Outdated(mut opts) = Cargo::try_parse_from(args)?.command; opts.exclude = split_elem_by_ascii_whitespace(&opts.exclude); opts.features = split_elem_by_ascii_whitespace(&opts.features); opts.ignore = split_elem_by_ascii_whitespace(&opts.ignore); opts.packages = split_elem_by_ascii_whitespace(&opts.packages); if opts.root_deps_only { opts.depth = Some(1); } if opts.workspace_only { opts.depth = Some(1); opts.root_deps_only = true; } Ok(opts) } #[cfg(test)] mod test { use super::*; use pretty_assertions::assert_eq; fn options(args: &[&str]) -> Options { options_fail(args).unwrap() } fn options_fail(args: &[&str]) -> clap::error::Result { let mut argv = vec!["cargo", "outdated"]; argv.extend(args); try_parse_from(argv) } #[test] fn default() { let opts = options(&[]); assert_eq!(Options::default(), opts) } #[test] fn root_only() { let opts = options(&["--root-deps-only"]); assert_eq!( Options { depth: Some(1), root_deps_only: true, ..Options::default() }, opts ) } #[test] fn workspace_only() { let opts = options(&["--ignore-external-rel"]); assert_eq!( Options { workspace_only: true, depth: Some(1), root_deps_only: true, ..Options::default() }, opts ) } #[test] fn features() { let opts1 = options(&["--features=one,two,three"]); let opts2 = options(&["--features", "one,two,three"]); let opts3 = options(&["--features", "one two three"]); let opts4 = options(&[ "--features", "one", "--features", "two", "--features", "three", ]); let opts5 = options(&["--features", "one", "--features", "two,three"]); let correct = Options { features: vec!["one".into(), "two".into(), "three".into()], ..Options::default() }; assert_eq!(correct, opts1); assert_eq!(correct, opts2); assert_eq!(correct, opts3); assert_eq!(correct, opts4); assert_eq!(correct, opts5); } #[test] fn features_fail() { let res = options_fail(&["--features", "one", "two"]); assert!(res.is_err()); assert_eq!( res.as_ref().unwrap_err().kind(), clap::error::ErrorKind::UnknownArgument, ); } #[test] fn exclude() { let opts1 = options(&["--exclude=one,two,three"]); let opts2 = options(&["--exclude", "one,two,three"]); let opts3 = options(&["--exclude", "one two three"]); let opts4 = options(&["--exclude", "one", "--exclude", "two", "--exclude", "three"]); let opts5 = options(&["--exclude", "one", "--exclude", "two,three"]); let correct = Options { exclude: vec!["one".into(), "two".into(), "three".into()], ..Options::default() }; assert_eq!(correct, opts1); assert_eq!(correct, opts2); assert_eq!(correct, opts3); assert_eq!(correct, opts4); assert_eq!(correct, opts5); } #[test] fn exclude_fail() { let res = options_fail(&["--exclude", "one", "two"]); assert!(res.is_err()); assert_eq!( res.as_ref().unwrap_err().kind(), clap::error::ErrorKind::UnknownArgument, ); } #[test] fn ignore() { let opts1 = options(&["--ignore=one,two,three"]); let opts2 = options(&["--ignore", "one,two,three"]); let opts3 = options(&["--ignore", "one two three"]); let opts4 = options(&["--ignore", "one", "--ignore", "two", "--ignore", "three"]); let opts5 = options(&["--ignore", "one", "--ignore", "two,three"]); let correct = Options { ignore: vec!["one".into(), "two".into(), "three".into()], ..Options::default() }; assert_eq!(correct, opts1); assert_eq!(correct, opts2); assert_eq!(correct, opts3); assert_eq!(correct, opts4); assert_eq!(correct, opts5); } #[test] fn ignore_fail() { let res = options_fail(&["--ignore", "one", "two"]); assert!(res.is_err()); assert_eq!( res.as_ref().unwrap_err().kind(), clap::error::ErrorKind::UnknownArgument, ); } #[test] fn verbose() { let opts1 = options(&["--verbose", "--verbose", "--verbose"]); let correct = Options { verbose: 3, ..Options::default() }; assert_eq!(correct, opts1); } #[test] fn packages() { let opts1 = options(&["--packages", "one,two"]); let opts2 = options(&["--packages", "one two"]); let opts3 = options(&["--packages", "one", "--packages", "two"]); let correct = Options { packages: vec!["one".into(), "two".into()], ..Options::default() }; assert_eq!(correct, opts1); assert_eq!(correct, opts2); assert_eq!(correct, opts3); } #[test] fn packages_fail() { let res = options_fail(&["--packages", "one", "two"]); assert!(res.is_err()); assert_eq!( res.as_ref().unwrap_err().kind(), clap::error::ErrorKind::UnknownArgument, ); } #[test] fn format_case() { let opts1 = options(&["--format", "JsOn"]); let correct = Options { format: Format::Json, ..Options::default() }; assert_eq!(correct, opts1); } #[test] fn format_unknown() { let res = options_fail(&["--format", "foobar"]); assert!(res.is_err()); assert_eq!( res.as_ref().unwrap_err().kind(), clap::error::ErrorKind::InvalidValue, ); } #[test] fn color_case() { let opts1 = options(&["--color", "NeVeR"]); let correct = Options { color: Color::Never, ..Options::default() }; assert_eq!(correct, opts1); } #[test] fn color_unknown() { let res = options_fail(&["--color", "foobar"]); assert!(res.is_err()); assert_eq!( res.as_ref().unwrap_err().kind(), clap::error::ErrorKind::InvalidValue, ); } } cargo-outdated-0.14.0/src/error.rs000064400000000000000000000017471046102023000151070ustar 00000000000000use std::{error::Error, fmt}; #[derive(Debug)] pub enum OutdatedError { CannotElaborateWorkspace, EmptyPath, NoWorkspace, NoMatchingDependency, } impl fmt::Display for OutdatedError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result { match self { OutdatedError::CannotElaborateWorkspace => write!(f, "Cannot elaborate the workspace"), OutdatedError::EmptyPath => write!(f, "Empty path cannot get last"), OutdatedError::NoWorkspace => write!(f, "No workspace"), OutdatedError::NoMatchingDependency => write!(f, "No matching dependency"), } } } impl std::error::Error for OutdatedError { fn source(&self) -> Option<&(dyn Error + 'static)> { match self { OutdatedError::CannotElaborateWorkspace => None, OutdatedError::EmptyPath => None, OutdatedError::NoWorkspace => None, OutdatedError::NoMatchingDependency => None, } } } cargo-outdated-0.14.0/src/macros.rs000064400000000000000000000012341046102023000152310ustar 00000000000000macro_rules! verbose { ($config:expr, $status:expr, $message:expr) => { $config .shell() .verbose(|sh| -> CargoResult<()> { sh.status($status, $message) })? }; } #[cfg(feature = "debug")] macro_rules! debug { ($config: expr, $message: expr) => ( $config.shell().status_with_color("DEBUG", $message, ::termcolor::Color::White)? ); ($config: expr, $($arg: tt)*) => ( $config.shell().status_with_color("DEBUG", format!($($arg)*), ::termcolor::Color::White)? ); } #[cfg(not(feature = "debug"))] macro_rules! debug { ($config:expr, $message:expr) => {}; ($config:expr, $($arg:tt)*) => {}; } cargo-outdated-0.14.0/src/main.rs000064400000000000000000000155421046102023000147000ustar 00000000000000//! cargo-outdated //! A subcommand for cargo that checks if your dependencies are up-to-date #![deny(bare_trait_objects, anonymous_parameters, elided_lifetimes_in_paths)] #[macro_use] mod macros; mod cargo_ops; mod cli; mod error; use std::collections::HashSet; use cargo::{ core::{shell::Verbosity, Workspace}, ops::needs_custom_http_transport, util::{important_paths::find_root_manifest_for_wd, CargoResult, CliError, Config}, }; use crate::{ cargo_ops::{ElaborateWorkspace, TempProject}, cli::{Format, Options}, error::OutdatedError, }; fn main() { env_logger::init(); let options = cli::parse(); let mut config = match Config::default() { Ok(cfg) => cfg, Err(e) => { let mut shell = cargo::core::Shell::new(); cargo::exit_with_error(e.into(), &mut shell) } }; // Only use a custom transport if any HTTP options are specified, // such as proxies or custom certificate authorities. The custom // transport, however, is not as well battle-tested. // See cargo-outdated issue #197 and // https://github.com/rust-lang/cargo/blob/master/src/bin/cargo/main.rs#L181 // fn init_git_transports() if let Ok(true) = needs_custom_http_transport(&config) { if let Ok(handle) = cargo::ops::http_handle(&config) { unsafe { git2_curl::register(handle); } } } let exit_code = options.exit_code; let result = execute(options, &mut config); match result { Err(e) => { config.shell().set_verbosity(Verbosity::Normal); let cli_error = CliError::new(e, 1); cargo::exit_with_error(cli_error, &mut config.shell()) } Ok(i) => { if i > 0 { std::process::exit(exit_code); } else { std::process::exit(0); } } } } /// executes the cargo-outdate command with the cargo configuration and options pub fn execute(options: Options, config: &mut Config) -> CargoResult { // Check if $CARGO_HOME is set before capturing the config environment // if it is, set it in the configure options let cargo_home_path = std::env::var_os("CARGO_HOME").map(std::path::PathBuf::from); // enabling nightly features config.nightly_features_allowed = true; config.configure( options .verbose .try_into() .expect("--verbose used too many times"), options.quiet, Some(&options.color.to_string().to_ascii_lowercase()), options.frozen(), options.locked(), options.offline, &cargo_home_path, &[], &[], )?; debug!(config, format!("options: {options:?}")); verbose!(config, "Parsing...", "current workspace"); // the Cargo.toml that we are actually working on let mut manifest_abspath: std::path::PathBuf; let curr_manifest = if let Some(ref manifest_path) = options.manifest_path { manifest_abspath = manifest_path.into(); if manifest_abspath.is_relative() { verbose!(config, "Resolving...", "absolute path of manifest"); manifest_abspath = std::env::current_dir()?.join(manifest_path); } manifest_abspath } else { find_root_manifest_for_wd(config.cwd())? }; let curr_workspace = Workspace::new(&curr_manifest, config)?; verbose!(config, "Resolving...", "current workspace"); if options.verbose == 0 { config.shell().set_verbosity(Verbosity::Quiet); } let ela_curr = ElaborateWorkspace::from_workspace(&curr_workspace, &options)?; if options.verbose > 0 { config.shell().set_verbosity(Verbosity::Verbose); } else { config.shell().set_verbosity(Verbosity::Normal); } verbose!(config, "Parsing...", "compat workspace"); let mut skipped = HashSet::new(); let compat_proj = TempProject::from_workspace(&ela_curr, &curr_manifest.to_string_lossy(), &options)?; compat_proj.write_manifest_semver( curr_workspace.root(), compat_proj.temp_dir.path(), &ela_curr, &mut skipped, )?; verbose!(config, "Updating...", "compat workspace"); compat_proj.cargo_update()?; verbose!(config, "Resolving...", "compat workspace"); let compat_workspace = compat_proj.workspace.borrow(); let ela_compat = ElaborateWorkspace::from_workspace( compat_workspace .as_ref() .ok_or(OutdatedError::CannotElaborateWorkspace)?, &options, )?; verbose!(config, "Parsing...", "latest workspace"); let latest_proj = TempProject::from_workspace(&ela_curr, &curr_manifest.to_string_lossy(), &options)?; latest_proj.write_manifest_latest( curr_workspace.root(), compat_proj.temp_dir.path(), &ela_curr, &mut skipped, )?; verbose!(config, "Updating...", "latest workspace"); latest_proj.cargo_update()?; verbose!(config, "Resolving...", "latest workspace"); let latest_workspace = latest_proj.workspace.borrow(); let ela_latest = ElaborateWorkspace::from_workspace( latest_workspace .as_ref() .ok_or(OutdatedError::CannotElaborateWorkspace)?, &options, )?; if ela_curr.workspace_mode { let mut sum = 0; match options.format { Format::List => verbose!(config, "Printing...", "Package status in list format"), Format::Json => verbose!(config, "Printing...", "Package status in json format"), } for member in ela_curr.workspace.members() { ela_curr.resolve_status( &ela_compat, &ela_latest, &options, config, member.package_id(), &skipped, )?; match options.format { Format::List => { sum += ela_curr.print_list(&options, member.package_id(), sum > 0, &skipped)?; } Format::Json => { sum += ela_curr.print_json(&options, member.package_id(), &skipped)?; } } } if sum == 0 && matches!(options.format, Format::List) { println!("All dependencies are up to date, yay!"); } Ok(sum) } else { verbose!(config, "Resolving...", "package status"); let root = ela_curr.determine_root(&options)?; ela_curr.resolve_status(&ela_compat, &ela_latest, &options, config, root, &skipped)?; verbose!(config, "Printing...", "list format"); let mut count = 0; match options.format { Format::List => { count = ela_curr.print_list(&options, root, false, &skipped)?; } Format::Json => { ela_curr.print_json(&options, root, &skipped)?; } } Ok(count) } }