diff --git a/.github/config-schema.json b/.github/config-schema.json index 52f23166e..6fe979883 100644 --- a/.github/config-schema.json +++ b/.github/config-schema.json @@ -4603,6 +4603,12 @@ "default": "\\[$pipestatus\\] => [$symbol$common_meaning$signal_name$maybe_int]($style)", "type": "string" }, + "pipestatus_segment_format": { + "type": [ + "string", + "null" + ] + }, "disabled": { "default": true, "type": "boolean" diff --git a/.github/workflows/format-workflow.yml b/.github/workflows/format-workflow.yml index 08428bd87..d0d0b71b6 100644 --- a/.github/workflows/format-workflow.yml +++ b/.github/workflows/format-workflow.yml @@ -14,7 +14,7 @@ jobs: - name: Setup | Checkout uses: actions/checkout@v3 - name: Docs | Format - uses: dprint/check@v2.0 + uses: dprint/check@v2.1 # Validate preset files taplo: diff --git a/Cargo.lock b/Cargo.lock index 89b331023..f0f3e5884 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,6 +204,18 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "byte-slice-cast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" + [[package]] name = "byte-tools" version = "0.3.1" @@ -270,9 +282,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.10" +version = "3.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69c5a7f9997be616e47f0577ee38c91decb33392c5be4866494f34cdf329a9aa" +checksum = "54635806b078b7925d6e36810b1755f2a4b5b4d57560432c1ecf60bcbe10602b" dependencies = [ "atty", "bitflags", @@ -336,6 +348,12 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "const_fn" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" + [[package]] name = "const_format" version = "0.2.25" @@ -362,7 +380,17 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys 0.8.3", "libc", ] @@ -372,6 +400,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "cpufeatures" version = "0.2.2" @@ -864,6 +898,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "iana-time-zone" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8185498dab35f87e740e2a878ec92b2241ef2c12ac85680f8ba7491f1ed76b" +dependencies = [ + "core-foundation 0.9.3", + "js-sys", + "wasm-bindgen", + "winapi", +] + [[package]] name = "idna" version = "0.2.3" @@ -931,6 +977,15 @@ dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1122,9 +1177,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -1269,9 +1324,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "open" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360bcc8316bf6363aa3954c3ccc4de8add167b087e0259190a043c9514f910fe" +checksum = "f23a407004a1033f53e93f9b45580d14de23928faad187384f891507c9b0c045" dependencies = [ "pathdiff", "windows-sys", @@ -1431,7 +1486,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_shared", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", ] [[package]] @@ -1441,7 +1505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" dependencies = [ "phf_generator", - "phf_shared", + "phf_shared 0.8.0", ] [[package]] @@ -1450,7 +1514,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" dependencies = [ - "phf_shared", + "phf_shared 0.8.0", "rand 0.7.3", ] @@ -1463,6 +1527,15 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1841,18 +1914,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" +checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" +checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" dependencies = [ "proc-macro2", "quote", @@ -1945,14 +2018,15 @@ dependencies = [ [[package]] name = "shadow-rs" -version = "0.12.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1b83da0a4e48d8dcc13ad177b64f2fc40097974f9bf176c2bcb702cabadff3" +checksum = "700d9f534a341a3ed1322dd10cd04daefcb229bc09b44a83ee20873dfa03d292" dependencies = [ - "chrono", "const_format", "git2", "is_debug", + "time 0.3.11", + "tzdb", ] [[package]] @@ -2047,7 +2121,7 @@ dependencies = [ "local_ipaddress", "log", "mockall", - "nix 0.24.1", + "nix 0.24.2", "notify-rust", "once_cell", "open", @@ -2080,7 +2154,7 @@ dependencies = [ "urlencoding", "versions", "which", - "windows 0.38.0", + "windows 0.39.0", "winres", "yaml-rust", ] @@ -2092,7 +2166,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3336198ad004af4447ae69be4f4e562c26814570f8f0c1e37858405a294e015d" dependencies = [ "cfg-if 1.0.0", - "core-foundation", + "core-foundation 0.7.0", "lazycell", "libc", "mach", @@ -2202,7 +2276,7 @@ dependencies = [ "dirs 2.0.2", "fnv", "nom 5.1.2", - "phf", + "phf 0.8.0", "phf_codegen", ] @@ -2299,6 +2373,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" dependencies = [ + "itoa", "libc", "num_threads", ] @@ -2377,6 +2452,28 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "tz-rs" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb454313e3d79601e2116bb6c7a93ec0eda1dbb52f9204f831f897204182c5f" +dependencies = [ + "const_fn", +] + +[[package]] +name = "tzdb" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a29f1fbaa871320d9d6c81e19c650837a3959cf463472408c934c49af7df5f" +dependencies = [ + "byte-slice-cast", + "iana-time-zone", + "phf 0.10.1", + "phf_shared 0.10.0", + "tz-rs", +] + [[package]] name = "ucd-trie" version = "0.1.3" @@ -2530,6 +2627,60 @@ 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.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" + [[package]] name = "wepoll-ffi" version = "0.1.2" @@ -2595,15 +2746,15 @@ dependencies = [ [[package]] name = "windows" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c47017195a790490df51a3e27f669a7d4f285920d90d03ef970c5d886ef0af1" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" dependencies = [ - "windows_aarch64_msvc 0.38.0", - "windows_i686_gnu 0.38.0", - "windows_i686_msvc 0.38.0", - "windows_x86_64_gnu 0.38.0", - "windows_x86_64_msvc 0.38.0", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", ] [[package]] @@ -2627,9 +2778,9 @@ checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_aarch64_msvc" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12add87e2fb192fff3f4f7e4342b3694785d79f3a64e2c20d5ceb5ccbcfc3cd" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" [[package]] name = "windows_i686_gnu" @@ -2645,9 +2796,9 @@ checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c98f2db372c23965c5e0f43896a8f0316dc0fbe48d1aa65bea9bdd295d43c15" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" [[package]] name = "windows_i686_msvc" @@ -2663,9 +2814,9 @@ checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf0569be0f2863ab6a12a6ba841fcfa7d107cbc7545a3ebd57685330db0a3ff" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" [[package]] name = "windows_x86_64_gnu" @@ -2681,9 +2832,9 @@ checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905858262c8380a36f32cb8c1990d7e7c3b7a8170e58ed9a98ca6d940b7ea9f1" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" [[package]] name = "windows_x86_64_msvc" @@ -2699,9 +2850,9 @@ checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "890c3c6341d441ffb38f705f47196e3665dc6dd79f6d72fa185d937326730561" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" [[package]] name = "winres" diff --git a/Cargo.toml b/Cargo.toml index 5672c8c6a..5e2717970 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ notify = ["notify-rust"] [dependencies] ansi_term = "0.12.1" chrono = "0.4.19" -clap = { version = "=3.2.10", features = ["derive", "cargo", "unicode", "unstable-v4"] } +clap = { version = "=3.2.14", features = ["derive", "cargo", "unicode", "unstable-v4"] } clap_complete = "3.2.3" dirs-next = "2.0.0" dunce = "1.0.2" @@ -51,7 +51,7 @@ log = { version = "0.4.16", features = ["std"] } # see: https://github.com/NixOS/nixpkgs/issues/160876 notify-rust = { version = "4.5.8", optional = true } once_cell = "1.13.0" -open = "3.0.1" +open = "3.0.2" os_info = "3.4.0" path-slash = "0.2.0" pest = "2.1.3" @@ -62,10 +62,10 @@ rayon = "1.5.3" regex = "1.6.0" rust-ini = "0.18.0" semver = "1.0.12" -serde = { version = "1.0.139", features = ["derive"] } +serde = { version = "1.0.140", features = ["derive"] } serde_json = "1.0.82" sha-1 = "0.10.0" -shadow-rs = "0.12.0" +shadow-rs = "0.16.0" # battery is optional (on by default) because the crate doesn't currently build for Termux # see: https://github.com/svartalf/rust-battery/issues/33 starship-battery = { version = "0.7.9", optional = true } @@ -96,7 +96,7 @@ features = ["preserve_order", "indexmap"] deelevate = "0.2.0" [target.'cfg(windows)'.dependencies.windows] -version = "0.38.0" +version = "0.39.0" features = [ "Win32_Foundation", "Win32_UI_Shell", @@ -106,10 +106,10 @@ features = [ ] [target.'cfg(not(windows))'.dependencies] -nix = { version = "0.24.1", default-features = false, features = ["feature", "fs", "user"] } +nix = { version = "0.24.2", default-features = false, features = ["feature", "fs", "user"] } [build-dependencies] -shadow-rs = "0.12.0" +shadow-rs = "0.16.0" [target.'cfg(windows)'.build-dependencies] winres = "0.1.12" diff --git a/docs/config/README.md b/docs/config/README.md index 7316b86dd..cba894e71 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -3322,22 +3322,23 @@ To enable it, set `disabled` to `false` in your configuration file. ### Options -| Option | Default | Description | -| ----------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------- | -| `format` | `"[$symbol$status]($style) "` | The format of the module | -| `symbol` | `"✖"` | The symbol displayed on program error | -| `success_symbol` | `""` | The symbol displayed on program success | -| `not_executable_symbol` | `"🚫"` | The symbol displayed when file isn't executable | -| `not_found_symbol` | `"🔍"` | The symbol displayed when the command can't be found | -| `sigint_symbol` | `"🧱"` | The symbol displayed on SIGINT (Ctrl + c) | -| `signal_symbol` | `"⚡"` | The symbol displayed on any signal | -| `style` | `"bold red"` | The style for the module. | -| `recognize_signal_code` | `true` | Enable signal mapping from exit code | -| `map_symbol` | `false` | Enable symbols mapping from exit code | -| `pipestatus` | `false` | Enable pipestatus reporting | -| `pipestatus_separator` | ` | ` | -| `pipestatus_format` | `\\[$pipestatus\\] => [$symbol$common_meaning$signal_name$maybe_int]($style)` | The format of the module when the command is a pipeline | -| `disabled` | `true` | Disables the `status` module. | +| Option | Default | Description | +| --------------------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| `format` | `"[$symbol$status]($style) "` | The format of the module | +| `symbol` | `"✖"` | The symbol displayed on program error | +| `success_symbol` | `""` | The symbol displayed on program success | +| `not_executable_symbol` | `"🚫"` | The symbol displayed when file isn't executable | +| `not_found_symbol` | `"🔍"` | The symbol displayed when the command can't be found | +| `sigint_symbol` | `"🧱"` | The symbol displayed on SIGINT (Ctrl + c) | +| `signal_symbol` | `"⚡"` | The symbol displayed on any signal | +| `style` | `"bold red"` | The style for the module. | +| `recognize_signal_code` | `true` | Enable signal mapping from exit code | +| `map_symbol` | `false` | Enable symbols mapping from exit code | +| `pipestatus` | `false` | Enable pipestatus reporting | +| `pipestatus_separator` | | | The symbol used to separate pipestatus segments | +| `pipestatus_format` | `\\[$pipestatus\\] => [$symbol$common_meaning$signal_name$maybe_int]($style)` | The format of the module when the command is a pipeline | +| `pipestatus_segment_format` | | When specified, replaces `format` when formatting pipestatus segments | +| `disabled` | `true` | Disables the `status` module. | ### Variables diff --git a/src/configs/status.rs b/src/configs/status.rs index 422369b6f..839c57e67 100644 --- a/src/configs/status.rs +++ b/src/configs/status.rs @@ -17,6 +17,8 @@ pub struct StatusConfig<'a> { pub pipestatus: bool, pub pipestatus_separator: &'a str, pub pipestatus_format: &'a str, + #[serde(skip_serializing_if = "Option::is_none")] + pub pipestatus_segment_format: Option<&'a str>, pub disabled: bool, } @@ -37,6 +39,7 @@ impl<'a> Default for StatusConfig<'a> { pipestatus_separator: "|", pipestatus_format: "\\[$pipestatus\\] => [$symbol$common_meaning$signal_name$maybe_int]($style)", + pipestatus_segment_format: None, disabled: true, } } diff --git a/src/modules/package.rs b/src/modules/package.rs index 7d707a666..2906d992d 100644 --- a/src/modules/package.rs +++ b/src/modules/package.rs @@ -7,6 +7,8 @@ use quick_xml::events::Event as QXEvent; use quick_xml::Reader as QXReader; use regex::Regex; use serde_json as json; +use std::fs; +use std::io::Read; /// Creates a module with the current package version pub fn module<'a>(context: &'a Context) -> Option> { @@ -213,10 +215,45 @@ fn get_sbt_version(context: &Context, config: &PackageConfig) -> Option } fn get_cargo_version(context: &Context, config: &PackageConfig) -> Option { - let file_contents = context.read_file_from_pwd("Cargo.toml")?; + let mut file_contents = context.read_file_from_pwd("Cargo.toml")?; - let cargo_toml: toml::Value = toml::from_str(&file_contents).ok()?; - let raw_version = cargo_toml.get("package")?.get("version")?.as_str()?; + let mut cargo_toml: toml::Value = toml::from_str(&file_contents).ok()?; + let cargo_version = cargo_toml.get("package").and_then(|p| p.get("version")); + let raw_version = if let Some(v) = cargo_version.and_then(|v| v.as_str()) { + // regular version string + v + } else if cargo_version + .and_then(|v| v.get("workspace")) + .and_then(|w| w.as_bool()) + .unwrap_or_default() + { + // workspace version string (`package.version.worspace = true`) + // need to read the Cargo.toml file from the workspace root + let mut version = None; + // disover the workspace root + for path in context.current_dir.ancestors().skip(1) { + // Assume the workspace root is the first ancestor that contains a Cargo.toml file + if let Ok(mut file) = fs::File::open(path.join("Cargo.toml")) { + file.read_to_string(&mut file_contents).ok()?; + cargo_toml = toml::from_str(&file_contents).ok()?; + // Read workspace.package.version + version = cargo_toml + .get("workspace")? + .get("package")? + .get("version")? + .as_str(); + break; + } + } + version? + } else { + // This might be a workspace file + cargo_toml + .get("workspace")? + .get("package")? + .get("version")? + .as_str()? + }; format_version(raw_version, config.version_format) } @@ -356,6 +393,88 @@ mod tests { project_dir.close() } + #[test] + fn test_extract_cargo_version_ws() -> io::Result<()> { + let ws_config_name = "Cargo.toml"; + let ws_config_content = toml::toml! { + [workspace.package] + version = "0.1.0" + } + .to_string(); + + let config_name = "member/Cargo.toml"; + let config_content = toml::toml! { + [package] + version.workspace = true + } + .to_string(); + + let project_dir = create_project_dir()?; + fs::create_dir(project_dir.path().join("member"))?; + + fill_config(&project_dir, ws_config_name, Some(&ws_config_content))?; + fill_config(&project_dir, config_name, Some(&config_content))?; + + // Version can be read both from the workspace and the member. + expect_output(&project_dir, Some("v0.1.0"), None); + let actual = ModuleRenderer::new("package") + .path(project_dir.path().join("member")) + .collect(); + let expected = Some(format!( + "is {} ", + Color::Fixed(208).bold().paint("📦 v0.1.0") + )); + assert_eq!(actual, expected); + project_dir.close() + } + + #[test] + fn test_extract_cargo_version_ws_false() -> io::Result<()> { + let ws_config_name = "Cargo.toml"; + let ws_config_content = toml::toml! { + [workspace.package] + version = "0.1.0" + } + .to_string(); + + let config_name = "member/Cargo.toml"; + let config_content = toml::toml! { + [package] + version.workspace = false + } + .to_string(); + + let project_dir = create_project_dir()?; + fs::create_dir(project_dir.path().join("member"))?; + + fill_config(&project_dir, ws_config_name, Some(&ws_config_content))?; + fill_config(&project_dir, config_name, Some(&config_content))?; + + // Version can be read both from the workspace and the member. + let actual = ModuleRenderer::new("package") + .path(project_dir.path().join("member")) + .collect(); + let expected = None; + assert_eq!(actual, expected); + project_dir.close() + } + + #[test] + fn test_extract_cargo_version_ws_missing_parent() -> io::Result<()> { + let config_name = "Cargo.toml"; + let config_content = toml::toml! { + [package] + name = "starship" + version.workspace = true + } + .to_string(); + + let project_dir = create_project_dir()?; + fill_config(&project_dir, config_name, Some(&config_content))?; + expect_output(&project_dir, None, None); + project_dir.close() + } + #[test] fn test_extract_nimble_package_version() -> io::Result<()> { let config_name = "test_project.nimble"; diff --git a/src/modules/rust.rs b/src/modules/rust.rs index 1e46050a4..35e38d9a5 100644 --- a/src/modules/rust.rs +++ b/src/modules/rust.rs @@ -55,9 +55,10 @@ impl RustToolingEnvironmentInfo { // To display appropriate versions preventing `rustc` from downloading toolchains, we have to // check // 1. `$RUSTUP_TOOLCHAIN` - // 2. `rustup override list` + // 2. The override list from ~/.rustup/settings.toml (like `rustup override list`) // 3. `rust-toolchain` or `rust-toolchain.toml` in `.` or parent directories - // 4. `rustup default` + // 4. The `default_toolchain` from ~/.rustup/settings.toml (like `rustup default`) + // 5. `rustup default` (in addition to the above, this also looks at global fallback config files) // as `rustup` does. // https://github.com/rust-lang/rustup.rs/tree/eb694fcada7becc5d9d160bf7c623abe84f8971d#override-precedence // @@ -74,6 +75,11 @@ impl RustToolingEnvironmentInfo { .lookup_override(context.current_dir.as_path()) }) .or_else(|| find_rust_toolchain_file(context)) + .or_else(|| { + self.get_rustup_settings(context) + .default_toolchain() + .map(std::string::ToString::to_string) + }) .or_else(|| execute_rustup_default(context)); log::debug!("Environmental toolchain override is {:?}", out); @@ -87,12 +93,32 @@ impl RustToolingEnvironmentInfo { fn get_rustup_rustc_version(&self, context: &Context) -> &RustupRunRustcVersionOutcome { self.rustup_rustc_output.get_or_init(|| { let out = if let Some(toolchain) = self.get_env_toolchain_override(context) { - create_command("rustup") - .and_then(|mut cmd| { - cmd.args(&["run", toolchain, "rustc", "--version"]) - .current_dir(&context.current_dir) - .output() + // First try runnig ~/.rustup/toolchains//bin/rustc --version + rustup_home() + .map(|rustup_folder| { + rustup_folder + .join("toolchains") + .join(toolchain) + .join("bin") + .join("rustc") }) + .and_then(|rustc| { + log::trace!("Running rustc --version directly with {:?}", rustc); + create_command(rustc).map(|mut cmd| { + cmd.arg("--version"); + cmd + }) + }) + .or_else(|_| { + // If that fails, try running rustup rustup run rustc --version + // Depending on the source of the toolchain override, it might not have been a full toolchain name ("stable" or "nightly"). + log::trace!("Running rustup {toolchain} rustc --version"); + create_command("rustup").map(|mut cmd| { + cmd.args(&["run", toolchain, "rustc", "--version"]); + cmd + }) + }) + .and_then(|mut cmd| cmd.current_dir(&context.current_dir).output()) .map(extract_toolchain_from_rustup_run_rustc_version) .unwrap_or(RustupRunRustcVersionOutcome::RustupNotWorking) } else { diff --git a/src/modules/status.rs b/src/modules/status.rs index e1c7e8cb7..444b5a30e 100644 --- a/src/modules/status.rs +++ b/src/modules/status.rs @@ -54,12 +54,14 @@ pub fn module<'a>(context: &'a Context) -> Option> { return None; } + let segment_format = config.pipestatus_segment_format.unwrap_or(config.format); + // Create pipestatus string let pipestatus = match pipestatus_status { PipeStatusStatus::Pipe(pipestatus) => pipestatus .iter() .map( - |ec| match format_exit_code(ec.as_str(), config.format, None, &config, context) { + |ec| match format_exit_code(ec.as_str(), segment_format, None, &config, context) { Ok(segments) => segments .into_iter() .map(|s| s.to_string()) @@ -684,4 +686,26 @@ mod tests { assert_eq!(expected, actual); } } + + #[test] + fn pipestatus_segment_format() { + let pipe_exit_code = &[0, 1]; + let main_exit_code = 1; + + let expected = Some("[0]|[1] => <1>".to_string()); + let actual = ModuleRenderer::new("status") + .config(toml::toml! { + [status] + format = "\\($status\\)" + pipestatus = true + pipestatus_separator = "|" + pipestatus_format = "$pipestatus => <$status>" + pipestatus_segment_format = "\\[$status\\]" + disabled = false + }) + .status(main_exit_code) + .pipestatus(pipe_exit_code) + .collect(); + assert_eq!(expected, actual); + } }