repo.go

  1package repo
  2
  3import (
  4	"fmt"
  5	"strings"
  6
  7	"github.com/charmbracelet/soft-serve/cmd"
  8	"github.com/charmbracelet/soft-serve/pkg/access"
  9	"github.com/charmbracelet/soft-serve/pkg/backend"
 10	"github.com/charmbracelet/soft-serve/pkg/proto"
 11	"github.com/spf13/cobra"
 12)
 13
 14var (
 15	// Command returns a command for managing repositories.
 16	Command = &cobra.Command{
 17		Use:                "repo",
 18		Aliases:            []string{"repos", "repository", "repositories"},
 19		Short:              "Manage repositories",
 20		PersistentPreRunE:  cmd.InitBackendContext,
 21		PersistentPostRunE: cmd.CloseDBContext,
 22	}
 23)
 24
 25func init() {
 26	Command.AddCommand(
 27		blobCommand(),
 28		branchCommand(),
 29		collabCommand(),
 30		commitCommand(),
 31		createCommand(),
 32		deleteCommand(),
 33		descriptionCommand(),
 34		hiddenCommand(),
 35		importCommand(),
 36		infoCommand(),
 37		listCommand(),
 38		mirrorCommand(),
 39		privateCommand(),
 40		projectName(),
 41		renameCommand(),
 42		tagCommand(),
 43		treeCommand(),
 44		webhookCommand(),
 45	)
 46}
 47
 48func infoCommand() *cobra.Command {
 49	cmd := &cobra.Command{
 50		Use:   "info REPOSITORY",
 51		Short: "Get information about a repository",
 52		Args:  cobra.ExactArgs(1),
 53		RunE: func(c *cobra.Command, args []string) error {
 54			ctx := c.Context()
 55			be := backend.FromContext(ctx)
 56			rn := args[0]
 57			rr, err := be.Repository(ctx, rn)
 58			if err != nil {
 59				return err
 60			}
 61
 62			if !cmd.CheckUserHasAccess(c, rr.Name(), access.ReadOnlyAccess) {
 63				return proto.ErrUnauthorized
 64			}
 65
 66			r, err := rr.Open()
 67			if err != nil {
 68				return err
 69			}
 70
 71			head, err := r.HEAD()
 72			if err != nil {
 73				return err
 74			}
 75
 76			var owner proto.User
 77			if rr.UserID() > 0 {
 78				owner, err = be.UserByID(ctx, rr.UserID())
 79				if err != nil {
 80					return err
 81				}
 82			}
 83
 84			branches, _ := r.Branches()
 85			tags, _ := r.Tags()
 86
 87			// project name and description are optional, handle trailing
 88			// whitespace to avoid breaking tests.
 89			c.Println(strings.TrimSpace(fmt.Sprint("Project Name: ", rr.ProjectName())))
 90			c.Println("Repository:", rr.Name())
 91			c.Println(strings.TrimSpace(fmt.Sprint("Description: ", rr.Description())))
 92			c.Println("Private:", rr.IsPrivate())
 93			c.Println("Hidden:", rr.IsHidden())
 94			c.Println("Mirror:", rr.IsMirror())
 95			if owner != nil {
 96				c.Println(strings.TrimSpace(fmt.Sprint("Owner: ", owner.Username())))
 97			}
 98			c.Println("Default Branch:", head.Name().Short())
 99			if len(branches) > 0 {
100				c.Println("Branches:")
101				for _, b := range branches {
102					c.Println("  -", b)
103				}
104			}
105			if len(tags) > 0 {
106				c.Println("Tags:")
107				for _, t := range tags {
108					c.Println("  -", t)
109				}
110			}
111
112			return nil
113		},
114	}
115
116	return cmd
117}