list.go

 1package cmd
 2
 3import (
 4	"github.com/charmbracelet/soft-serve/server/access"
 5	"github.com/charmbracelet/soft-serve/server/auth"
 6	"github.com/spf13/cobra"
 7)
 8
 9// listCommand returns a command that list file or directory at path.
10func listCommand() *cobra.Command {
11	var all bool
12
13	listCmd := &cobra.Command{
14		Use:     "list",
15		Aliases: []string{"ls"},
16		Short:   "List repositories",
17		Args:    cobra.NoArgs,
18		RunE: func(cmd *cobra.Command, args []string) error {
19			ctx := cmd.Context()
20			be, s := fromContext(cmd)
21			repos, err := be.Repositories(ctx, 1, 10)
22			if err != nil {
23				return err
24			}
25
26			user, err := be.Authenticate(ctx, auth.NewPublicKey(s.PublicKey()))
27			if err != nil {
28				return err
29			}
30
31			for _, r := range repos {
32				ac, err := be.AccessLevel(ctx, r.Name(), user)
33				if err != nil {
34					continue
35				}
36
37				if ac >= access.ReadOnlyAccess {
38					if !r.IsHidden() || all {
39						cmd.Println(r.Name())
40					}
41				}
42			}
43			return nil
44		},
45	}
46
47	listCmd.Flags().BoolVarP(&all, "all", "a", false, "List all repositories")
48
49	return listCmd
50}