summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRory Dudley2024-06-21 15:40:49 -0400
committerRory Dudley2024-06-21 15:40:49 -0400
commite23e4a036008a6f3a3356d48434615a05dcc17e0 (patch)
treea93bfcf486db01af7efb51dd15835c3ca31bad53
parentfedd4c31b0d1c6d036b1105a74b6e6a1f135f2b4 (diff)
downloaddwarvish-e23e4a036008a6f3a3356d48434615a05dcc17e0.tar.gz
Fix capturing output for internal poems
Sometime when the switch to the new built-in command system was happening, we lost the logic to force the capture the output of STDOUT, mainly used for running internal poems (i.e. 'ls `ls`'). This patch adds a new field to the Environment struct, called fc (force capture). It gets set to true before running internal poems, and unset afterwards. Finally, some checks were added to the incant!() macro to properly handle STDOUT when fc is set.
-rw-r--r--src/compose/environment.rs3
-rw-r--r--src/poem/elements/verse/logic.rs10
-rw-r--r--src/poem/recite.rs2
3 files changed, 14 insertions, 1 deletions
diff --git a/src/compose/environment.rs b/src/compose/environment.rs
index 18d59c4..151c7a5 100644
--- a/src/compose/environment.rs
+++ b/src/compose/environment.rs
@@ -14,6 +14,7 @@ use std::collections::HashMap;
/// bins - A lookup table for +x files, constructed from the $PATH
/// cs - Indication of callstack level, helpful for recursively dealing with
/// aliases
+/// fc - Force the capture of stdout (for internal poems)
///
/// # Examples
/// ```
@@ -29,6 +30,7 @@ pub struct Environment {
pub aliases: HashMap<String, String>,
pub bins: Vec<String>,
pub cs: u8,
+ pub fc: bool,
}
impl Environment {
@@ -38,6 +40,7 @@ impl Environment {
aliases: HashMap::new(),
bins: Vec::new(),
cs: 0,
+ fc: false,
}
}
}
diff --git a/src/poem/elements/verse/logic.rs b/src/poem/elements/verse/logic.rs
index c1d3d62..f5efdee 100644
--- a/src/poem/elements/verse/logic.rs
+++ b/src/poem/elements/verse/logic.rs
@@ -28,6 +28,11 @@ macro_rules! incant {
$command.stderr(Stdio::piped());
}
+ // Capture stdout if (f)orce (c)apture is set
+ if $env.fc {
+ $command.stdout(Stdio::piped());
+ }
+
// Detach the process group, if in the [Rune::Quiet] meter
if $self.meter == Rune::Quiet {
$command.process_group(0);
@@ -59,6 +64,9 @@ macro_rules! incant {
$out.append(&mut output.stdout);
err.append(&mut output.stderr);
}
+ if $env.fc {
+ $out.append(&mut output.stdout);
+ }
}
Rune::Couplet => {
output = child.wait_with_output()?;
@@ -210,7 +218,7 @@ macro_rules! incant {
}
err.clear();
- if $self.meter != Rune::Couplet {
+ if $self.meter != Rune::Couplet && $env.fc != true {
$out.clear();
}
diff --git a/src/poem/recite.rs b/src/poem/recite.rs
index b27ef75..7ceecca 100644
--- a/src/poem/recite.rs
+++ b/src/poem/recite.rs
@@ -98,7 +98,9 @@ impl Reciteable for Poem {
Some(poem) => poem,
None => break, // TODO: Return an error
};
+ env.fc = true;
let mut out = poem.recite(env)?;
+ env.fc = false;
match out.last() {
Some(last) => {
if *last == b'\n' {