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.