Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion cli/exp_tasklist.go → cli/exp_task_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ func (r *RootCmd) taskList() *serpent.Command {
statusFilter string
all bool
user string
quiet bool

client = new(codersdk.Client)
formatter = cliui.NewOutputFormatter(
cliui.TableFormat(
[]taskListRow{},
[]string{
"id",
"name",
"status",
"state",
Expand Down Expand Up @@ -98,6 +98,14 @@ func (r *RootCmd) taskList() *serpent.Command {
Default: "",
Value: serpent.StringOf(&user),
},
{
Name: "quiet",
Description: "Only display task IDs.",
Flag: "quiet",
FlagShorthand: "q",
Default: "false",
Value: serpent.BoolOf(&quiet),
},
},
Handler: func(inv *serpent.Invocation) error {
ctx := inv.Context()
Expand All @@ -116,6 +124,14 @@ func (r *RootCmd) taskList() *serpent.Command {
return xerrors.Errorf("list tasks: %w", err)
}

if quiet {
for _, task := range tasks {
_, _ = fmt.Fprintln(inv.Stdout, task.ID.String())
}

return nil
}

// If no rows and not JSON, show a friendly message.
if len(tasks) == 0 && formatter.FormatID() != cliui.JSONFormat().ID() {
_, _ = fmt.Fprintln(inv.Stderr, "No tasks found.")
Expand Down
39 changes: 39 additions & 0 deletions cli/exp_tasklist_test.go → cli/exp_task_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"database/sql"
"encoding/json"
"io"
"slices"
"strings"
"testing"

"github.com/google/uuid"
Expand Down Expand Up @@ -200,6 +202,43 @@ func TestExpTaskList(t *testing.T) {

pty.ExpectMatch(ws.Name)
})

t.Run("Quiet", func(t *testing.T) {
t.Parallel()

// Quiet logger to reduce noise.
quiet := slog.Make(sloghuman.Sink(io.Discard))
client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{Logger: &quiet})
owner := coderdtest.CreateFirstUser(t, client)
memberClient, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)

// Given: We have two tasks
task1 := makeAITask(t, db, owner.OrganizationID, owner.UserID, memberUser.ID, database.WorkspaceTransitionStart, "keep me running")
task2 := makeAITask(t, db, owner.OrganizationID, owner.UserID, memberUser.ID, database.WorkspaceTransitionStop, "stop me please")

// Given: We add the `--quiet` flag
inv, root := clitest.New(t, "exp", "task", "list", "--quiet")
clitest.SetupConfig(t, memberClient, root)

ctx := testutil.Context(t, testutil.WaitShort)
var stdout bytes.Buffer
inv.Stdout = &stdout
inv.Stderr = &stdout

// When: We run the command
err := inv.WithContext(ctx).Run()
require.NoError(t, err)

want := []string{task1.ID.String(), task2.ID.String()}
got := slice.Filter(strings.Split(stdout.String(), "\n"), func(s string) bool {
return len(s) != 0
})

slices.Sort(want)
slices.Sort(got)

require.Equal(t, want, got)
})
}

func TestExpTaskList_OwnerCanListOthers(t *testing.T) {
Expand Down
Loading