mirror of
https://github.com/starship/starship.git
synced 2025-01-08 07:28:56 +01:00
Merge branch 'master' into conditional-style
This commit is contained in:
commit
8f0659b075
29
.github/config-schema.json
vendored
29
.github/config-schema.json
vendored
@ -774,6 +774,9 @@
|
|||||||
"kubernetes": {
|
"kubernetes": {
|
||||||
"default": {
|
"default": {
|
||||||
"context_aliases": {},
|
"context_aliases": {},
|
||||||
|
"detect_extensions": [],
|
||||||
|
"detect_files": [],
|
||||||
|
"detect_folders": [],
|
||||||
"disabled": true,
|
"disabled": true,
|
||||||
"format": "[$symbol$context( \\($namespace\\))]($style) in ",
|
"format": "[$symbol$context( \\($namespace\\))]($style) in ",
|
||||||
"style": "cyan bold",
|
"style": "cyan bold",
|
||||||
@ -1033,6 +1036,7 @@
|
|||||||
"default": {
|
"default": {
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"format": "via [$symbol($username@)$stack]($style) ",
|
"format": "via [$symbol($username@)$stack]($style) ",
|
||||||
|
"search_upwards": true,
|
||||||
"style": "bold 5",
|
"style": "bold 5",
|
||||||
"symbol": " ",
|
"symbol": " ",
|
||||||
"version_format": "v${raw}"
|
"version_format": "v${raw}"
|
||||||
@ -3404,6 +3408,27 @@
|
|||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"detect_extensions": {
|
||||||
|
"default": [],
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"detect_files": {
|
||||||
|
"default": [],
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"detect_folders": {
|
||||||
|
"default": [],
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -3913,6 +3938,10 @@
|
|||||||
"disabled": {
|
"disabled": {
|
||||||
"default": false,
|
"default": false,
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"search_upwards": {
|
||||||
|
"default": true,
|
||||||
|
"type": "boolean"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
24
Cargo.lock
generated
24
Cargo.lock
generated
@ -270,9 +270,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "3.2.8"
|
version = "3.2.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "190814073e85d238f31ff738fcb0bf6910cedeb73376c87cd69291028966fd83"
|
checksum = "69c5a7f9997be616e47f0577ee38c91decb33392c5be4866494f34cdf329a9aa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atty",
|
"atty",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
@ -1356,9 +1356,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "path-slash"
|
name = "path-slash"
|
||||||
version = "0.1.4"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3cacbb3c4ff353b534a67fb8d7524d00229da4cb1dc8c79f4db96e375ab5b619"
|
checksum = "c54014ba3c1880122928735226f78b6f5bf5bd1fed15e41e92cf7aa20278ce28"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pathdiff"
|
name = "pathdiff"
|
||||||
@ -1730,9 +1730,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.5.6"
|
version = "1.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
|
checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
@ -1741,9 +1741,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.6.26"
|
version = "0.6.27"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
|
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "remove_dir_all"
|
name = "remove_dir_all"
|
||||||
@ -1841,18 +1841,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.138"
|
version = "1.0.139"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47"
|
checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.138"
|
version = "1.0.139"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c"
|
checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -38,7 +38,7 @@ notify = ["notify-rust"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
ansi_term = "0.12.1"
|
ansi_term = "0.12.1"
|
||||||
chrono = "0.4.19"
|
chrono = "0.4.19"
|
||||||
clap = { version = "=3.2.8", features = ["derive", "cargo", "unicode", "unstable-v4"] }
|
clap = { version = "=3.2.10", features = ["derive", "cargo", "unicode", "unstable-v4"] }
|
||||||
clap_complete = "3.2.3"
|
clap_complete = "3.2.3"
|
||||||
dirs-next = "2.0.0"
|
dirs-next = "2.0.0"
|
||||||
dunce = "1.0.2"
|
dunce = "1.0.2"
|
||||||
@ -53,16 +53,16 @@ notify-rust = { version = "4.5.8", optional = true }
|
|||||||
once_cell = "1.13.0"
|
once_cell = "1.13.0"
|
||||||
open = "3.0.1"
|
open = "3.0.1"
|
||||||
os_info = "3.4.0"
|
os_info = "3.4.0"
|
||||||
path-slash = "0.1.4"
|
path-slash = "0.2.0"
|
||||||
pest = "2.1.3"
|
pest = "2.1.3"
|
||||||
pest_derive = "2.1.0"
|
pest_derive = "2.1.0"
|
||||||
quick-xml = "0.23.0"
|
quick-xml = "0.23.0"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
rayon = "1.5.3"
|
rayon = "1.5.3"
|
||||||
regex = "1.5.6"
|
regex = "1.6.0"
|
||||||
rust-ini = "0.18.0"
|
rust-ini = "0.18.0"
|
||||||
semver = "1.0.12"
|
semver = "1.0.12"
|
||||||
serde = { version = "1.0.138", features = ["derive"] }
|
serde = { version = "1.0.139", features = ["derive"] }
|
||||||
serde_json = "1.0.82"
|
serde_json = "1.0.82"
|
||||||
sha-1 = "0.10.0"
|
sha-1 = "0.10.0"
|
||||||
shadow-rs = "0.12.0"
|
shadow-rs = "0.12.0"
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
const sidebar = (lang, override = {}) =>
|
import { defineConfig, SidebarConfigArray } from "vuepress/config";
|
||||||
|
|
||||||
|
const sidebar = (lang, override = {}): SidebarConfigArray =>
|
||||||
[
|
[
|
||||||
"", // "Home", which should always have a override
|
"", // "Home", which should always have a override
|
||||||
"guide", // README, which should always have a override
|
"guide", // README, which should always have a override
|
||||||
@ -23,7 +25,7 @@ const sidebar = (lang, override = {}) =>
|
|||||||
return page in override ? [path, override[page]] : path;
|
return page in override ? [path, override[page]] : path;
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = {
|
module.exports = defineConfig({
|
||||||
locales: {
|
locales: {
|
||||||
"/": {
|
"/": {
|
||||||
lang: "en-US",
|
lang: "en-US",
|
||||||
@ -331,11 +333,11 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"sitemap",
|
"vuepress-plugin-sitemap",
|
||||||
{
|
{
|
||||||
hostname: "https://starship.rs",
|
hostname: "https://starship.rs",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
["vuepress-plugin-code-copy", true],
|
["vuepress-plugin-code-copy", true],
|
||||||
],
|
],
|
||||||
};
|
});
|
@ -56,69 +56,69 @@ truncation_symbol = "…/"
|
|||||||
[c]
|
[c]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[docker_context]
|
[docker_context]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#06969A"
|
style = "bg:#06969A"
|
||||||
format = '[[ $symbol $context ](bg:#06969A)]($style) $path'
|
format = '[ $symbol $context ]($style) $path'
|
||||||
|
|
||||||
[elixir]
|
[elixir]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[elm]
|
[elm]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[git_branch]
|
[git_branch]
|
||||||
symbol = ""
|
symbol = ""
|
||||||
style = "bg:#FCA17D"
|
style = "bg:#FCA17D"
|
||||||
format = '[[ $symbol $branch ](bg:#FCA17D)]($style)'
|
format = '[ $symbol $branch ]($style)'
|
||||||
|
|
||||||
[git_status]
|
[git_status]
|
||||||
style = "bg:#FCA17D"
|
style = "bg:#FCA17D"
|
||||||
format = '[[($all_status$ahead_behind )](bg:#FCA17D)]($style)'
|
format = '[$all_status$ahead_behind ]($style)'
|
||||||
|
|
||||||
[golang]
|
[golang]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[haskell]
|
[haskell]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[java]
|
[java]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[julia]
|
[julia]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[nodejs]
|
[nodejs]
|
||||||
symbol = ""
|
symbol = ""
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[nim]
|
[nim]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[rust]
|
[rust]
|
||||||
symbol = ""
|
symbol = ""
|
||||||
style = "bg:#86BBD8"
|
style = "bg:#86BBD8"
|
||||||
format = '[[ $symbol ($version) ](bg:#86BBD8)]($style)'
|
format = '[ $symbol ($version) ]($style)'
|
||||||
|
|
||||||
[time]
|
[time]
|
||||||
disabled = false
|
disabled = false
|
||||||
time_format = "%R" # Hour:Minute Format
|
time_format = "%R" # Hour:Minute Format
|
||||||
style = "bg:#33658A"
|
style = "bg:#33658A"
|
||||||
format = '[[ ♥ $time ](bg:#33658A)]($style)'
|
format = '[ ♥ $time ]($style)'
|
||||||
|
@ -2084,18 +2084,25 @@ If the `$KUBECONFIG` env var is set the module will use that if not it will use
|
|||||||
This module is disabled by default.
|
This module is disabled by default.
|
||||||
To enable it, set `disabled` to `false` in your configuration file.
|
To enable it, set `disabled` to `false` in your configuration file.
|
||||||
|
|
||||||
|
When the module is enabled it will always be active, unless any of
|
||||||
|
`detect_extensions`, `detect_files` or `detect_folders` have been st in which
|
||||||
|
case the module will only be active in directories that match those conditions.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
### Options
|
### Options
|
||||||
|
|
||||||
| Option | Default | Description |
|
| Option | Default | Description |
|
||||||
| ----------------- | -------------------------------------------------- | --------------------------------------------------------------------- |
|
| ------------------- | -------------------------------------------------- | --------------------------------------------------------------------- |
|
||||||
| `symbol` | `"☸ "` | A format string representing the symbol displayed before the Cluster. |
|
| `symbol` | `"☸ "` | A format string representing the symbol displayed before the Cluster. |
|
||||||
| `format` | `'[$symbol$context( \($namespace\))]($style) in '` | The format for the module. |
|
| `format` | `'[$symbol$context( \($namespace\))]($style) in '` | The format for the module. |
|
||||||
| `style` | `"cyan bold"` | The style for the module. |
|
| `style` | `"cyan bold"` | The style for the module. |
|
||||||
| `context_aliases` | | Table of context aliases to display. |
|
| `context_aliases` | | Table of context aliases to display. |
|
||||||
| `user_aliases` | | Table of user aliases to display. |
|
| `user_aliases` | | Table of user aliases to display. |
|
||||||
| `disabled` | `true` | Disables the `kubernetes` module. |
|
| `detect_extensions` | `[]` | Which extensions should trigger this module. |
|
||||||
|
| `detect_files` | `[]` | Which filenames should trigger this module. |
|
||||||
|
| `detect_folders` | `[]` | Which folders should trigger this modules. |
|
||||||
|
| `disabled` | `true` | Disables the `kubernetes` module. |
|
||||||
|
|
||||||
### Variables
|
### Variables
|
||||||
|
|
||||||
@ -2127,6 +2134,16 @@ disabled = false
|
|||||||
"root/.*" = "root"
|
"root/.*" = "root"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Only show the module in directories that contain a `k8s` file.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
# ~/.config/starship.toml
|
||||||
|
|
||||||
|
[kubernetes]
|
||||||
|
disabled = false
|
||||||
|
detect_files = ['k8s']
|
||||||
|
```
|
||||||
|
|
||||||
#### Regex Matching
|
#### Regex Matching
|
||||||
|
|
||||||
Additional to simple aliasing, `context_aliases` and `user_aliases` also supports
|
Additional to simple aliasing, `context_aliases` and `user_aliases` also supports
|
||||||
@ -2700,7 +2717,7 @@ If you still want to enable it, [follow the example shown below](#with-pulumi-ve
|
|||||||
By default the module will be shown if any of the following conditions are met:
|
By default the module will be shown if any of the following conditions are met:
|
||||||
|
|
||||||
- The current directory contains either `Pulumi.yaml` or `Pulumi.yml`
|
- The current directory contains either `Pulumi.yaml` or `Pulumi.yml`
|
||||||
- A parent directory contains either `Pulumi.yaml` or `Pulumi.yml`
|
- A parent directory contains either `Pulumi.yaml` or `Pulumi.yml` unless `search_upwards` is set to `false`
|
||||||
|
|
||||||
### Options
|
### Options
|
||||||
|
|
||||||
@ -2710,6 +2727,7 @@ By default the module will be shown if any of the following conditions are met:
|
|||||||
| `version_format` | `"v${raw}"` | The version format. Available vars are `raw`, `major`, `minor`, & `patch` |
|
| `version_format` | `"v${raw}"` | The version format. Available vars are `raw`, `major`, `minor`, & `patch` |
|
||||||
| `symbol` | `" "` | A format string shown before the Pulumi stack. |
|
| `symbol` | `" "` | A format string shown before the Pulumi stack. |
|
||||||
| `style` | `"bold 5"` | The style for the module. |
|
| `style` | `"bold 5"` | The style for the module. |
|
||||||
|
| `search_upwards` | `true` | Enable discovery of pulumi config files in parent directories. |
|
||||||
| `disabled` | `false` | Disables the `pulumi` module. |
|
| `disabled` | `false` | Disables the `pulumi` module. |
|
||||||
|
|
||||||
### Variables
|
### Variables
|
||||||
|
@ -11,6 +11,9 @@ pub struct KubernetesConfig<'a> {
|
|||||||
pub disabled: bool,
|
pub disabled: bool,
|
||||||
pub context_aliases: HashMap<String, &'a str>,
|
pub context_aliases: HashMap<String, &'a str>,
|
||||||
pub user_aliases: HashMap<String, &'a str>,
|
pub user_aliases: HashMap<String, &'a str>,
|
||||||
|
pub detect_extensions: Vec<&'a str>,
|
||||||
|
pub detect_files: Vec<&'a str>,
|
||||||
|
pub detect_folders: Vec<&'a str>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Default for KubernetesConfig<'a> {
|
impl<'a> Default for KubernetesConfig<'a> {
|
||||||
@ -22,6 +25,9 @@ impl<'a> Default for KubernetesConfig<'a> {
|
|||||||
disabled: true,
|
disabled: true,
|
||||||
context_aliases: HashMap::new(),
|
context_aliases: HashMap::new(),
|
||||||
user_aliases: HashMap::new(),
|
user_aliases: HashMap::new(),
|
||||||
|
detect_extensions: vec![],
|
||||||
|
detect_files: vec![],
|
||||||
|
detect_folders: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ pub struct PulumiConfig<'a> {
|
|||||||
pub symbol: &'a str,
|
pub symbol: &'a str,
|
||||||
pub style: &'a str,
|
pub style: &'a str,
|
||||||
pub disabled: bool,
|
pub disabled: bool,
|
||||||
|
pub search_upwards: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Default for PulumiConfig<'a> {
|
impl<'a> Default for PulumiConfig<'a> {
|
||||||
@ -19,6 +20,7 @@ impl<'a> Default for PulumiConfig<'a> {
|
|||||||
symbol: " ",
|
symbol: " ",
|
||||||
style: "bold 5",
|
style: "bold 5",
|
||||||
disabled: false,
|
disabled: false,
|
||||||
|
search_upwards: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ pub fn module<'a>(name: &str, context: &'a Context) -> Option<Module<'a>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut module = Module::new(name, config.description, Some(toml_config));
|
||||||
|
|
||||||
let mut is_match = context
|
let mut is_match = context
|
||||||
.try_begin_scan()?
|
.try_begin_scan()?
|
||||||
.set_extensions(&config.detect_extensions)
|
.set_extensions(&config.detect_extensions)
|
||||||
@ -46,46 +48,42 @@ pub fn module<'a>(name: &str, context: &'a Context) -> Option<Module<'a>> {
|
|||||||
Either::First(b) => b,
|
Either::First(b) => b,
|
||||||
Either::Second(s) => exec_when(s, &config, context),
|
Either::Second(s) => exec_when(s, &config, context),
|
||||||
};
|
};
|
||||||
|
|
||||||
if !is_match {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut module = Module::new(name, config.description, Some(toml_config));
|
if is_match {
|
||||||
|
let parsed = StringFormatter::new(config.format).and_then(|formatter| {
|
||||||
|
formatter
|
||||||
|
.map_meta(|var, _| match var {
|
||||||
|
"symbol" => Some(config.symbol),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.map_style(|variable| match variable {
|
||||||
|
"style" => Some(Ok(config.style)),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.map_no_escaping(|variable| match variable {
|
||||||
|
"output" => {
|
||||||
|
let output = exec_command(config.command, context, &config)?;
|
||||||
|
let trimmed = output.trim();
|
||||||
|
|
||||||
let parsed = StringFormatter::new(config.format).and_then(|formatter| {
|
if trimmed.is_empty() {
|
||||||
formatter
|
None
|
||||||
.map_meta(|var, _| match var {
|
} else {
|
||||||
"symbol" => Some(config.symbol),
|
Some(Ok(trimmed.to_string()))
|
||||||
_ => None,
|
}
|
||||||
})
|
|
||||||
.map_style(|variable| match variable {
|
|
||||||
"style" => Some(Ok(config.style)),
|
|
||||||
_ => None,
|
|
||||||
})
|
|
||||||
.map_no_escaping(|variable| match variable {
|
|
||||||
"output" => {
|
|
||||||
let output = exec_command(config.command, context, &config)?;
|
|
||||||
let trimmed = output.trim();
|
|
||||||
|
|
||||||
if trimmed.is_empty() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(Ok(trimmed.to_string()))
|
|
||||||
}
|
}
|
||||||
}
|
_ => None,
|
||||||
_ => None,
|
})
|
||||||
})
|
.parse(None, Some(context))
|
||||||
.parse(None, Some(context))
|
});
|
||||||
});
|
|
||||||
|
|
||||||
match parsed {
|
match parsed {
|
||||||
Ok(segments) => module.set_segments(segments),
|
Ok(segments) => module.set_segments(segments),
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
log::warn!("Error in module `custom.{}`:\n{}", name, error);
|
log::warn!("Error in module `custom.{}`:\n{}", name, error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
let elapsed = start.elapsed();
|
let elapsed = start.elapsed();
|
||||||
log::trace!("Took {:?} to compute custom module {:?}", elapsed, name);
|
log::trace!("Took {:?} to compute custom module {:?}", elapsed, name);
|
||||||
module.duration = elapsed;
|
module.duration = elapsed;
|
||||||
|
@ -6,6 +6,7 @@ use super::utils::path::PathExt as SPathExt;
|
|||||||
use crate::conditional_style::get_conditional_style;
|
use crate::conditional_style::get_conditional_style;
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use path_slash::{PathBufExt, PathExt};
|
use path_slash::{PathBufExt, PathExt};
|
||||||
|
use std::borrow::Cow;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use unicode_segmentation::UnicodeSegmentation;
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
@ -64,8 +65,8 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|||||||
let mut is_truncated = dir_string.is_some();
|
let mut is_truncated = dir_string.is_some();
|
||||||
|
|
||||||
// the home directory if required.
|
// the home directory if required.
|
||||||
let dir_string =
|
let dir_string = dir_string
|
||||||
dir_string.unwrap_or_else(|| contract_path(display_dir, &home_dir, &home_symbol));
|
.unwrap_or_else(|| contract_path(display_dir, &home_dir, &home_symbol).to_string());
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
let dir_string = remove_extended_path_prefix(dir_string);
|
let dir_string = remove_extended_path_prefix(dir_string);
|
||||||
@ -90,7 +91,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|||||||
let contracted_home_dir = contract_path(display_dir, &home_dir, &home_symbol);
|
let contracted_home_dir = contract_path(display_dir, &home_dir, &home_symbol);
|
||||||
to_fish_style(
|
to_fish_style(
|
||||||
config.fish_style_pwd_dir_length as usize,
|
config.fish_style_pwd_dir_length as usize,
|
||||||
contracted_home_dir,
|
contracted_home_dir.to_string(),
|
||||||
&dir_string,
|
&dir_string,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
@ -206,13 +207,17 @@ fn is_readonly_dir(path: &Path) -> bool {
|
|||||||
///
|
///
|
||||||
/// Replaces the `top_level_path` in a given `full_path` with the provided
|
/// Replaces the `top_level_path` in a given `full_path` with the provided
|
||||||
/// `top_level_replacement`.
|
/// `top_level_replacement`.
|
||||||
fn contract_path(full_path: &Path, top_level_path: &Path, top_level_replacement: &str) -> String {
|
fn contract_path<'a>(
|
||||||
|
full_path: &'a Path,
|
||||||
|
top_level_path: &'a Path,
|
||||||
|
top_level_replacement: &'a str,
|
||||||
|
) -> Cow<'a, str> {
|
||||||
if !full_path.normalised_starts_with(top_level_path) {
|
if !full_path.normalised_starts_with(top_level_path) {
|
||||||
return full_path.to_slash_lossy();
|
return full_path.to_slash_lossy();
|
||||||
}
|
}
|
||||||
|
|
||||||
if full_path.normalised_equals(top_level_path) {
|
if full_path.normalised_equals(top_level_path) {
|
||||||
return top_level_replacement.to_string();
|
return Cow::from(top_level_replacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Because we've done a normalised path comparison above
|
// Because we've done a normalised path comparison above
|
||||||
@ -223,12 +228,12 @@ fn contract_path(full_path: &Path, top_level_path: &Path, top_level_replacement:
|
|||||||
.strip_prefix(top_level_path.without_prefix())
|
.strip_prefix(top_level_path.without_prefix())
|
||||||
.unwrap_or(full_path);
|
.unwrap_or(full_path);
|
||||||
|
|
||||||
format!(
|
Cow::from(format!(
|
||||||
"{replacement}{separator}{path}",
|
"{replacement}{separator}{path}",
|
||||||
replacement = top_level_replacement,
|
replacement = top_level_replacement,
|
||||||
separator = "/",
|
separator = "/",
|
||||||
path = sub_path.to_slash_lossy()
|
path = sub_path.to_slash_lossy()
|
||||||
)
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Contract the root component of a path based on the real path
|
/// Contract the root component of a path based on the real path
|
||||||
@ -426,7 +431,7 @@ mod tests {
|
|||||||
let top_level_path = Path::new("C:\\Users\\astronaut");
|
let top_level_path = Path::new("C:\\Users\\astronaut");
|
||||||
|
|
||||||
let output = contract_path(full_path, top_level_path, "~");
|
let output = contract_path(full_path, top_level_path, "~");
|
||||||
assert_eq!(output, "C:");
|
assert_eq!(output, "C:/");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -791,7 +796,7 @@ mod tests {
|
|||||||
})
|
})
|
||||||
.path(&dir)
|
.path(&dir)
|
||||||
.collect();
|
.collect();
|
||||||
let dir_str = dir.to_slash_lossy();
|
let dir_str = dir.to_slash_lossy().to_string();
|
||||||
let expected = Some(format!(
|
let expected = Some(format!(
|
||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(
|
Color::Cyan.bold().paint(convert_path_sep(
|
||||||
@ -821,7 +826,7 @@ mod tests {
|
|||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(&to_fish_style(
|
Color::Cyan.bold().paint(convert_path_sep(&to_fish_style(
|
||||||
100,
|
100,
|
||||||
dir.to_slash_lossy(),
|
dir.to_slash_lossy().to_string(),
|
||||||
""
|
""
|
||||||
)))
|
)))
|
||||||
));
|
));
|
||||||
@ -872,7 +877,7 @@ mod tests {
|
|||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
||||||
"{}/thrusters/rocket",
|
"{}/thrusters/rocket",
|
||||||
to_fish_style(1, dir.to_slash_lossy(), "/thrusters/rocket")
|
to_fish_style(1, dir.to_slash_lossy().to_string(), "/thrusters/rocket")
|
||||||
)))
|
)))
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -994,7 +999,7 @@ mod tests {
|
|||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
||||||
"{}/above-repo/rocket-controls/src/meters/fuel-gauge",
|
"{}/above-repo/rocket-controls/src/meters/fuel-gauge",
|
||||||
to_fish_style(1, tmp_dir.path().to_slash_lossy(), "")
|
to_fish_style(1, tmp_dir.path().to_slash_lossy().to_string(), "")
|
||||||
)))
|
)))
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -1025,7 +1030,15 @@ mod tests {
|
|||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
||||||
"{}/rocket-controls/src/meters/fuel-gauge",
|
"{}/rocket-controls/src/meters/fuel-gauge",
|
||||||
to_fish_style(1, tmp_dir.path().join("above-repo").to_slash_lossy(), "")
|
to_fish_style(
|
||||||
|
1,
|
||||||
|
tmp_dir
|
||||||
|
.path()
|
||||||
|
.join("above-repo")
|
||||||
|
.to_slash_lossy()
|
||||||
|
.to_string(),
|
||||||
|
""
|
||||||
|
)
|
||||||
)))
|
)))
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -1200,7 +1213,7 @@ mod tests {
|
|||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
||||||
"{}/above-repo/rocket-controls-symlink/src/meters/fuel-gauge",
|
"{}/above-repo/rocket-controls-symlink/src/meters/fuel-gauge",
|
||||||
to_fish_style(1, tmp_dir.path().to_slash_lossy(), "")
|
to_fish_style(1, tmp_dir.path().to_slash_lossy().to_string(), "")
|
||||||
)))
|
)))
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -1237,7 +1250,15 @@ mod tests {
|
|||||||
"{} ",
|
"{} ",
|
||||||
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
Color::Cyan.bold().paint(convert_path_sep(&format!(
|
||||||
"{}/rocket-controls-symlink/src/meters/fuel-gauge",
|
"{}/rocket-controls-symlink/src/meters/fuel-gauge",
|
||||||
to_fish_style(1, tmp_dir.path().join("above-repo").to_slash_lossy(), "")
|
to_fish_style(
|
||||||
|
1,
|
||||||
|
tmp_dir
|
||||||
|
.path()
|
||||||
|
.join("above-repo")
|
||||||
|
.to_slash_lossy()
|
||||||
|
.to_string(),
|
||||||
|
""
|
||||||
|
)
|
||||||
)))
|
)))
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -119,6 +119,23 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// If we have some config for doing the directory scan then we use it but if we don't then we
|
||||||
|
// assume we should treat it like the module is enabled to preserve backward compatability.
|
||||||
|
let have_scan_config = !(config.detect_files.is_empty()
|
||||||
|
&& config.detect_folders.is_empty()
|
||||||
|
&& config.detect_extensions.is_empty());
|
||||||
|
|
||||||
|
let is_kube_project = context
|
||||||
|
.try_begin_scan()?
|
||||||
|
.set_files(&config.detect_files)
|
||||||
|
.set_folders(&config.detect_folders)
|
||||||
|
.set_extensions(&config.detect_extensions)
|
||||||
|
.is_match();
|
||||||
|
|
||||||
|
if have_scan_config && !is_kube_project {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let default_config_file = context.get_home()?.join(".kube").join("config");
|
let default_config_file = context.get_home()?.join(".kube").join("config");
|
||||||
|
|
||||||
let kube_cfg = context
|
let kube_cfg = context
|
||||||
@ -197,7 +214,7 @@ mod tests {
|
|||||||
use crate::test::ModuleRenderer;
|
use crate::test::ModuleRenderer;
|
||||||
use ansi_term::Color;
|
use ansi_term::Color;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::File;
|
use std::fs::{create_dir, File};
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -234,6 +251,128 @@ users: []
|
|||||||
dir.close()
|
dir.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_none_when_no_detected_files_or_folders() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
|
||||||
|
let filename = dir.path().join("config");
|
||||||
|
|
||||||
|
let mut file = File::create(&filename)?;
|
||||||
|
file.write_all(
|
||||||
|
b"
|
||||||
|
apiVersion: v1
|
||||||
|
clusters: []
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: test_cluster
|
||||||
|
user: test_user
|
||||||
|
name: test_context
|
||||||
|
current-context: test_context
|
||||||
|
kind: Config
|
||||||
|
preferences: {}
|
||||||
|
users: []
|
||||||
|
",
|
||||||
|
)?;
|
||||||
|
file.sync_all()?;
|
||||||
|
|
||||||
|
let actual = ModuleRenderer::new("kubernetes")
|
||||||
|
.path(dir.path())
|
||||||
|
.env("KUBECONFIG", filename.to_string_lossy().as_ref())
|
||||||
|
.config(toml::toml! {
|
||||||
|
[kubernetes]
|
||||||
|
disabled = false
|
||||||
|
detect_files = ["k8s.ext"]
|
||||||
|
detect_extensions = ["k8s"]
|
||||||
|
detect_folders = ["k8s_folder"]
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
assert_eq!(None, actual);
|
||||||
|
|
||||||
|
dir.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_detected_files_and_folder() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
|
||||||
|
let filename = dir.path().join("config");
|
||||||
|
|
||||||
|
let mut file = File::create(&filename)?;
|
||||||
|
file.write_all(
|
||||||
|
b"
|
||||||
|
apiVersion: v1
|
||||||
|
clusters: []
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: test_cluster
|
||||||
|
user: test_user
|
||||||
|
name: test_context
|
||||||
|
current-context: test_context
|
||||||
|
kind: Config
|
||||||
|
preferences: {}
|
||||||
|
users: []
|
||||||
|
",
|
||||||
|
)?;
|
||||||
|
file.sync_all()?;
|
||||||
|
|
||||||
|
let dir_with_file = tempfile::tempdir()?;
|
||||||
|
File::create(dir_with_file.path().join("k8s.ext"))?.sync_all()?;
|
||||||
|
|
||||||
|
let actual_file = ModuleRenderer::new("kubernetes")
|
||||||
|
.path(dir_with_file.path())
|
||||||
|
.env("KUBECONFIG", filename.to_string_lossy().as_ref())
|
||||||
|
.config(toml::toml! {
|
||||||
|
[kubernetes]
|
||||||
|
disabled = false
|
||||||
|
detect_files = ["k8s.ext"]
|
||||||
|
detect_extensions = ["k8s"]
|
||||||
|
detect_folders = ["k8s_folder"]
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let dir_with_ext = tempfile::tempdir()?;
|
||||||
|
File::create(dir_with_ext.path().join("test.k8s"))?.sync_all()?;
|
||||||
|
|
||||||
|
let actual_ext = ModuleRenderer::new("kubernetes")
|
||||||
|
.path(dir_with_ext.path())
|
||||||
|
.env("KUBECONFIG", filename.to_string_lossy().as_ref())
|
||||||
|
.config(toml::toml! {
|
||||||
|
[kubernetes]
|
||||||
|
disabled = false
|
||||||
|
detect_files = ["k8s.ext"]
|
||||||
|
detect_extensions = ["k8s"]
|
||||||
|
detect_folders = ["k8s_folder"]
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let dir_with_dir = tempfile::tempdir()?;
|
||||||
|
create_dir(dir_with_dir.path().join("k8s_folder"))?;
|
||||||
|
|
||||||
|
let actual_dir = ModuleRenderer::new("kubernetes")
|
||||||
|
.path(dir_with_dir.path())
|
||||||
|
.env("KUBECONFIG", filename.to_string_lossy().as_ref())
|
||||||
|
.config(toml::toml! {
|
||||||
|
[kubernetes]
|
||||||
|
disabled = false
|
||||||
|
detect_files = ["k8s.ext"]
|
||||||
|
detect_extensions = ["k8s"]
|
||||||
|
detect_folders = ["k8s_folder"]
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let expected = Some(format!(
|
||||||
|
"{} in ",
|
||||||
|
Color::Cyan.bold().paint("☸ test_context")
|
||||||
|
));
|
||||||
|
|
||||||
|
assert_eq!(expected, actual_file);
|
||||||
|
assert_eq!(expected, actual_ext);
|
||||||
|
assert_eq!(expected, actual_dir);
|
||||||
|
|
||||||
|
dir.close()
|
||||||
|
}
|
||||||
|
|
||||||
fn base_test_ctx_alias(ctx_name: &str, config: toml::Value, expected: &str) -> io::Result<()> {
|
fn base_test_ctx_alias(ctx_name: &str, config: toml::Value, expected: &str) -> io::Result<()> {
|
||||||
let dir = tempfile::tempdir()?;
|
let dir = tempfile::tempdir()?;
|
||||||
|
|
||||||
|
@ -31,6 +31,15 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|||||||
let mut module = context.new_module("pulumi");
|
let mut module = context.new_module("pulumi");
|
||||||
let config = PulumiConfig::try_load(module.config);
|
let config = PulumiConfig::try_load(module.config);
|
||||||
|
|
||||||
|
let project_file_in_cwd = context
|
||||||
|
.try_begin_scan()?
|
||||||
|
.set_files(&["Pulumi.yaml", "Pulumi.yml"])
|
||||||
|
.is_match();
|
||||||
|
|
||||||
|
if !project_file_in_cwd && !config.search_upwards {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let project_file = find_package_file(&context.logical_dir)?;
|
let project_file = find_package_file(&context.logical_dir)?;
|
||||||
|
|
||||||
let parsed = StringFormatter::new(config.format).and_then(|formatter| {
|
let parsed = StringFormatter::new(config.format).and_then(|formatter| {
|
||||||
@ -409,4 +418,47 @@ mod tests {
|
|||||||
dir.close()?;
|
dir.close()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn do_not_search_upwards() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
let child_dir = dir.path().join("child");
|
||||||
|
std::fs::create_dir(&child_dir)?;
|
||||||
|
let yaml = File::create(dir.path().join("Pulumi.yaml"))?;
|
||||||
|
yaml.sync_all()?;
|
||||||
|
|
||||||
|
let actual = ModuleRenderer::new("pulumi")
|
||||||
|
.path(&child_dir)
|
||||||
|
.logical_path(&child_dir)
|
||||||
|
.config(toml::toml! {
|
||||||
|
[pulumi]
|
||||||
|
format = "in [$symbol($stack)]($style) "
|
||||||
|
search_upwards = false
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let expected = None;
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
dir.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn search_upwards_default() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
let child_dir = dir.path().join("child");
|
||||||
|
std::fs::create_dir(&child_dir)?;
|
||||||
|
let yaml = File::create(dir.path().join("Pulumi.yaml"))?;
|
||||||
|
yaml.sync_all()?;
|
||||||
|
|
||||||
|
let actual = ModuleRenderer::new("pulumi")
|
||||||
|
.path(&child_dir)
|
||||||
|
.logical_path(&child_dir)
|
||||||
|
.config(toml::toml! {
|
||||||
|
[pulumi]
|
||||||
|
format = "in [$symbol($stack)]($style) "
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let expected = Some(format!("in {} ", Color::Fixed(5).bold().paint(" ")));
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
dir.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user