Add semantic configuration resume evidence
This commit is contained in:
@@ -65,17 +65,19 @@ func Plan(ctx context.Context, args []string, out io.Writer) error {
|
||||
return err
|
||||
}
|
||||
for _, selectedStage := range stages {
|
||||
semanticConfig, err := currentStageSemanticConfig(selectedStage, stageEnv)
|
||||
if err != nil {
|
||||
return fmt.Errorf("plan: fingerprint semantic configuration for stage %q: %w", selectedStage.Name(), err)
|
||||
}
|
||||
action := decideStageAction(selectedStage, model, request.Force)
|
||||
var validation *stage.ResumeValidation
|
||||
if validator, ok := selectedStage.(stage.ResumeValidator); ok &&
|
||||
(action == stageActionSkip || selectedStage.Name() == "analyze") {
|
||||
checked, validationErr := validator.ValidateResume(ctx, stageEnv, model)
|
||||
if action == stageActionSkip {
|
||||
checked, validationErr := evaluateStageResume(ctx, selectedStage, stageEnv, model, semanticConfig)
|
||||
if validationErr != nil {
|
||||
return fmt.Errorf("plan: validate resume for stage %q: %w", selectedStage.Name(), validationErr)
|
||||
}
|
||||
checked = checked.Normalized()
|
||||
validation = &checked
|
||||
if action == stageActionSkip && !checked.Resumable {
|
||||
validation = checked
|
||||
if checked != nil && !checked.Resumable {
|
||||
at := time.Now().UTC()
|
||||
model.MarkStageStale(selectedStage.Name(), at, checked.Reason)
|
||||
if _, invalidationErr := invalidateDependentSucceededStagesWithReason(
|
||||
@@ -86,6 +88,16 @@ func Plan(ctx context.Context, args []string, out io.Writer) error {
|
||||
action = stageActionRun
|
||||
}
|
||||
}
|
||||
if action == stageActionRun && selectedStage.Name() == "analyze" {
|
||||
if validator, ok := selectedStage.(stage.ResumeValidator); ok {
|
||||
checked, validationErr := validator.ValidateResume(ctx, stageEnv, model)
|
||||
if validationErr != nil {
|
||||
return fmt.Errorf("plan: validate resume for stage %q: %w", selectedStage.Name(), validationErr)
|
||||
}
|
||||
checked = checked.Normalized()
|
||||
validation = &checked
|
||||
}
|
||||
}
|
||||
if action == stageActionRun {
|
||||
runCount++
|
||||
} else {
|
||||
@@ -100,7 +112,7 @@ func Plan(ctx context.Context, args []string, out io.Writer) error {
|
||||
}
|
||||
}
|
||||
if action == stageActionRun {
|
||||
if err := modelPlannedStageRun(model, selectedStage, cfg, request.Force); err != nil {
|
||||
if err := modelPlannedStageRun(model, selectedStage, cfg, request.Force, semanticConfig); err != nil {
|
||||
return fmt.Errorf("plan: model stage %q: %w", selectedStage.Name(), err)
|
||||
}
|
||||
}
|
||||
@@ -129,7 +141,13 @@ func cloneManifestForPlan(source *manifest.Manifest, cfg *config.Config) (*manif
|
||||
return &cloned, nil
|
||||
}
|
||||
|
||||
func modelPlannedStageRun(model *manifest.Manifest, selectedStage stage.Stage, cfg *config.Config, force bool) error {
|
||||
func modelPlannedStageRun(
|
||||
model *manifest.Manifest,
|
||||
selectedStage stage.Stage,
|
||||
cfg *config.Config,
|
||||
force bool,
|
||||
semanticConfig *manifest.SemanticConfigFingerprint,
|
||||
) error {
|
||||
prior := capturePriorStageOutcome(model, selectedStage.Name())
|
||||
at := time.Now().UTC()
|
||||
model.MarkStageRunning(selectedStage.Name(), at)
|
||||
@@ -142,6 +160,7 @@ func modelPlannedStageRun(model *manifest.Manifest, selectedStage stage.Stage, c
|
||||
}
|
||||
if reason := plannedSelfSkipReason(selectedStage.Name(), cfg); reason != "" {
|
||||
model.MarkStageSkipped(selectedStage.Name(), at, reason)
|
||||
setSessionStageSemanticConfig(model, selectedStage.Name(), semanticConfig)
|
||||
if !prior.isSameSelfSkip(reason) {
|
||||
_, err := invalidateDependentSucceededStagesWithReason(
|
||||
model, selectedStage.Name(), at, staleReasonSelfSkip,
|
||||
@@ -151,6 +170,7 @@ func modelPlannedStageRun(model *manifest.Manifest, selectedStage stage.Stage, c
|
||||
return nil
|
||||
}
|
||||
model.MarkStageSucceeded(selectedStage.Name(), at, nil)
|
||||
setSessionStageSemanticConfig(model, selectedStage.Name(), semanticConfig)
|
||||
if !prior.exists || prior.status != manifest.StatusSucceeded {
|
||||
if _, err := invalidateDependentSucceededStagesWithReason(
|
||||
model, selectedStage.Name(), at, staleReasonChangedResult,
|
||||
|
||||
Reference in New Issue
Block a user