Replace restore phase globals

This commit is contained in:
2026-09-05 18:05:18 +00:00
parent f51b9bb046
commit 85663f5bc9
7 changed files with 93 additions and 185 deletions

View File

@@ -10,19 +10,18 @@ import (
"os"
"strings"
"gitea.maximumdirect.net/eric/narratio/internal/adapters/storage"
"gitea.maximumdirect.net/eric/narratio/internal/artifacts"
"gitea.maximumdirect.net/eric/narratio/internal/config"
"gitea.maximumdirect.net/eric/narratio/internal/logging"
)
var newObjectStoreFromConfigFn = storage.NewObjectStoreFromConfig
var discoverRemoteCurrentStateFn = discoverRemoteCurrentState
var buildRestorePlanFn = buildRestorePlan
var executeRestorePlanFn = executeRestorePlan
// Restore validates restore CLI/config inputs and storage preflight for future restore phases.
func Restore(ctx context.Context, args []string, out io.Writer) (resultErr error) {
return restoreWithDependencies(ctx, args, out, commandDependencies{})
}
func restoreWithDependencies(ctx context.Context, args []string, out io.Writer, deps commandDependencies) (resultErr error) {
deps = normalizeCommandDependencies(deps)
positionalSessionID, args := pullLeadingSessionID(args)
fs := flag.NewFlagSet("restore", flag.ContinueOnError)
fs.SetOutput(out)
@@ -54,8 +53,7 @@ func Restore(ctx context.Context, args []string, out io.Writer) (resultErr error
if strings.TrimSpace(flags.sessionID) == "" {
return fmt.Errorf("restore: session_id is required")
}
restoreDeps := commandDependencies{newObjectStore: newObjectStoreFromConfigFn}
loaded, err := loadCommandConfigWithDependencies(ctx, flags.pipelinePath, flags.campaignPath, flags.campaignFilePath, flags.sessionPath, flags.sessionOptions(), restoreDeps)
loaded, err := loadCommandConfigWithDependencies(ctx, flags.pipelinePath, flags.campaignPath, flags.campaignFilePath, flags.sessionPath, flags.sessionOptions(), deps)
if err != nil {
return fmt.Errorf("restore: %w", err)
}
@@ -64,16 +62,16 @@ func Restore(ctx context.Context, args []string, out io.Writer) (resultErr error
if err := config.Validate(cfg); err != nil {
return fmt.Errorf("restore: %w", err)
}
objectStore, err := newCommandObjectStoreWithDependencies(ctx, cfg, logging.NewLogger(os.Stderr, slog.LevelInfo), restoreDeps)
objectStore, err := newCommandObjectStoreWithDependencies(ctx, cfg, logging.NewLogger(os.Stderr, slog.LevelInfo), deps)
if err != nil {
return fmt.Errorf("restore: %w", err)
}
current, err := discoverRemoteCurrentStateFn(ctx, cfg, objectStore)
current, err := deps.discoverRemoteCurrentState(ctx, cfg, objectStore)
if err != nil {
return fmt.Errorf("restore: %w", err)
}
if dryRun {
plan, err := buildRestorePlanFn(ctx, cfg, current, objectStore, RestorePlanOptions{
plan, err := deps.buildRestorePlan(ctx, cfg, current, objectStore, RestorePlanOptions{
IncludeAudio: includeAudio,
Force: force,
DryRun: true,
@@ -116,7 +114,7 @@ func Restore(ctx context.Context, args []string, out io.Writer) (resultErr error
// Classification and installation share the same transition lock as a
// runner. This prevents a runner from making reuse decisions against state
// that restore is about to replace.
plan, err := buildRestorePlanFn(ctx, cfg, current, objectStore, RestorePlanOptions{
plan, err := deps.buildRestorePlan(ctx, cfg, current, objectStore, RestorePlanOptions{
IncludeAudio: includeAudio,
Force: force,
})
@@ -148,7 +146,7 @@ func Restore(ctx context.Context, args []string, out io.Writer) (resultErr error
return fmt.Errorf("restore: mark incomplete restore: %w", err)
}
result, err := executeRestorePlanFn(ctx, cfg, current, plan, report, objectStore)
result, err := deps.executeRestorePlan(ctx, cfg, current, plan, report, objectStore)
if err != nil {
report.setFailed(err)
if _, reportErr := persistRestoreReport(artifactStore, cfg, report); reportErr != nil {