1package cmd23import (4 "strings"56 "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)1314func tagCommand() *cobra.Command {15 cmd := &cobra.Command{16 Use: "tag",17 Short: "Manage repository tags",18 }1920 cmd.AddCommand(21 tagListCommand(),22 tagDeleteCommand(),23 )2425 return cmd26}2728func 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 err42 }4344 r, err := rr.Open()45 if err != nil {46 return err47 }4849 tags, _ := r.Tags()50 for _, t := range tags {51 cmd.Println(t)52 }5354 return nil55 },56 }5758 return cmd59}6061func 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 err75 }7677 r, err := rr.Open()78 if err != nil {79 log.Errorf("failed to open repo: %s", err)80 return err81 }8283 tag := args[1]84 tags, _ := r.Tags()85 var exists bool86 for _, t := range tags {87 if tag == t {88 exists = true89 break90 }91 }9293 if !exists {94 log.Errorf("failed to get tag: tag %s does not exist", tag)95 return git.ErrReferenceNotExist96 }9798 tagCommit, err := r.TagCommit(tag)99 if err != nil {100 log.Errorf("failed to get tag commit: %s", err)101 return err102 }103104 if err := r.DeleteTag(tag); err != nil {105 log.Errorf("failed to delete tag: %s", err)106 return err107 }108109 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 err113 }114115 return webhook.SendEvent(ctx, wh)116 },117 }118119 return cmd120}