ci-cargo

CI for Rust code.
git clone https://git.philomathiclife.com/repos/ci-cargo
Log | Files | Refs | README

README.md (27789B)


      1 CI app for Rust code
      2 ====================
      3 
      4 [<img alt="git" src="https://git.philomathiclife.com/badges/ci-cargo.svg" height="20">](https://git.philomathiclife.com/ci-cargo/log.html)
      5 [<img alt="crates.io" src="https://img.shields.io/crates/v/ci-cargo.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/ci-cargo)
      6 
      7 `ci-cargo` is a CLI application that runs [`cargo`](https://doc.rust-lang.org/cargo/index.html) with `check`,
      8 `clippy`, and `test` for all possible combinations of features defined in `Cargo.toml`.
      9 
     10 The toolchain(s) used depend on platform support for [`rustup`](https://rust-lang.github.io/rustup/), the existence
     11 of `rust-toolchain.toml`, the defined MSRV (if there is one), and if `--default-toolchain`, `--skip-msrv`, or
     12 `--rustup-home` were passed. Specifically `cargo +stable` will be used if all of the following conditions are met:
     13 
     14 * `--default-toolchain` was not passed.
     15 * `rust-toolchain.toml` does not exist in the package directory nor its ancestor directories.
     16 * `--rustup-home` was not passed for platforms that don't support `rustup`.
     17 
     18 If the above are not met, `cargo` will be used instead. `cargo +<MSRV>` will also be used if all of the following
     19 conditions are met:
     20 
     21 * `--skip-msrv` was not passed.
     22 * Package has an MSRV defined via `rust-version` that is less than the `stable` or not equivalent to the default
     23   toolchain used.
     24 * `--rustup-home` was passed or the platform supports `rustup`.
     25 
     26 `ci-cargo` avoids superfluous combinations of features. For example if feature `foo` depends on feature `bar` and
     27 `bar` depends on feature `fizz`; then no combination of features that contain `foo` and `bar`, `foo` and `fizz`, or
     28 `bar` and `fizz` will be tested.
     29 
     30 When a command errors, `ci-cargo` will terminate; upon termination (successful or not), `ci-cargo` will write all
     31 _unique_ messages that were written to `stderr` to `stderr` followed by the offending command in case of an error.
     32 
     33 ## Why is this useful?
     34 
     35 The number of possible configurations grows exponentially based on the number of features in `Cargo.toml`. This can
     36 easily cause a crate to not be tested with certain combinations of features. Instead of manually invoking `cargo`
     37 with each possible combination of features, this handles it automatically. Additionally it automatically ensures the
     38 build works on both the stable or default toolchain _and_ the stated MSRV (if one is defined).
     39 
     40 ## Usage
     41 
     42 `ci-cargo [COMMAND] [OPTIONS] [COMMAND] [OPTIONS] [COMMAND] [OPTIONS]`
     43 
     44 ## Commands
     45 
     46 * `check`: `cargo check`.
     47 * `clippy`: `cargo clippy`.
     48 * `help`: Prints help message.
     49 * `test`: `cargo test`.
     50 * `version`: Prints version info.
     51 
     52 ## Global Options
     53 
     54 * `--allow-implied-features`: Features implied by optional dependencies are allowed; by default features must be
     55   explicitly defined or an error will occur (e.g., `foo = ["dep:bar"]`).
     56 * `--cargo-home <PATH>`: Sets the storage directory used by `cargo`.
     57 * `--cargo-path <PATH>`: Sets the directory to search for `cargo`. Defaults to `cargo`.
     58 * `--color`: `--color always` is passed to the above commands; otherwise without this option, `--color never` is
     59   passed.
     60 * `--default-toolchain`: `cargo` is used instead of `cargo +stable`.
     61 * `--dir <PATH>`: Changes the working directory to the passed path before executing. Without this, the current
     62   directory and all ancestor directories are searched for `Cargo.toml` before changing the working directory to its
     63   location.
     64 * `--ignore-compile-errors`: [`compile_error`](https://doc.rust-lang.org/core/macro.compile_error.html)s are ignored
     65    and don't lead to termination.
     66 * `--ignore-features <FEATURES>`: Any combination of features that depend on any of the features in the
     67   comma-separated list will be ignored. The features must be unique and represent valid features in the package. The
     68   features can contain implied features so long as `--allow-implied-features` is also passed. An empty value
     69   represents the empty set of features (i.e., `--no-default-features`). For example `--ignore-features`, will error
     70   since no features were passed. `--ignore-features ''` will ignore the empty set of features. `--ignore-features a,`
     71   will ignore the empty set of features and any combination of features that depend on feature `a`.
     72 * `--ignore-msrv`: `--ignore-rust-version` is passed to the commands for the default toolchain.
     73 * `--progress`: Writes the current progress to `stdout`.
     74 * `--rustup-home <PATH>`: Sets the storage directory used by `rustup`.
     75 * `--skip-msrv`: `cargo +<MSRV>` is not used.
     76 * `--summary`: Writes the toolchain(s) used and the combinations of features run on to `stdout` on success.
     77 
     78 ## Check Options
     79 
     80 * `--all-targets`: `--all-targets` is passed.
     81 * `--benches`: `--benches` is passed.
     82 * `--bins`: `--bins` is passed.
     83 * `--examples`: `--examples` is passed.
     84 * `--lib`: `--lib` is passed.
     85 * `--tests`: `--tests` is passed.
     86 
     87 ## Clippy Options
     88 
     89 * `--all-targets`: `--all-targets` is passed.
     90 * `--benches`: `--benches` is passed.
     91 * `--bins`: `--bins` is passed.
     92 * `--deny-warnings`: `-- -Dwarnings` is passed.
     93 * `--examples`: `--examples` is passed.
     94 * `--lib`: `--lib` is passed.
     95 * `--tests`: `--tests` is passed.
     96 
     97 ## Test Options
     98 
     99 * `--all-targets`: `cargo test --all-targets` _and_ `cargo test --doc` are run. Note if one wants _just_ the
    100   behavior of `cargo test --all-targets`, then one must pass `cargo test --benches --bins --examples --lib --tests`
    101   instead.
    102 * `--benches`: `--benches` is passed.
    103 * `--bins`: `--bins` is passed.
    104 * `--doc`: `--doc` is passed.
    105 * `--examples`: `--examples` is passed.
    106 * `--ignored`: `-- --ignored` is passed.
    107 * `--include-ignored`: `-- --include-ignored` is passed.
    108 * `--lib`: `--lib` is passed.
    109 * `--tests`: `--tests` is passed.
    110 
    111 The following conditions must be met:
    112 
    113 * `help` and `version` mustn't be combined with other commands or options.
    114 * Any unique and non-empty combination of `check`, `clippy`, and `test` can be used.
    115 * Command-specific options must be unique for a given command.
    116 * Global options are allowed after any command but must be unique.
    117 * Command-specific options must follow the command.
    118 * `test` options `--ignored` and `--include-ignored` are mutually exclusive.
    119 * `--all-targets` mustn't be combined with other targets (e.g., `--lib`).
    120 * `test` option `--doc` mustn't be combined with other targets (e.g., `--tests`).
    121 * `--ignore-msrv` is not allowed if the stable toolchain is used.
    122 
    123 ## `ci-cargo` in action
    124 
    125 ```bash
    126 [zack@laptop example]$ cat Cargo.toml
    127 [package]
    128 authors = ["Johann Carl Friedrich Gauß <gauss@invalid.com>"]
    129 categories = ["mathematics"]
    130 description = "Example."
    131 documentation = "https://example.com/"
    132 edition = "2024"
    133 keywords = ["example"]
    134 license = "MIT OR Apache-2.0"
    135 name = "example"
    136 readme = "README.md"
    137 repository = "https://example.com/"
    138 rust-version = "1.90.0"
    139 version = "0.1.0"
    140 
    141 [lints.rust]
    142 ambiguous_negative_literals = { level = "deny", priority = -1 }
    143 closure_returning_async_block = { level = "deny", priority = -1 }
    144 deprecated_safe = { level = "deny", priority = -1 }
    145 deref_into_dyn_supertrait = { level = "deny", priority = -1 }
    146 ffi_unwind_calls = { level = "deny", priority = -1 }
    147 future_incompatible = { level = "deny", priority = -1 }
    148 impl_trait_redundant_captures = { level = "deny", priority = -1 }
    149 keyword_idents = { level = "deny", priority = -1 }
    150 let_underscore = { level = "deny", priority = -1 }
    151 linker_messages = { level = "deny", priority = -1 }
    152 macro_use_extern_crate = { level = "deny", priority = -1 }
    153 meta_variable_misuse = { level = "deny", priority = -1 }
    154 missing_copy_implementations = { level = "deny", priority = -1 }
    155 missing_debug_implementations = { level = "deny", priority = -1 }
    156 missing_docs = { level = "deny", priority = -1 }
    157 non_ascii_idents = { level = "deny", priority = -1 }
    158 nonstandard_style = { level = "deny", priority = -1 }
    159 redundant_imports = { level = "deny", priority = -1 }
    160 redundant_lifetimes = { level = "deny", priority = -1 }
    161 refining_impl_trait = { level = "deny", priority = -1 }
    162 rust_2018_compatibility = { level = "deny", priority = -1 }
    163 rust_2018_idioms = { level = "deny", priority = -1 }
    164 rust_2021_compatibility = { level = "deny", priority = -1 }
    165 rust_2024_compatibility = { level = "deny", priority = -1 }
    166 single_use_lifetimes = { level = "deny", priority = -1 }
    167 trivial_casts = { level = "deny", priority = -1 }
    168 trivial_numeric_casts = { level = "deny", priority = -1 }
    169 unit_bindings = { level = "deny", priority = -1 }
    170 unknown-or-malformed-diagnostic-attributes = { level = "deny", priority = -1 }
    171 unnameable_types = { level = "deny", priority = -1 }
    172 unreachable_pub = { level = "deny", priority = -1 }
    173 unsafe_code = { level = "deny", priority = -1 }
    174 unstable_features = { level = "deny", priority = -1 }
    175 unused = { level = "deny", priority = -1 }
    176 unused_crate_dependencies = { level = "deny", priority = -1 }
    177 unused_import_braces = { level = "deny", priority = -1 }
    178 unused_lifetimes = { level = "deny", priority = -1 }
    179 unused_qualifications = { level = "deny", priority = -1 }
    180 unused_results = { level = "deny", priority = -1 }
    181 variant_size_differences = { level = "deny", priority = -1 }
    182 warnings = { level = "deny", priority = -1 }
    183 
    184 [lints.clippy]
    185 cargo = { level = "deny", priority = -1 }
    186 complexity = { level = "deny", priority = -1 }
    187 correctness = { level = "deny", priority = -1 }
    188 nursery = { level = "deny", priority = -1 }
    189 pedantic = { level = "deny", priority = -1 }
    190 perf = { level = "deny", priority = -1 }
    191 restriction = { level = "deny", priority = -1 }
    192 style = { level = "deny", priority = -1 }
    193 suspicious = { level = "deny", priority = -1 }
    194 blanket_clippy_restriction_lints = "allow"
    195 implicit_return = "allow"
    196 
    197 [dependencies]
    198 buzz = { version = "0.1.0", default-features = false, optional = true }
    199 
    200 [features]
    201 buzz = ["dep:buzz"]
    202 default = ["foo"]
    203 foo = []
    204 bar = ["fizz"]
    205 fizz = []
    206 [zack@laptop example]$ ci-cargo clippy --all-targets test --all-targets --include-ignored --progress --summary
    207 Package: example. Toolchain (1/2): cargo +stable. Features (1/32, 5 skipped): buzz,fizz,foo. Command (1/3): clippy. Time running: 0 s.
    208 Package: example. Toolchain (1/2): cargo +stable. Features (1/32, 5 skipped): buzz,fizz,foo. Command (2/3): test --all-targets. Time running: 0 s.
    209 Package: example. Toolchain (1/2): cargo +stable. Features (1/32, 5 skipped): buzz,fizz,foo. Command (3/3): test --doc. Time running: 0 s.
    210 Package: example. Toolchain (1/2): cargo +stable. Features (2/32, 6 skipped): fizz,foo. Command (1/3): clippy. Time running: 0 s.
    211 Package: example. Toolchain (1/2): cargo +stable. Features (2/32, 6 skipped): fizz,foo. Command (2/3): test --all-targets. Time running: 0 s.
    212 Package: example. Toolchain (1/2): cargo +stable. Features (2/32, 6 skipped): fizz,foo. Command (3/3): test --doc. Time running: 0 s.
    213 Package: example. Toolchain (1/2): cargo +stable. Features (3/32, 10 skipped): bar,buzz,foo. Command (1/3): clippy. Time running: 0 s.
    214 Package: example. Toolchain (1/2): cargo +stable. Features (3/32, 10 skipped): bar,buzz,foo. Command (2/3): test --all-targets. Time running: 0 s.
    215 Package: example. Toolchain (1/2): cargo +stable. Features (3/32, 10 skipped): bar,buzz,foo. Command (3/3): test --doc. Time running: 0 s.
    216 Package: example. Toolchain (1/2): cargo +stable. Features (4/32, 10 skipped): buzz,foo. Command (1/3): clippy. Time running: 0 s.
    217 Package: example. Toolchain (1/2): cargo +stable. Features (4/32, 10 skipped): buzz,foo. Command (2/3): test --all-targets. Time running: 0 s.
    218 Package: example. Toolchain (1/2): cargo +stable. Features (4/32, 10 skipped): buzz,foo. Command (3/3): test --doc. Time running: 0 s.
    219 Package: example. Toolchain (1/2): cargo +stable. Features (5/32, 10 skipped): bar,foo. Command (1/3): clippy. Time running: 0 s.
    220 Package: example. Toolchain (1/2): cargo +stable. Features (5/32, 10 skipped): bar,foo. Command (2/3): test --all-targets. Time running: 1 s.
    221 Package: example. Toolchain (1/2): cargo +stable. Features (5/32, 10 skipped): bar,foo. Command (3/3): test --doc. Time running: 1 s.
    222 Package: example. Toolchain (1/2): cargo +stable. Features (6/32, 10 skipped): foo. Command (1/3): clippy. Time running: 1 s.
    223 Package: example. Toolchain (1/2): cargo +stable. Features (6/32, 10 skipped): foo. Command (2/3): test --all-targets. Time running: 1 s.
    224 Package: example. Toolchain (1/2): cargo +stable. Features (6/32, 10 skipped): foo. Command (3/3): test --doc. Time running: 1 s.
    225 Package: example. Toolchain (1/2): cargo +stable. Features (7/32, 11 skipped): buzz,default,fizz. Command (1/3): clippy. Time running: 1 s.
    226 Package: example. Toolchain (1/2): cargo +stable. Features (7/32, 11 skipped): buzz,default,fizz. Command (2/3): test --all-targets. Time running: 1 s.
    227 Package: example. Toolchain (1/2): cargo +stable. Features (7/32, 11 skipped): buzz,default,fizz. Command (3/3): test --doc. Time running: 1 s.
    228 Package: example. Toolchain (1/2): cargo +stable. Features (8/32, 12 skipped): default,fizz. Command (1/3): clippy. Time running: 1 s.
    229 Package: example. Toolchain (1/2): cargo +stable. Features (8/32, 12 skipped): default,fizz. Command (2/3): test --all-targets. Time running: 1 s.
    230 Package: example. Toolchain (1/2): cargo +stable. Features (8/32, 12 skipped): default,fizz. Command (3/3): test --doc. Time running: 1 s.
    231 Package: example. Toolchain (1/2): cargo +stable. Features (9/32, 13 skipped): buzz,fizz. Command (1/3): clippy. Time running: 1 s.
    232 Package: example. Toolchain (1/2): cargo +stable. Features (9/32, 13 skipped): buzz,fizz. Command (2/3): test --all-targets. Time running: 1 s.
    233 Package: example. Toolchain (1/2): cargo +stable. Features (9/32, 13 skipped): buzz,fizz. Command (3/3): test --doc. Time running: 1 s.
    234 Package: example. Toolchain (1/2): cargo +stable. Features (10/32, 14 skipped): fizz. Command (1/3): clippy. Time running: 1 s.
    235 Package: example. Toolchain (1/2): cargo +stable. Features (10/32, 14 skipped): fizz. Command (2/3): test --all-targets. Time running: 2 s.
    236 Package: example. Toolchain (1/2): cargo +stable. Features (10/32, 14 skipped): fizz. Command (3/3): test --doc. Time running: 2 s.
    237 Package: example. Toolchain (1/2): cargo +stable. Features (11/32, 14 skipped): bar,buzz,default. Command (1/3): clippy. Time running: 2 s.
    238 Package: example. Toolchain (1/2): cargo +stable. Features (11/32, 14 skipped): bar,buzz,default. Command (2/3): test --all-targets. Time running: 2 s.
    239 Package: example. Toolchain (1/2): cargo +stable. Features (11/32, 14 skipped): bar,buzz,default. Command (3/3): test --doc. Time running: 2 s.
    240 Package: example. Toolchain (1/2): cargo +stable. Features (12/32, 14 skipped): buzz,default. Command (1/3): clippy. Time running: 2 s.
    241 Package: example. Toolchain (1/2): cargo +stable. Features (12/32, 14 skipped): buzz,default. Command (2/3): test --all-targets. Time running: 2 s.
    242 Package: example. Toolchain (1/2): cargo +stable. Features (12/32, 14 skipped): buzz,default. Command (3/3): test --doc. Time running: 2 s.
    243 Package: example. Toolchain (1/2): cargo +stable. Features (13/32, 14 skipped): bar,default. Command (1/3): clippy. Time running: 2 s.
    244 Package: example. Toolchain (1/2): cargo +stable. Features (13/32, 14 skipped): bar,default. Command (2/3): test --all-targets. Time running: 2 s.
    245 Package: example. Toolchain (1/2): cargo +stable. Features (13/32, 14 skipped): bar,default. Command (3/3): test --doc. Time running: 2 s.
    246 Package: example. Toolchain (1/2): cargo +stable. Features (14/32, 14 skipped): default. Command (1/3): clippy. Time running: 2 s.
    247 Package: example. Toolchain (1/2): cargo +stable. Features (14/32, 14 skipped): default. Command (2/3): test --all-targets. Time running: 2 s.
    248 Package: example. Toolchain (1/2): cargo +stable. Features (14/32, 14 skipped): default. Command (3/3): test --doc. Time running: 3 s.
    249 Package: example. Toolchain (1/2): cargo +stable. Features (15/32, 14 skipped): bar,buzz. Command (1/3): clippy. Time running: 3 s.
    250 Package: example. Toolchain (1/2): cargo +stable. Features (15/32, 14 skipped): bar,buzz. Command (2/3): test --all-targets. Time running: 3 s.
    251 Package: example. Toolchain (1/2): cargo +stable. Features (15/32, 14 skipped): bar,buzz. Command (3/3): test --doc. Time running: 3 s.
    252 Package: example. Toolchain (1/2): cargo +stable. Features (16/32, 14 skipped): buzz. Command (1/3): clippy. Time running: 3 s.
    253 Package: example. Toolchain (1/2): cargo +stable. Features (16/32, 14 skipped): buzz. Command (2/3): test --all-targets. Time running: 3 s.
    254 Package: example. Toolchain (1/2): cargo +stable. Features (16/32, 14 skipped): buzz. Command (3/3): test --doc. Time running: 3 s.
    255 Package: example. Toolchain (1/2): cargo +stable. Features (17/32, 14 skipped): bar. Command (1/3): clippy. Time running: 3 s.
    256 Package: example. Toolchain (1/2): cargo +stable. Features (17/32, 14 skipped): bar. Command (2/3): test --all-targets. Time running: 3 s.
    257 Package: example. Toolchain (1/2): cargo +stable. Features (17/32, 14 skipped): bar. Command (3/3): test --doc. Time running: 3 s.
    258 Package: example. Toolchain (1/2): cargo +stable. Features (18/32, 14 skipped): <none>. Command (1/3): clippy. Time running: 3 s.
    259 Package: example. Toolchain (1/2): cargo +stable. Features (18/32, 14 skipped): <none>. Command (2/3): test --all-targets. Time running: 3 s.
    260 Package: example. Toolchain (1/2): cargo +stable. Features (18/32, 14 skipped): <none>. Command (3/3): test --doc. Time running: 3 s.
    261 Package: example. Toolchain (2/2): cargo +1.90.0. Features (1/32, 5 skipped): buzz,fizz,foo. Command (1/3): clippy. Time running: 3 s.
    262 Package: example. Toolchain (2/2): cargo +1.90.0. Features (1/32, 5 skipped): buzz,fizz,foo. Command (2/3): test --all-targets. Time running: 4 s.
    263 Package: example. Toolchain (2/2): cargo +1.90.0. Features (1/32, 5 skipped): buzz,fizz,foo. Command (3/3): test --doc. Time running: 4 s.
    264 Package: example. Toolchain (2/2): cargo +1.90.0. Features (2/32, 6 skipped): fizz,foo. Command (1/3): clippy. Time running: 4 s.
    265 Package: example. Toolchain (2/2): cargo +1.90.0. Features (2/32, 6 skipped): fizz,foo. Command (2/3): test --all-targets. Time running: 4 s.
    266 Package: example. Toolchain (2/2): cargo +1.90.0. Features (2/32, 6 skipped): fizz,foo. Command (3/3): test --doc. Time running: 4 s.
    267 Package: example. Toolchain (2/2): cargo +1.90.0. Features (3/32, 10 skipped): bar,buzz,foo. Command (1/3): clippy. Time running: 4 s.
    268 Package: example. Toolchain (2/2): cargo +1.90.0. Features (3/32, 10 skipped): bar,buzz,foo. Command (2/3): test --all-targets. Time running: 4 s.
    269 Package: example. Toolchain (2/2): cargo +1.90.0. Features (3/32, 10 skipped): bar,buzz,foo. Command (3/3): test --doc. Time running: 4 s.
    270 Package: example. Toolchain (2/2): cargo +1.90.0. Features (4/32, 10 skipped): buzz,foo. Command (1/3): clippy. Time running: 4 s.
    271 Package: example. Toolchain (2/2): cargo +1.90.0. Features (4/32, 10 skipped): buzz,foo. Command (2/3): test --all-targets. Time running: 4 s.
    272 Package: example. Toolchain (2/2): cargo +1.90.0. Features (4/32, 10 skipped): buzz,foo. Command (3/3): test --doc. Time running: 4 s.
    273 Package: example. Toolchain (2/2): cargo +1.90.0. Features (5/32, 10 skipped): bar,foo. Command (1/3): clippy. Time running: 4 s.
    274 Package: example. Toolchain (2/2): cargo +1.90.0. Features (5/32, 10 skipped): bar,foo. Command (2/3): test --all-targets. Time running: 5 s.
    275 Package: example. Toolchain (2/2): cargo +1.90.0. Features (5/32, 10 skipped): bar,foo. Command (3/3): test --doc. Time running: 5 s.
    276 Package: example. Toolchain (2/2): cargo +1.90.0. Features (6/32, 10 skipped): foo. Command (1/3): clippy. Time running: 5 s.
    277 Package: example. Toolchain (2/2): cargo +1.90.0. Features (6/32, 10 skipped): foo. Command (2/3): test --all-targets. Time running: 5 s.
    278 Package: example. Toolchain (2/2): cargo +1.90.0. Features (6/32, 10 skipped): foo. Command (3/3): test --doc. Time running: 5 s.
    279 Package: example. Toolchain (2/2): cargo +1.90.0. Features (7/32, 11 skipped): buzz,default,fizz. Command (1/3): clippy. Time running: 5 s.
    280 Package: example. Toolchain (2/2): cargo +1.90.0. Features (7/32, 11 skipped): buzz,default,fizz. Command (2/3): test --all-targets. Time running: 5 s.
    281 Package: example. Toolchain (2/2): cargo +1.90.0. Features (7/32, 11 skipped): buzz,default,fizz. Command (3/3): test --doc. Time running: 5 s.
    282 Package: example. Toolchain (2/2): cargo +1.90.0. Features (8/32, 12 skipped): default,fizz. Command (1/3): clippy. Time running: 5 s.
    283 Package: example. Toolchain (2/2): cargo +1.90.0. Features (8/32, 12 skipped): default,fizz. Command (2/3): test --all-targets. Time running: 5 s.
    284 Package: example. Toolchain (2/2): cargo +1.90.0. Features (8/32, 12 skipped): default,fizz. Command (3/3): test --doc. Time running: 5 s.
    285 Package: example. Toolchain (2/2): cargo +1.90.0. Features (9/32, 13 skipped): buzz,fizz. Command (1/3): clippy. Time running: 5 s.
    286 Package: example. Toolchain (2/2): cargo +1.90.0. Features (9/32, 13 skipped): buzz,fizz. Command (2/3): test --all-targets. Time running: 5 s.
    287 Package: example. Toolchain (2/2): cargo +1.90.0. Features (9/32, 13 skipped): buzz,fizz. Command (3/3): test --doc. Time running: 6 s.
    288 Package: example. Toolchain (2/2): cargo +1.90.0. Features (10/32, 14 skipped): fizz. Command (1/3): clippy. Time running: 6 s.
    289 Package: example. Toolchain (2/2): cargo +1.90.0. Features (10/32, 14 skipped): fizz. Command (2/3): test --all-targets. Time running: 6 s.
    290 Package: example. Toolchain (2/2): cargo +1.90.0. Features (10/32, 14 skipped): fizz. Command (3/3): test --doc. Time running: 6 s.
    291 Package: example. Toolchain (2/2): cargo +1.90.0. Features (11/32, 14 skipped): bar,buzz,default. Command (1/3): clippy. Time running: 6 s.
    292 Package: example. Toolchain (2/2): cargo +1.90.0. Features (11/32, 14 skipped): bar,buzz,default. Command (2/3): test --all-targets. Time running: 6 s.
    293 Package: example. Toolchain (2/2): cargo +1.90.0. Features (11/32, 14 skipped): bar,buzz,default. Command (3/3): test --doc. Time running: 6 s.
    294 Package: example. Toolchain (2/2): cargo +1.90.0. Features (12/32, 14 skipped): buzz,default. Command (1/3): clippy. Time running: 6 s.
    295 Package: example. Toolchain (2/2): cargo +1.90.0. Features (12/32, 14 skipped): buzz,default. Command (2/3): test --all-targets. Time running: 6 s.
    296 Package: example. Toolchain (2/2): cargo +1.90.0. Features (12/32, 14 skipped): buzz,default. Command (3/3): test --doc. Time running: 6 s.
    297 Package: example. Toolchain (2/2): cargo +1.90.0. Features (13/32, 14 skipped): bar,default. Command (1/3): clippy. Time running: 6 s.
    298 Package: example. Toolchain (2/2): cargo +1.90.0. Features (13/32, 14 skipped): bar,default. Command (2/3): test --all-targets. Time running: 6 s.
    299 Package: example. Toolchain (2/2): cargo +1.90.0. Features (13/32, 14 skipped): bar,default. Command (3/3): test --doc. Time running: 7 s.
    300 Package: example. Toolchain (2/2): cargo +1.90.0. Features (14/32, 14 skipped): default. Command (1/3): clippy. Time running: 7 s.
    301 Package: example. Toolchain (2/2): cargo +1.90.0. Features (14/32, 14 skipped): default. Command (2/3): test --all-targets. Time running: 7 s.
    302 Package: example. Toolchain (2/2): cargo +1.90.0. Features (14/32, 14 skipped): default. Command (3/3): test --doc. Time running: 7 s.
    303 Package: example. Toolchain (2/2): cargo +1.90.0. Features (15/32, 14 skipped): bar,buzz. Command (1/3): clippy. Time running: 7 s.
    304 Package: example. Toolchain (2/2): cargo +1.90.0. Features (15/32, 14 skipped): bar,buzz. Command (2/3): test --all-targets. Time running: 7 s.
    305 Package: example. Toolchain (2/2): cargo +1.90.0. Features (15/32, 14 skipped): bar,buzz. Command (3/3): test --doc. Time running: 7 s.
    306 Package: example. Toolchain (2/2): cargo +1.90.0. Features (16/32, 14 skipped): buzz. Command (1/3): clippy. Time running: 7 s.
    307 Package: example. Toolchain (2/2): cargo +1.90.0. Features (16/32, 14 skipped): buzz. Command (2/3): test --all-targets. Time running: 7 s.
    308 Package: example. Toolchain (2/2): cargo +1.90.0. Features (16/32, 14 skipped): buzz. Command (3/3): test --doc. Time running: 7 s.
    309 Package: example. Toolchain (2/2): cargo +1.90.0. Features (17/32, 14 skipped): bar. Command (1/3): clippy. Time running: 7 s.
    310 Package: example. Toolchain (2/2): cargo +1.90.0. Features (17/32, 14 skipped): bar. Command (2/3): test --all-targets. Time running: 7 s.
    311 Package: example. Toolchain (2/2): cargo +1.90.0. Features (17/32, 14 skipped): bar. Command (3/3): test --doc. Time running: 7 s.
    312 Package: example. Toolchain (2/2): cargo +1.90.0. Features (18/32, 14 skipped): <none>. Command (1/3): clippy. Time running: 8 s.
    313 Package: example. Toolchain (2/2): cargo +1.90.0. Features (18/32, 14 skipped): <none>. Command (2/3): test --all-targets. Time running: 8 s.
    314 Package: example. Toolchain (2/2): cargo +1.90.0. Features (18/32, 14 skipped): <none>. Command (3/3): test --doc. Time running: 8 s.
    315 Toolchains used: cargo +stable and cargo +1.90.0
    316 Features used:
    317 buzz,fizz,foo
    318 fizz,foo
    319 bar,buzz,foo
    320 buzz,foo
    321 bar,foo
    322 foo
    323 buzz,default,fizz
    324 default,fizz
    325 buzz,fizz
    326 fizz
    327 bar,buzz,default
    328 buzz,default
    329 bar,default
    330 default
    331 bar,buzz
    332 buzz
    333 bar
    334 <none>
    335 [zack@laptop example]$ ci-cargo clippy --deny-warnings --ignore-compile-errors --ignore-features buzz, --ignore-msrv --skip-msrv
    336 [zack@laptop ~]$ ci-cargo test --allow-implied-features --cargo-home ~/.cargo/ --cargo-path ~/.cargo/bin --default-toolchain --dir ~/example/ --ignored --rustup-home ~/.rustup/
    337 [zack@laptop ~]$ ci-cargo version
    338 ci-cargo 0.1.0
    339 [zack@laptop example]$ ci-cargo --summary clippy
    340 A command was not passed as the first argument. See ci-cargo help for more information.
    341 ```
    342 
    343 ## Limitations
    344 
    345 Functionality when using old versions of `cargo` may not exist (e.g., `cargo check` wasn't available until 1.16.0).
    346 
    347 There is a hard limit on the number of features allowed. Specifically the number of features can't exceed the
    348 number of bits that make up a pointer; however practical limits will almost always be a factor long before hitting
    349 such a hard limit due to the exponential effect features have.
    350 
    351 Cyclic and redundant features are forbidden. For example the below snippets from `Cargo.toml` files will cause an
    352 error:
    353 
    354 ```toml
    355 [features]
    356 # Loops are forbidden by `cargo`, so this is not an additional limitation.
    357 a = ["a"]
    358 [features]
    359 # Cyclic features are disallowed even though `cargo` allows them.
    360 a = ["b"]
    361 b = ["a"]
    362 [features]
    363 # `a` should more concisely be assigned `["b"]` since `b` already depends on `c`.
    364 a = ["b", "c"]
    365 b = ["c"]
    366 c = []
    367 ```
    368 
    369 ## Minimum Supported Rust Version (MSRV)
    370 
    371 This will frequently be updated to be the same as stable. Specifically, any time stable is updated and that
    372 update has "useful" features or compilation no longer succeeds (e.g., due to new compiler lints), then MSRV
    373 will be updated.
    374 
    375 MSRV changes will correspond to a SemVer patch version bump pre-`1.0.0`; otherwise a minor version bump.
    376 
    377 ## SemVer Policy
    378 
    379 * All on-by-default features of this library are covered by SemVer
    380 * MSRV is considered exempt from SemVer as noted above
    381 
    382 ## License
    383 
    384 Licensed under either of
    385 
    386 * Apache License, Version 2.0 ([LICENSE-APACHE](https://www.apache.org/licenses/LICENSE-2.0))
    387 * MIT license ([LICENSE-MIT](https://opensource.org/licenses/MIT))
    388 
    389 at your option.
    390 
    391 ## Contribution
    392 
    393 Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you,
    394 as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
    395 
    396 Before any PR is sent, `ci-cargo clippy --all-targets test --benches --bins --examples --tests --include-ignored`
    397 should be run on itself. Additionally `cargo +nightly doc` should be run to ensure documentation can be built.
    398 
    399 ### Status
    400 
    401 The crate is only tested on the `x86_64-unknown-linux-gnu`, `x86_64-unknown-openbsd`, and `aarch64-apple-darwin`
    402 targets; but it should work on most platforms.