diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-03-08 02:20:04 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-03-08 02:20:04 -0500 |
commit | d66f4773bccaee61c1c998640dcdb048223f8900 (patch) | |
tree | 295e2877f16d0661c7de44e1af77ca414f59bc64 | |
parent | 4e55372bf71a0f20c040a25d9254a2986a9f5f18 (diff) | |
download | nbsh-d66f4773bccaee61c1c998640dcdb048223f8900.tar.gz nbsh-d66f4773bccaee61c1c998640dcdb048223f8900.zip |
allow recursive aliases
-rw-r--r-- | src/runner/mod.rs | 14 |
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 |