tag.go

  1package cmd
  2
  3import (
  4	"strings"
  5
  6	log "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
 42			}
 43
 44			r, err := rr.Open()
 45			if err != nil {
 46				return err
 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
 75			}
 76
 77			r, err := rr.Open()
 78			if err != nil {
 79				log.Errorf("failed to open repo: %s", err)
 80				return err
 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
102			}
103
104			if err := r.DeleteTag(tag); err != nil {
105				log.Errorf("failed to delete tag: %s", err)
106				return err
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
113			}
114
115			return webhook.SendEvent(ctx, wh)
116		},
117	}
118
119	return cmd
120}