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 144 145 146 147 148
|
package delete
import (
"errors"
"fmt"
"github.com/AlecAivazis/survey/v2"
"github.com/MakeNowJust/heredoc/v2"
"github.com/spf13/cobra"
gitlab "gitlab.com/gitlab-org/api/client-go"
"gitlab.com/gitlab-org/cli/commands/cmdutils"
"gitlab.com/gitlab-org/cli/internal/glrepo"
"gitlab.com/gitlab-org/cli/pkg/iostreams"
"gitlab.com/gitlab-org/cli/pkg/prompt"
"gitlab.com/gitlab-org/cli/pkg/utils"
)
type DeleteOpts struct {
HTTPClient func() (*gitlab.Client, error)
IO *iostreams.IOStreams
BaseRepo func() (glrepo.Interface, error)
KeyID int
PerPage int
Page int
}
func NewCmdDelete(f *cmdutils.Factory, runE func(*DeleteOpts) error) *cobra.Command {
opts := &DeleteOpts{
IO: f.IO,
}
cmd := &cobra.Command{
Use: "delete <key-id>",
Short: "Deletes a single SSH key specified by the ID.",
Long: ``,
Example: heredoc.Doc(
`
# Delete SSH key with ID as argument
$ glab ssh-key delete 7750633
# Interactive
$ glab ssh-key delete
# Interactive, with pagination
$ glab ssh-key delete -P 50 -p 2`,
),
Args: cobra.MaximumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
opts.HTTPClient = f.HttpClient
opts.BaseRepo = f.BaseRepo
if len(args) == 0 {
keyID, err := keySelectPrompt(opts)
if err != nil {
return err
}
opts.KeyID = keyID
}
if len(args) == 1 {
opts.KeyID = utils.StringToInt(args[0])
}
if runE != nil {
return runE(opts)
}
return deleteRun(opts)
},
}
cmd.Flags().IntVarP(&opts.Page, "page", "p", 1, "Page number.")
cmd.Flags().IntVarP(&opts.PerPage, "per-page", "P", 30, "Number of items to list per page.")
return cmd
}
func deleteRun(opts *DeleteOpts) error {
httpClient, err := opts.HTTPClient()
if err != nil {
return err
}
_, err = httpClient.Users.DeleteSSHKey(opts.KeyID)
if err != nil {
return cmdutils.WrapError(err, "deleting SSH key.")
}
if opts.IO.IsOutputTTY() {
cs := opts.IO.Color()
opts.IO.Logf("%s SSH key deleted.\n", cs.GreenCheck())
} else {
opts.IO.Logf("SSH key deleted.\n")
}
return nil
}
func keySelectPrompt(opts *DeleteOpts) (int, error) {
if !opts.IO.PromptEnabled() {
return 0, cmdutils.FlagError{Err: errors.New("the <key-id> argument is required when prompts are disabled.")}
}
sshKeyListOptions := &gitlab.ListSSHKeysOptions{
PerPage: opts.PerPage,
Page: opts.Page,
}
httpClient, err := opts.HTTPClient()
if err != nil {
return 0, err
}
keys, resp, err := httpClient.Users.ListSSHKeys(sshKeyListOptions)
if err != nil {
return 0, cmdutils.WrapError(err, "Retrieving list of SSH keys.")
}
if len(keys) == 0 {
return 0, cmdutils.WrapError(errors.New("no keys found"), "Retrieving list of SSH keys.")
}
keyOpts := map[string]int{}
surveyOpts := make([]string, 0, len(keys))
for _, key := range keys {
keyOpts[key.Title] = key.ID
surveyOpts = append(surveyOpts, key.Title)
}
keySelectQuestion := &survey.Select{
Message: fmt.Sprintf(
"Select key to delete - Showing %d/%d keys - page %d/%d",
len(keys),
resp.TotalItems,
opts.Page,
resp.TotalPages,
),
Options: surveyOpts,
}
var result string
err = prompt.AskOne(keySelectQuestion, &result)
if err != nil {
return 0, cmdutils.WrapError(err, "prompting for SSH key to delete.")
}
return keyOpts[result], nil
}
|