This repository has been archived by the owner on Nov 22, 2022. It is now read-only.
/
delete.go
143 lines (114 loc) · 3.94 KB
/
delete.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package delete
import (
"fmt"
"github.com/MakeNowJust/heredoc"
"github.com/profclems/glab/commands/cmdutils"
"github.com/profclems/glab/commands/release/releaseutils/upload"
"github.com/profclems/glab/internal/config"
"github.com/profclems/glab/internal/glrepo"
"github.com/profclems/glab/pkg/iostreams"
"github.com/profclems/glab/pkg/prompt"
"github.com/spf13/cobra"
"github.com/xanzy/go-gitlab"
)
type DeleteOpts struct {
ForceDelete bool
DeleteTag bool
TagName string
AssetLinks []*upload.ReleaseAsset
AssetFiles []*upload.ReleaseFile
IO *iostreams.IOStreams
HTTPClient func() (*gitlab.Client, error)
BaseRepo func() (glrepo.Interface, error)
Config func() (config.Config, error)
}
func NewCmdDelete(f *cmdutils.Factory, runE func(opts *DeleteOpts) error) *cobra.Command {
opts := &DeleteOpts{
IO: f.IO,
Config: f.Config,
}
cmd := &cobra.Command{
Use: "delete <tag>",
Short: "Delete a GitLab Release",
Long: heredoc.Docf(`Delete release assets to GitLab Release
Deleting a release does not delete the associated tag unless %[1]s--with-tag%[1]s is specified.
Maintainer level access to the project is required to delete a release.
`, "`"),
Args: cmdutils.MinimumArgs(1, "no tag name provided"),
Example: heredoc.Doc(`
Delete a release (with a confirmation prompt')
$ glab release delete v1.1.0'
Skip the confirmation prompt and force delete
$ glab release delete v1.0.1 -y
Delete release and associated tag
$ glab release delete v1.0.1 --with-tag
`),
RunE: func(cmd *cobra.Command, args []string) error {
opts.HTTPClient = f.HttpClient
opts.BaseRepo = f.BaseRepo
opts.TagName = args[0]
if !opts.ForceDelete && !opts.IO.PromptEnabled() {
return &cmdutils.FlagError{Err: fmt.Errorf("--yes or -y flag is required when not running interactively")}
}
if runE != nil {
return runE(opts)
}
return deleteRun(opts)
},
}
cmd.Flags().BoolVarP(&opts.ForceDelete, "yes", "y", false, "Skip confirmation prompt")
cmd.Flags().BoolVarP(&opts.DeleteTag, "with-tag", "t", false, "Delete associated tag")
return cmd
}
func deleteRun(opts *DeleteOpts) error {
client, err := opts.HTTPClient()
if err != nil {
return err
}
repo, err := opts.BaseRepo()
if err != nil {
return err
}
color := opts.IO.Color()
var resp *gitlab.Response
opts.IO.Logf("%s validating tag %s=%s %s=%s\n",
color.ProgressIcon(),
color.Blue("repo"), repo.FullName(),
color.Blue("tag"), opts.TagName)
release, resp, err := client.Releases.GetRelease(repo.FullName(), opts.TagName)
if err != nil {
if resp != nil && (resp.StatusCode == 404 || resp.StatusCode == 403) {
return cmdutils.WrapError(err, fmt.Sprintf("no release found for %q", repo.FullName()))
}
return cmdutils.WrapError(err, "failed to fetch release")
}
if !opts.ForceDelete && opts.IO.PromptEnabled() {
opts.IO.Logf("This action will permanently delete release %q immediately.\n\n", release.TagName)
err = prompt.Confirm(&opts.ForceDelete, fmt.Sprintf("Are you ABSOLUTELY SURE you wish to delete this release %q?", release.Name), false)
if err != nil {
return cmdutils.WrapError(err, "could not prompt")
}
}
if !opts.ForceDelete {
return cmdutils.CancelError()
}
opts.IO.Logf("%s deleting release %s=%s %s=%s\n",
color.ProgressIcon(),
color.Blue("repo"), repo.FullName(),
color.Blue("tag"), opts.TagName)
release, _, err = client.Releases.DeleteRelease(repo.FullName(), release.TagName)
if err != nil {
return cmdutils.WrapError(err, "failed to delete release")
}
opts.IO.Logf(color.Bold("%s release %q deleted\n"), color.RedCheck(), release.Name)
if opts.DeleteTag {
opts.IO.Logf("%s deleting associated tag %q\n",
color.ProgressIcon(), opts.TagName)
_, err = client.Tags.DeleteTag(repo.FullName(), release.TagName)
if err != nil {
return cmdutils.WrapError(err, "failed to delete tag")
}
opts.IO.Logf(color.Bold("%s tag %q deleted\n"), color.RedCheck(), release.Name)
}
return nil
}