Skip to content

Commit 2373a38

Browse files
authored
feat: support env vars in plugin urls (jdx#2370)
1 parent 6531358 commit 2373a38

File tree

9 files changed

+75
-20
lines changed

9 files changed

+75
-20
lines changed

docs/dev-tools/aliases.md

+9
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,12 @@ echo "lts-fermium 14"
2626
Because this is mise-specific functionality not currently used by asdf it isn't likely to be in any
2727
plugin currently, but plugin authors can add this script without impacting asdf users.
2828
:::
29+
30+
## Templates
31+
32+
Alias values can be templates, see [Templates](/templates) for details.
33+
34+
```toml
35+
[alias.node]
36+
current = "{{exec(command='node --version')}}"
37+
```

docs/plugins.md

+9
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,12 @@ any option and it will be passed to the plugin in that format.
4646

4747
Currently this only supports simple strings, but we can make it compatible with more complex types
4848
(arrays, tables) fairly easily if there is a need for it.
49+
50+
## Templates
51+
52+
Plugin custom repository values can be templates, see [Templates](/templates) for details.
53+
54+
```toml
55+
[plugins]
56+
my-plugin = "https://{{ get_env(name='GIT_USR', default='empty') }}:{{ get_env(name='GIT_PWD', default='empty') }}@github.com/foo/my-plugin.git"
57+
```

docs/templates.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ PROJECT_NAME = "{{config_root | split(pat='/') | last}}"
2626
Here's another using `exec()`:
2727

2828
```toml
29-
[aliases]
29+
[alias.node]
3030
current = "{{exec(command='node --version')}}"
3131
```
32+
33+
Or one that uses [`get_env()`](https://keats.github.io/tera/docs/#get-env):
34+
35+
```toml
36+
[plugins]
37+
my-plugin = "https://{{ get_env(name='GIT_USR', default='empty') }}:{{ get_env(name='GIT_PWD', default='empty') }}@github.com/foo/my-plugin.git"
38+
```

src/cli/alias/ls.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub struct AliasLs {
2727

2828
impl AliasLs {
2929
pub fn run(self) -> Result<()> {
30-
let config = Config::get();
30+
let config = Config::try_get()?;
3131
let rows = config
3232
.get_all_aliases()
3333
.iter()

src/cli/alias/set.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub struct AliasSet {
2020

2121
impl AliasSet {
2222
pub fn run(self) -> Result<()> {
23-
let mut global_config = Config::get().global_config()?;
23+
let mut global_config = Config::try_get()?.global_config()?;
2424
global_config.set_alias(&self.plugin, &self.alias, &self.value)?;
2525
global_config.save()
2626
}

src/cli/alias/unset.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub struct AliasUnset {
1818

1919
impl AliasUnset {
2020
pub fn run(self) -> Result<()> {
21-
let mut global_config = Config::get().global_config()?;
21+
let mut global_config = Config::try_get()?.global_config()?;
2222
global_config.remove_alias(&self.plugin, &self.alias)?;
2323
global_config.save()
2424
}

src/config/config_file/mise_toml.rs

+27-5
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,15 @@ impl ConfigFile for MiseToml {
219219
}
220220
}
221221

222-
fn plugins(&self) -> HashMap<String, String> {
223-
self.plugins.clone()
222+
fn plugins(&self) -> eyre::Result<HashMap<String, String>> {
223+
self.plugins
224+
.clone()
225+
.into_iter()
226+
.map(|(k, v)| {
227+
let v = self.parse_template(&v)?;
228+
Ok((k, v))
229+
})
230+
.collect()
224231
}
225232

226233
fn env_entries(&self) -> eyre::Result<Vec<EnvDirective>> {
@@ -324,8 +331,23 @@ impl ConfigFile for MiseToml {
324331
Ok(trs)
325332
}
326333

327-
fn aliases(&self) -> AliasMap {
328-
self.alias.clone()
334+
fn aliases(&self) -> eyre::Result<AliasMap> {
335+
self.alias
336+
.clone()
337+
.iter()
338+
.map(|(k, v)| {
339+
let k = k.clone();
340+
let v: Result<BTreeMap<String, String>, eyre::Error> = v
341+
.clone()
342+
.into_iter()
343+
.map(|(k, v)| {
344+
let v = self.parse_template(&v)?;
345+
Ok((k, v))
346+
})
347+
.collect();
348+
v.map(|v| (k, v))
349+
})
350+
.collect()
329351
}
330352

331353
fn task_config(&self) -> &TaskConfig {
@@ -878,7 +900,7 @@ mod tests {
878900
let cf = MiseToml::from_file(&dirs::HOME.join("fixtures/.mise.toml")).unwrap();
879901

880902
assert_debug_snapshot!(cf.env_entries().unwrap());
881-
assert_debug_snapshot!(cf.plugins());
903+
assert_debug_snapshot!(cf.plugins().unwrap());
882904
assert_snapshot!(replace_path(&format!(
883905
"{:#?}",
884906
cf.to_tool_request_set().unwrap()

src/config/config_file/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ pub trait ConfigFile: Debug + Send + Sync {
6060
None => None,
6161
}
6262
}
63-
fn plugins(&self) -> HashMap<String, String> {
64-
Default::default()
63+
fn plugins(&self) -> eyre::Result<HashMap<String, String>> {
64+
Ok(Default::default())
6565
}
6666
fn env_entries(&self) -> eyre::Result<Vec<EnvDirective>> {
6767
Ok(Default::default())
@@ -77,8 +77,8 @@ pub trait ConfigFile: Debug + Send + Sync {
7777
Ok(self.to_tool_request_set()?.into())
7878
}
7979
fn to_tool_request_set(&self) -> eyre::Result<ToolRequestSet>;
80-
fn aliases(&self) -> AliasMap {
81-
Default::default()
80+
fn aliases(&self) -> eyre::Result<AliasMap> {
81+
Ok(Default::default())
8282
}
8383
fn task_config(&self) -> &TaskConfig {
8484
static DEFAULT_TASK_CONFIG: Lazy<TaskConfig> = Lazy::new(TaskConfig::default);

src/config/mod.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,11 @@ impl Config {
7777
let config_paths = load_config_paths(&config_filenames);
7878
let config_files = load_all_config_files(&config_paths, &legacy_files)?;
7979

80-
let repo_urls = config_files.values().flat_map(|cf| cf.plugins()).collect();
81-
8280
let config = Self {
83-
aliases: load_aliases(&config_files),
81+
aliases: load_aliases(&config_files)?,
8482
project_root: get_project_root(&config_files),
83+
repo_urls: load_plugins(&config_files)?,
8584
config_files,
86-
repo_urls,
8785
..Default::default()
8886
};
8987

@@ -603,18 +601,28 @@ fn parse_config_file(
603601
}
604602
}
605603

606-
fn load_aliases(config_files: &ConfigMap) -> AliasMap {
604+
fn load_aliases(config_files: &ConfigMap) -> Result<AliasMap> {
607605
let mut aliases: AliasMap = AliasMap::new();
608606

609607
for config_file in config_files.values() {
610-
for (plugin, plugin_aliases) in config_file.aliases() {
608+
for (plugin, plugin_aliases) in config_file.aliases()? {
611609
for (from, to) in plugin_aliases {
612610
aliases.entry(plugin.clone()).or_default().insert(from, to);
613611
}
614612
}
615613
}
616614

617-
aliases
615+
Ok(aliases)
616+
}
617+
618+
fn load_plugins(config_files: &ConfigMap) -> Result<HashMap<String, String>> {
619+
let mut plugins = HashMap::new();
620+
for config_file in config_files.values() {
621+
for (plugin, url) in config_file.plugins()? {
622+
plugins.insert(plugin.clone(), url.clone());
623+
}
624+
}
625+
Ok(plugins)
618626
}
619627

620628
impl Debug for Config {

0 commit comments

Comments
 (0)