summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-03-08 02:20:04 -0500
committerJesse Luehrs <doy@tozt.net>2022-03-08 02:20:04 -0500
commitd66f4773bccaee61c1c998640dcdb048223f8900 (patch)
tree295e2877f16d0661c7de44e1af77ca414f59bc64
parent4e55372bf71a0f20c040a25d9254a2986a9f5f18 (diff)
downloadnbsh-d66f4773bccaee61c1c998640dcdb048223f8900.tar.gz
nbsh-d66f4773bccaee61c1c998640dcdb048223f8900.zip
allow recursive aliases
-rw-r--r--src/runner/mod.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/runner/mod.rs b/src/runner/mod.rs
index 6fcd28e..91e268a 100644
--- a/src/runner/mod.rs
+++ b/src/runner/mod.rs
@@ -263,10 +263,22 @@ async fn run_pipeline(
let pipeline = pipeline.eval(env).await?;
let mut exes: Vec<_> = pipeline.into_exes().collect();
for exe in &mut exes {
- if let Some(alias) = config.alias_for(exe.exe()) {
+ let mut seen = std::collections::HashSet::new();
+ while let Some(alias) = config.alias_for(exe.exe()) {
let mut new = alias.clone().eval(env).await?;
+ let override_self = exe.exe() == new.exe();
+ if seen.contains(new.exe()) {
+ return Err(anyhow!(
+ "recursive alias found: {}",
+ new.exe().display()
+ ));
+ }
+ seen.insert(new.exe().to_path_buf());
new.append(exe.clone());
*exe = new;
+ if override_self {
+ break;
+ }
}
}
let cmds = exes