1package cmd
2
3import (
4 "strings"
5
6 "github.com/charmbracelet/log/v2"
7 "github.com/charmbracelet/soft-serve/git"
8 "github.com/charmbracelet/soft-serve/pkg/backend"
9 "github.com/charmbracelet/soft-serve/pkg/proto"
10 "github.com/charmbracelet/soft-serve/pkg/webhook"
11 "github.com/spf13/cobra"
12)
13
14func tagCommand() *cobra.Command {
15 cmd := &cobra.Command{
16 Use: "tag",
17 Short: "Manage repository tags",
18 }
19
20 cmd.AddCommand(
21 tagListCommand(),
22 tagDeleteCommand(),
23 )
24
25 return cmd
26}
27
28func tagListCommand() *cobra.Command {
29 cmd := &cobra.Command{
30 Use: "list REPOSITORY",
31 Aliases: []string{"ls"},
32 Short: "List repository tags",
33 Args: cobra.ExactArgs(1),
34 PersistentPreRunE: checkIfReadable,
35 RunE: func(cmd *cobra.Command, args []string) error {
36 ctx := cmd.Context()
37 be := backend.FromContext(ctx)
38 rn := strings.TrimSuffix(args[0], ".git")
39 rr, err := be.Repository(ctx, rn)
40 if err != nil {
41 return err //nolint:wrapcheck
42 }
43
44 r, err := rr.Open()
45 if err != nil {
46 return err //nolint:wrapcheck
47 }
48
49 tags, _ := r.Tags()
50 for _, t := range tags {
51 cmd.Println(t)
52 }
53
54 return nil
55 },
56 }
57
58 return cmd
59}
60
61func tagDeleteCommand() *cobra.Command {
62 cmd := &cobra.Command{
63 Use: "delete REPOSITORY TAG",
64 Aliases: []string{"remove", "rm", "del"},
65 Short: "Delete a tag",
66 Args: cobra.ExactArgs(2),
67 PersistentPreRunE: checkIfReadableAndCollab,
68 RunE: func(cmd *cobra.Command, args []string) error {
69 ctx := cmd.Context()
70 be := backend.FromContext(ctx)
71 rn := strings.TrimSuffix(args[0], ".git")
72 rr, err := be.Repository(ctx, rn)
73 if err != nil {
74 return err //nolint:wrapcheck
75 }
76
77 r, err := rr.Open()
78 if err != nil {
79 log.Errorf("failed to open repo: %s", err)
80 return err //nolint:wrapcheck
81 }
82
83 tag := args[1]
84 tags, _ := r.Tags()
85 var exists bool
86 for _, t := range tags {
87 if tag == t {
88 exists = true
89 break
90 }
91 }
92
93 if !exists {
94 log.Errorf("failed to get tag: tag %s does not exist", tag)
95 return git.ErrReferenceNotExist
96 }
97
98 tagCommit, err := r.TagCommit(tag)
99 if err != nil {
100 log.Errorf("failed to get tag commit: %s", err)
101 return err //nolint:wrapcheck
102 }
103
104 if err := r.DeleteTag(tag); err != nil {
105 log.Errorf("failed to delete tag: %s", err)
106 return err //nolint:wrapcheck
107 }
108
109 wh, err := webhook.NewBranchTagEvent(ctx, proto.UserFromContext(ctx), rr, git.RefsTags+tag, tagCommit.ID.String(), git.ZeroID)
110 if err != nil {
111 log.Error("failed to create branch_tag webhook", "err", err)
112 return err //nolint:wrapcheck
113 }
114
115 return webhook.SendEvent(ctx, wh)
116 },
117 }
118
119 return cmd
120}