mirror of
https://github.com/asciinema/asciinema.git
synced 2025-12-16 11:48:13 +01:00
Save session exit status in the recording file as "x" event
This commit is contained in:
@@ -51,6 +51,7 @@ pub enum EventData {
|
||||
Input(String),
|
||||
Resize(u16, u16),
|
||||
Marker(String),
|
||||
Exit(i32),
|
||||
Other(char, String),
|
||||
}
|
||||
|
||||
@@ -175,6 +176,13 @@ impl Event {
|
||||
data: EventData::Marker(label),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exit(time: u64, status: i32) -> Self {
|
||||
Event {
|
||||
time,
|
||||
data: EventData::Exit(status),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn limit_idle_time(
|
||||
|
||||
@@ -195,6 +195,7 @@ impl V2Encoder {
|
||||
Input(data) => ('i', self.to_json_string(data)),
|
||||
Resize(cols, rows) => ('r', self.to_json_string(&format!("{cols}x{rows}"))),
|
||||
Marker(data) => ('m', self.to_json_string(data)),
|
||||
Exit(data) => ('x', self.to_json_string(&data.to_string())),
|
||||
Other(code, data) => (*code, self.to_json_string(data)),
|
||||
};
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ enum V3EventCode {
|
||||
Input,
|
||||
Resize,
|
||||
Marker,
|
||||
Exit,
|
||||
Other(char),
|
||||
}
|
||||
|
||||
@@ -150,6 +151,7 @@ impl Parser {
|
||||
},
|
||||
|
||||
V3EventCode::Marker => EventData::Marker(event.data),
|
||||
V3EventCode::Exit => EventData::Exit(event.data.parse()?),
|
||||
V3EventCode::Other(c) => EventData::Other(c, event.data),
|
||||
};
|
||||
|
||||
@@ -174,6 +176,7 @@ where
|
||||
"i" => Ok(Input),
|
||||
"r" => Ok(Resize),
|
||||
"m" => Ok(Marker),
|
||||
"x" => Ok(Exit),
|
||||
"" => Err(Error::custom("missing event code")),
|
||||
s => Ok(Other(s.chars().next().unwrap())),
|
||||
}
|
||||
@@ -211,6 +214,7 @@ impl V3Encoder {
|
||||
Input(data) => ('i', self.to_json_string(data)),
|
||||
Resize(cols, rows) => ('r', self.to_json_string(&format!("{cols}x{rows}"))),
|
||||
Marker(data) => ('m', self.to_json_string(data)),
|
||||
Exit(data) => ('x', self.to_json_string(&data.to_string())),
|
||||
Other(code, data) => (*code, self.to_json_string(data)),
|
||||
};
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@ impl From<session::Event> for asciicast::Event {
|
||||
asciicast::Event::resize(time, tty_size.into())
|
||||
}
|
||||
session::Event::Marker(time, label) => asciicast::Event::marker(time, label),
|
||||
session::Event::Exit(time, status) => asciicast::Event::exit(time, status),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ pub trait Handler {
|
||||
fn output(&mut self, time: Duration, data: &[u8]) -> bool;
|
||||
fn input(&mut self, time: Duration, data: &[u8]) -> bool;
|
||||
fn resize(&mut self, time: Duration, tty_size: TtySize) -> bool;
|
||||
fn stop(self) -> Self;
|
||||
fn stop(self, time: Duration, exit_status: i32) -> Self;
|
||||
}
|
||||
|
||||
pub fn exec<S: AsRef<str>, T: Tty, H: Handler, R: HandlerStarter<H>>(
|
||||
@@ -49,7 +49,7 @@ pub fn exec<S: AsRef<str>, T: Tty, H: Handler, R: HandlerStarter<H>>(
|
||||
match result {
|
||||
pty::ForkptyResult::Parent { child, master } => {
|
||||
handle_parent(master, child, tty, &mut handler, epoch)
|
||||
.map(|code| (code, handler.stop()))
|
||||
.map(|code| (code, handler.stop(epoch.elapsed(), code)))
|
||||
}
|
||||
|
||||
pty::ForkptyResult::Child => {
|
||||
@@ -419,7 +419,7 @@ mod tests {
|
||||
true
|
||||
}
|
||||
|
||||
fn stop(self) -> Self {
|
||||
fn stop(self, _time: Duration, _exit_status: i32) -> Self {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ pub enum Event {
|
||||
Input(u64, String),
|
||||
Resize(u64, TtySize),
|
||||
Marker(u64, String),
|
||||
Exit(u64, i32),
|
||||
}
|
||||
|
||||
impl<N: Notifier> SessionStarter<N> {
|
||||
@@ -214,7 +215,10 @@ impl<N: Notifier> pty::Handler for Session<N> {
|
||||
true
|
||||
}
|
||||
|
||||
fn stop(self) -> Self {
|
||||
fn stop(self, time: Duration, exit_status: i32) -> Self {
|
||||
let msg = Event::Exit(self.elapsed_time(time), exit_status);
|
||||
self.sender.send(msg).expect("exit send should succeed");
|
||||
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,6 +111,8 @@ async fn run(
|
||||
let _ = broadcast_tx.send(Event::Marker(last_event_id, time, label));
|
||||
stream_time = time;
|
||||
}
|
||||
|
||||
session::Event::Exit(_time, _status) => {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user