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}