cargo-list 0.33.6

List and update installed crates
Documentation
# Usage

## CLI

```text
$ cargo list -h
List and update installed crates

Usage: cargo list [OPTIONS] [PATTERN]...

Arguments:
  [PATTERN]...  List/update crates matching given pattern(s)

Options:
  -f <FORMAT>     Output format [default: md] [possible values: json,
                  json-pretty, md, rust, rust-pretty]
  -k <KIND>       Kind(s) [default: external] [possible values: local, git,
                  external]
  -a              All kinds
  -o, --outdated  Hide up-to-date crates
  -I              Ignore version requirements
  -R              Consider a crate to be outdated if compiled with a Rust
                  version different than the active toolchain
  -u, --update    Update outdated crates
  -n, --dry-run   Dry run
  -c <PATH>       Cargo install metadata file (falls back to
                  `~/.cargo/.crates2.json` if `$CARGO_HOME` is unset) [default:
                  $CARGO_HOME/.crates2.json]
  -r, --readme    Print readme
  -h, --help      Print help (see more with '--help')
  -V, --version   Print version
```

```text
$ cargo list -V
cargo-list 0.33.6
```

### List installed external crates

```bash
cargo list
```

### List installed external crates containing `cargo`

```bash
cargo list cargo
```

### List installed external crates beginning with `cargo`

```bash
cargo list ^cargo
```

### List installed external crates ending with `list`

```bash
cargo list 'list$'
```

### List installed external crates matching `cargo-list`

```bash
cargo list '^cargo-list$'
```

### List outdated external crates

```bash
cargo list -o
```

### Update outdated external crates

```bash
cargo list -ou
```

### List the `cargo install` commands to update outdated external crates

```bash
cargo list -oun
```

### List outdated external crates (ignore version requirements)

```bash
cargo list -oI
```

### List outdated external crates (include crates compiled with old Rust)

```bash
cargo list -oR
```

### Update outdated external crates (ignore version requirements and include crate compiled with old Rust)

```bash
cargo list -oIRu
```

### List crates installed via git

```bash
cargo list -k git
```

### List installed local crates

```bash
cargo list -k local
```

### List installed local, git, and external crates

```bash
cargo list -k local -k git -k external
```

or shorter:

```bash
cargo list -a
```

### List outdated crates installed via git

```bash
cargo list -k git -o
```

### List outdated installed local crates

```bash
cargo list -k local -o
```

### List outdated installed local, git, and external crates

```bash
cargo list -k local -k git -k external -o
```

or shorter:

```bash
cargo list -ao
```

### Dump installed external crates to JSON

```bash
cargo list -f json
```

### Dump installed external crates to pretty JSON

```bash
cargo list -f json-pretty
```

### Dump installed external crates to Rust

```bash
cargo list -f rust
```

### Dump installed external crates to pretty Rust

```bash
cargo list -f rust-pretty
```

### Dump outdated installed external crates to JSON

```bash
cargo list -f json -o
```

### Dump outdated installed external crates to pretty JSON

```bash
cargo list -f json-pretty -o
```

### Dump outdated installed external crates to Rust

```bash
cargo list -f rust -o
```

### Dump outdated installed external crates to pretty Rust

```bash
cargo list -f rust-pretty -o
```

## Library

```rust
use cargo_list::{expanduser, Crates};
use rayon::prelude::*;
use std::collections::BTreeMap;

let path = expanduser("~/.cargo/.crates2.json");

match Crates::from(&path) {
    Ok(installed) => {
        if installed.is_empty() {
            println!("No crates installed!");
        } else {
            let all = installed.crates();
            let outdated = all
                .par_iter()
                .filter_map(|(&name, &c)| c.outdated.then_some((name, c)))
                .collect::<BTreeMap<_, _>>();

            if outdated.is_empty() {
                // List all crates in CSV
                println!("Name,Installed");
                for (name, c) in &all {
                    println!("{name},{}", c.installed);
                }
            } else {
                // List outdated crates in CSV
                println!("Name,Installed,Available");
                for (name, c) in &outdated {
                    println!("{name},{},{}", c.installed, c.available);
                }

                // Print the `cargo install` commands for outdated crates
                // for command in outdated
                //     .iter()
                //     .map(|(_name, c)| c.update_command().join(" "))
                // {
                //     println!("{command}");
                // }

                // Update outdated crates
                // outdated.iter().for_each(|(_name, c)| c.update());
            }
        }
    }
    Err(e) => {
        eprintln!("Error: {e}");
    }
}
```

If you want to include just a subset of the crates, instead of `Crates::from(&path)`, use
`Crates::from_include(&path, &patterns)` where `patterns` is a slice of `&str` [`regex`] patterns.

[`regex`]: https://crates.io/crates/regex


# Changelog

Please read the [`CHANGELOG.md`] in the [repository].

[`CHANGELOG.md`]: https://github.com/qtfkwk/cargo-list/blob/main/CHANGELOG.md
[repository]: https://github.com/qtfkwk/cargo-list