summaryrefslogtreecommitdiff
path: root/internal/askcli/command_start_deps.go
blob: 94a6a9e289901d7a87f57941d77ff94638194748 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package askcli

import (
	"context"
	"fmt"
	"io"
	"strings"
)

// verifyDependenciesCompletedForStart returns 0 if every dependency is completed,
// or 1 after writing an error to stderr when the task must not be started yet.
func (d *Dispatcher) verifyDependenciesCompletedForStart(ctx context.Context, task TaskExport, stderr io.Writer) int {
	if len(task.Depends) == 0 {
		return 0
	}
	aliases, err := ensureTaskAliasesForUUIDs(task.Depends)
	if err != nil {
		fmt.Fprintf(stderr, "error: failed to load task aliases: %v\n", err)
		return 1
	}
	var incomplete []string
	for _, depUUID := range task.Depends {
		depTasks, code, err := d.exportTasks(ctx, []string{"uuid:" + depUUID, "export"}, stderr)
		if err != nil {
			writeInfoError(stderr, err)
			return code
		}
		if len(depTasks) == 0 {
			fmt.Fprintf(stderr, "error: dependency task not found (%s)\n", displayTaskAlias(depUUID, aliases))
			return 1
		}
		status := strings.ToLower(strings.TrimSpace(depTasks[0].Status))
		if status != "completed" {
			label := displayTaskAlias(depUUID, aliases)
			incomplete = append(incomplete, fmt.Sprintf("%s (%s)", label, depTasks[0].Status))
		}
	}
	if len(incomplete) > 0 {
		fmt.Fprintf(stderr, "error: cannot start until all dependencies are completed; incomplete: %s\n",
			strings.Join(incomplete, ", "))
		return 1
	}
	return 0
}