user_key_add.go

 1package commands
 2
 3import (
 4	"fmt"
 5
 6	"github.com/MichaelMure/git-bug/cache"
 7	"github.com/MichaelMure/git-bug/identity"
 8	"github.com/MichaelMure/git-bug/input"
 9	"github.com/MichaelMure/git-bug/util/interrupt"
10	"github.com/spf13/cobra"
11)
12
13var (
14	keyAddArmoredFile    string
15	keyAddArmored        string
16)
17
18func runKeyAdd(cmd *cobra.Command, args []string) error {
19	backend, err := cache.NewRepoCache(repo)
20	if err != nil {
21		return err
22	}
23	defer backend.Close()
24	interrupt.RegisterCleaner(backend.Close)
25
26	id, args, err := ResolveUser(backend, args)
27	if err != nil {
28		return err
29	}
30
31	if len(args) > 0 {
32		return fmt.Errorf("unexpected arguments: %s", args)
33	}
34
35	if keyAddArmoredFile != "" && keyAddArmored == "" {
36		keyAddArmored, err = input.TextFileInput(keyAddArmoredFile)
37		if err != nil {
38			return err
39		}
40	}
41
42	if keyAddArmoredFile == "" && keyAddArmored == "" {
43		keyAddArmored, err = input.IdentityVersionKeyEditorInput(backend, "")
44		if err == input.ErrEmptyMessage {
45			fmt.Println("Empty PGP key, aborting.")
46			return nil
47		}
48		if err != nil {
49			return err
50		}
51	}
52
53	key, err := identity.NewKey(keyAddArmored)
54
55	if err != nil {
56		return err
57	}
58
59	err = id.Mutate(func(mutator identity.Mutator) identity.Mutator {
60		mutator.Keys = append(mutator.Keys, key)
61		return mutator
62	})
63
64	if err != nil {
65		return err
66	}
67
68	return id.Commit()
69}
70
71var keyAddCmd = &cobra.Command{
72	Use:     "add [<user-id>]",
73	Short:   "Add a PGP key from a user.",
74	PreRunE: loadRepoEnsureUser,
75	RunE:    runKeyAdd,
76}
77
78func init() {
79	keyCmd.AddCommand(keyAddCmd)
80
81	keyAddCmd.Flags().SortFlags = false
82
83	keyAddCmd.Flags().StringVarP(&keyAddArmoredFile, "file", "F", "",
84		"Take the armored PGP public key from the given file. Use - to read the message from the standard input",
85	)
86
87	keyAddCmd.Flags().StringVarP(&keyAddArmored, "key", "k", "",
88		"Provide the armored PGP public key from the command line",
89	)
90}