Skip to content

Commit

Permalink
Fix target state.
Browse files Browse the repository at this point in the history
  • Loading branch information
milesj committed Jan 24, 2025
1 parent 6abc28f commit 365dd1b
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 69 deletions.
42 changes: 25 additions & 17 deletions crates/task-runner/src/task_runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ pub struct TaskRunner<'task> {
pub operations: OperationList,
pub remote_state: Option<ActionState<'task>>,
pub report_item: TaskReportItem,
pub target_state: Option<TargetState>,
}

impl<'task> TaskRunner<'task> {
Expand Down Expand Up @@ -76,6 +77,7 @@ impl<'task> TaskRunner<'task> {
output_style: task.options.output_style,
..Default::default()
},
target_state: None,
task,
app,
operations: OperationList::default(),
Expand All @@ -93,7 +95,7 @@ impl<'task> TaskRunner<'task> {
) -> miette::Result<Option<String>> {
// If a dependency has failed or been skipped, we should skip this task
if !self.is_dependencies_complete(context)? {
self.skip(context)?;
self.skip()?;

return Ok(None);
}
Expand All @@ -108,7 +110,7 @@ impl<'task> TaskRunner<'task> {
let hash = self.generate_hash(context, node).await?;

// Exit early if this build has already been cached/hashed
if self.hydrate(context, &hash).await? {
if self.hydrate(&hash).await? {
return Ok(Some(hash));
}

Expand Down Expand Up @@ -147,6 +149,11 @@ impl<'task> TaskRunner<'task> {

match result {
Ok(maybe_hash) => {
context.set_target_state(
&self.task.target,
self.target_state.take().unwrap_or(TargetState::Passthrough),
);

self.report_item.hash = maybe_hash.clone();

self.app.console.reporter.on_task_completed(
Expand All @@ -163,6 +170,11 @@ impl<'task> TaskRunner<'task> {
})
}
Err(error) => {
context.set_target_state(
&self.task.target,
self.target_state.take().unwrap_or(TargetState::Failed),
);

self.inject_failed_task_execution(Some(&error))?;

self.app.console.reporter.on_task_completed(
Expand Down Expand Up @@ -485,7 +497,7 @@ impl<'task> TaskRunner<'task> {
) -> miette::Result<()> {
// If the task is a no-operation, we should exit early
if self.task.is_no_op() {
self.skip_no_op(context)?;
self.skip_no_op()?;

return Ok(());
}
Expand Down Expand Up @@ -546,7 +558,7 @@ impl<'task> TaskRunner<'task> {
self.operations.merge(result.attempts);

// Update the action state based on the result
context.set_target_state(&self.task.target, result.run_state);
self.target_state = Some(result.run_state);

// If the execution as a whole failed, return the error.
// We do this here instead of in `execute` so that we can
Expand All @@ -572,22 +584,22 @@ impl<'task> TaskRunner<'task> {
Ok(())
}

#[instrument(skip_all)]
pub fn skip(&mut self, context: &ActionContext) -> miette::Result<()> {
#[instrument(skip(self))]
pub fn skip(&mut self) -> miette::Result<()> {
debug!(task_target = self.task.target.as_str(), "Skipping task");

self.operations.push(Operation::new_finished(
OperationMeta::TaskExecution(Default::default()),
ActionStatus::Skipped,
));

context.set_target_state(&self.task.target, TargetState::Skipped);
self.target_state = Some(TargetState::Skipped);

Ok(())
}

#[instrument(skip(self, context))]
pub fn skip_no_op(&mut self, context: &ActionContext) -> miette::Result<()> {
#[instrument(skip(self))]
pub fn skip_no_op(&mut self) -> miette::Result<()> {
debug!(
task_target = self.task.target.as_str(),
"Skipping task as its a no-operation"
Expand All @@ -598,10 +610,7 @@ impl<'task> TaskRunner<'task> {
ActionStatus::Passed,
));

context.set_target_state(
&self.task.target,
TargetState::from_hash(self.report_item.hash.as_deref()),
);
self.target_state = Some(TargetState::from_hash(self.report_item.hash.as_deref()));

Ok(())
}
Expand Down Expand Up @@ -648,8 +657,8 @@ impl<'task> TaskRunner<'task> {
Ok(archived)
}

#[instrument(skip(self, context))]
pub async fn hydrate(&mut self, context: &ActionContext, hash: &str) -> miette::Result<bool> {
#[instrument(skip(self))]
pub async fn hydrate(&mut self, hash: &str) -> miette::Result<bool> {
let mut operation = Operation::output_hydration();

// Not cached
Expand Down Expand Up @@ -745,9 +754,8 @@ impl<'task> TaskRunner<'task> {

self.persist_state(&operation)?;

context.set_target_state(&self.task.target, TargetState::Passed(hash.to_owned()));

self.operations.push(operation);
self.target_state = Some(TargetState::Passed(hash.to_owned()));

Ok(true)
}
Expand Down
69 changes: 17 additions & 52 deletions crates/task-runner/tests/task_runner_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -895,9 +895,8 @@ mod task_runner {
async fn creates_an_operation() {
let container = TaskRunnerContainer::new("runner", "base").await;
let mut runner = container.create_runner();
let context = ActionContext::default();

runner.skip(&context).unwrap();
runner.skip().unwrap();

let operation = runner.operations.last().unwrap();

Expand All @@ -909,18 +908,10 @@ mod task_runner {
async fn sets_skipped_state() {
let container = TaskRunnerContainer::new("runner", "base").await;
let mut runner = container.create_runner();
let context = ActionContext::default();

runner.skip(&context).unwrap();
runner.skip().unwrap();

assert_eq!(
context
.target_states
.get(&runner.task.target)
.unwrap()
.get(),
&TargetState::Skipped
);
assert_eq!(runner.target_state.as_ref().unwrap(), &TargetState::Skipped);
}
}

Expand All @@ -931,9 +922,8 @@ mod task_runner {
async fn creates_an_operation() {
let container = TaskRunnerContainer::new("runner", "base").await;
let mut runner = container.create_runner();
let context = ActionContext::default();

runner.skip_no_op(&context).unwrap();
runner.skip_no_op().unwrap();

let operation = runner.operations.last().unwrap();

Expand All @@ -945,34 +935,24 @@ mod task_runner {
async fn sets_passthrough_state() {
let container = TaskRunnerContainer::new("runner", "base").await;
let mut runner = container.create_runner();
let context = ActionContext::default();

runner.skip_no_op(&context).unwrap();
runner.skip_no_op().unwrap();

assert_eq!(
context
.target_states
.get(&runner.task.target)
.unwrap()
.get(),
runner.target_state.as_ref().unwrap(),
&TargetState::Passthrough
);
}
#[tokio::test]
async fn sets_completed_state() {
let container = TaskRunnerContainer::new("runner", "base").await;
let mut runner = container.create_runner();
let context = ActionContext::default();

runner.report_item.hash = Some("hash123".into());
runner.skip_no_op(&context).unwrap();
runner.skip_no_op().unwrap();

assert_eq!(
context
.target_states
.get(&runner.task.target)
.unwrap()
.get(),
runner.target_state.as_ref().unwrap(),
&TargetState::Passed("hash123".into())
);
}
Expand Down Expand Up @@ -1046,8 +1026,7 @@ mod task_runner {

let mut runner = container.create_runner();

let context = ActionContext::default();
let result = runner.hydrate(&context, "hash123").await.unwrap();
let result = runner.hydrate("hash123").await.unwrap();

assert!(!result);

Expand Down Expand Up @@ -1077,8 +1056,7 @@ mod task_runner {

setup_previous_state(&container, &mut runner);

let context = ActionContext::default();
let result = runner.hydrate(&context, "hash123").await.unwrap();
let result = runner.hydrate("hash123").await.unwrap();

assert!(result);

Expand All @@ -1095,15 +1073,10 @@ mod task_runner {

setup_previous_state(&container, &mut runner);

let context = ActionContext::default();
runner.hydrate(&context, "hash123").await.unwrap();
runner.hydrate("hash123").await.unwrap();

assert_eq!(
context
.target_states
.get(&runner.task.target)
.unwrap()
.get(),
runner.target_state.as_ref().unwrap(),
&TargetState::Passed("hash123".into())
);
}
Expand All @@ -1127,8 +1100,7 @@ mod task_runner {

setup_local_state(&container, &mut runner);

let context = ActionContext::default();
let result = runner.hydrate(&context, "hash123").await.unwrap();
let result = runner.hydrate("hash123").await.unwrap();

assert!(result);

Expand All @@ -1145,15 +1117,10 @@ mod task_runner {

setup_local_state(&container, &mut runner);

let context = ActionContext::default();
runner.hydrate(&context, "hash123").await.unwrap();
runner.hydrate("hash123").await.unwrap();

assert_eq!(
context
.target_states
.get(&runner.task.target)
.unwrap()
.get(),
runner.target_state.as_ref().unwrap(),
&TargetState::Passed("hash123".into())
);
}
Expand All @@ -1165,8 +1132,7 @@ mod task_runner {

setup_local_state(&container, &mut runner);

let context = ActionContext::default();
runner.hydrate(&context, "hash123").await.unwrap();
runner.hydrate("hash123").await.unwrap();

let output_file = container.sandbox.path().join("project/file.txt");

Expand All @@ -1181,8 +1147,7 @@ mod task_runner {

setup_local_state(&container, &mut runner);

let context = ActionContext::default();
let result = runner.hydrate(&context, "hash123").await.unwrap();
let result = runner.hydrate("hash123").await.unwrap();

assert!(result);

Expand Down

0 comments on commit 365dd1b

Please sign in to comment.