Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 44 additions & 4 deletions crates/openshell-cli/src/commands/common.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -446,7 +446,7 @@ pub fn noninteractive_active_label(step: ProvisioningStep) -> String {

pub fn handle_platform_progress_event(
event: &PlatformEvent,
display: &mut Option<ProvisioningDisplay>,
mut display: Option<&mut ProvisioningDisplay>,
provision_start: Instant,
) -> bool {
let completed_step = event
Expand All@@ -472,7 +472,7 @@ pub fn handle_platform_progress_event(
.metadata
.get(PROGRESS_COMPLETE_LABEL_KEY)
.map_or_else(|| step.completed_label(), String::as_str);
if let Some(d) = display.as_mut() {
if let Some(d) = display.as_deref_mut() {
d.complete_step_with_label(step, label);
} else {
let ts = format_timestamp(provision_start.elapsed());
Expand All@@ -481,13 +481,13 @@ pub fn handle_platform_progress_event(
}

if let Some(step) = active_step
&& let Some(d) = display.as_mut()
&& let Some(d) = display.as_deref_mut()
{
d.set_active_step(step);
}

if let Some(detail) = active_detail {
if let Some(d) = display.as_mut() {
if let Some(d) = display {
d.set_active_detail(detail);
} else {
let ts = format_timestamp(provision_start.elapsed());
Expand DownExpand Up@@ -1072,6 +1072,46 @@ mod tests {
assert!(err.to_string().contains("invalid duration"));
}

#[test]
fn platform_progress_events_update_borrowed_display_without_duplicate_steps() {
let event = PlatformEvent {
metadata: HashMap::from([
(
PROGRESS_COMPLETE_STEP_KEY.to_string(),
PROGRESS_STEP_REQUESTING_SANDBOX.to_string(),
),
(
PROGRESS_ACTIVE_STEP_KEY.to_string(),
PROGRESS_STEP_STARTING_SANDBOX.to_string(),
),
]),
..PlatformEvent::default()
};
let mut display = ProvisioningDisplay::new();

assert!(handle_platform_progress_event(
&event,
Some(&mut display),
Instant::now(),
));
assert!(handle_platform_progress_event(
&event,
Some(&mut display),
Instant::now(),
));

assert_eq!(
display.completed_steps,
vec![ProvisioningStep::RequestingSandbox]
);
assert_eq!(display.completed_bars.len(), 1);
assert_eq!(
display.active_label,
ProvisioningStep::StartingSandbox.active_label()
);
display.clear();
}

// helper for building input
fn env(pairs: &[(&str, &str)]) -> HashMap<String, String> {
pairs
Expand Down
10 changes: 2 additions & 8 deletions crates/openshell-cli/src/run.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -766,16 +766,10 @@ pub async fn sandbox_create(
// the deadline when applicable.
let handled = match &mut display {
ProgressOutput::Interactive(d) => {
let mut opt = Some(std::mem::replace(d, ProvisioningDisplay::new()));
let h = handle_platform_progress_event(&ev, &mut opt, provision_start);
if let Some(inner) = opt {
*d = inner;
}
h
handle_platform_progress_event(&ev, Some(d), provision_start)
}
ProgressOutput::Plain => {
let mut opt: Option<ProvisioningDisplay> = None;
handle_platform_progress_event(&ev, &mut opt, provision_start)
handle_platform_progress_event(&ev, None, provision_start)
}
ProgressOutput::Silent => false,
};
Expand Down
Loading