From 37aaec81f444bd5e00de4e8cedb35c73e131b41d Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 30 Aug 2021 15:38:03 +0000 Subject: [PATCH] feat: improve list (#786) --- cmd/list.go | 76 ++++++++++++++++++++++++++++++++----------- pkg/model/planner.go | 1 + pkg/model/workflow.go | 1 + 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/cmd/list.go b/cmd/list.go index 051f5f40..15799aab 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -3,38 +3,51 @@ package cmd import ( "fmt" "strconv" + "strings" "github.com/nektos/act/pkg/model" ) func printList(plan *model.Plan) error { type lineInfoDef struct { - id string - stage string - name string + jobID string + jobName string + stage string + wfName string + wfFile string + events string } lineInfos := []lineInfoDef{} header := lineInfoDef{ - id: "ID", - stage: "Stage", - name: "Name", + jobID: "Job ID", + jobName: "Job name", + stage: "Stage", + wfName: "Workflow name", + wfFile: "Workflow file", + events: "Events", } jobs := map[string]bool{} duplicateJobIDs := false - idMaxWidth := len(header.id) + jobIDMaxWidth := len(header.jobID) + jobNameMaxWidth := len(header.jobName) stageMaxWidth := len(header.stage) - nameMaxWidth := len(header.name) + wfNameMaxWidth := len(header.wfName) + wfFileMaxWidth := len(header.wfFile) + eventsMaxWidth := len(header.events) for i, stage := range plan.Stages { for _, r := range stage.Runs { jobID := r.JobID line := lineInfoDef{ - id: jobID, - stage: strconv.Itoa(i), - name: r.String(), + jobID: jobID, + jobName: r.String(), + stage: strconv.Itoa(i), + wfName: r.Workflow.Name, + wfFile: r.Workflow.File, + events: strings.Join(r.Workflow.On(), `,`), } if _, ok := jobs[jobID]; ok { duplicateJobIDs = true @@ -42,25 +55,50 @@ func printList(plan *model.Plan) error { jobs[jobID] = true } lineInfos = append(lineInfos, line) - if idMaxWidth < len(line.id) { - idMaxWidth = len(line.id) + if jobIDMaxWidth < len(line.jobID) { + jobIDMaxWidth = len(line.jobID) + } + if jobNameMaxWidth < len(line.jobName) { + jobNameMaxWidth = len(line.jobName) } if stageMaxWidth < len(line.stage) { stageMaxWidth = len(line.stage) } - if nameMaxWidth < len(line.name) { - nameMaxWidth = len(line.name) + if wfNameMaxWidth < len(line.wfName) { + wfNameMaxWidth = len(line.wfName) + } + if wfFileMaxWidth < len(line.wfFile) { + wfFileMaxWidth = len(line.wfFile) + } + if eventsMaxWidth < len(line.events) { + eventsMaxWidth = len(line.events) } } } - idMaxWidth += 2 + jobIDMaxWidth += 2 + jobNameMaxWidth += 2 stageMaxWidth += 2 - nameMaxWidth += 2 + wfNameMaxWidth += 2 + wfFileMaxWidth += 2 - fmt.Printf("%*s%*s%*s\n", -idMaxWidth, header.id, -stageMaxWidth, header.stage, -nameMaxWidth, header.name) + fmt.Printf("%*s%*s%*s%*s%*s%*s\n", + -stageMaxWidth, header.stage, + -jobIDMaxWidth, header.jobID, + -jobNameMaxWidth, header.jobName, + -wfNameMaxWidth, header.wfName, + -wfFileMaxWidth, header.wfFile, + -eventsMaxWidth, header.events, + ) for _, line := range lineInfos { - fmt.Printf("%*s%*s%*s\n", -idMaxWidth, line.id, -stageMaxWidth, line.stage, -nameMaxWidth, line.name) + fmt.Printf("%*s%*s%*s%*s%*s%*s\n", + -stageMaxWidth, line.stage, + -jobIDMaxWidth, line.jobID, + -jobNameMaxWidth, line.jobName, + -wfNameMaxWidth, line.wfName, + -wfFileMaxWidth, line.wfFile, + -eventsMaxWidth, line.events, + ) } if duplicateJobIDs { fmt.Print("\nDetected multiple jobs with the same job name, use `-W` to specify the path to the specific workflow.\n") diff --git a/pkg/model/planner.go b/pkg/model/planner.go index 02ba41d6..5cb2e4d8 100644 --- a/pkg/model/planner.go +++ b/pkg/model/planner.go @@ -186,6 +186,7 @@ func NewWorkflowPlanner(path string, noWorkflowRecurse bool) (WorkflowPlanner, e return nil, err } + workflow.File = wf.workflowFileInfo.Name() if workflow.Name == "" { workflow.Name = wf.workflowFileInfo.Name() } diff --git a/pkg/model/workflow.go b/pkg/model/workflow.go index 7e21c5f3..5b664b53 100644 --- a/pkg/model/workflow.go +++ b/pkg/model/workflow.go @@ -15,6 +15,7 @@ import ( // Workflow is the structure of the files in .github/workflows type Workflow struct { + File string Name string `yaml:"name"` RawOn yaml.Node `yaml:"on"` Env map[string]string `yaml:"env"`