1package boardcmd
2
3import (
4 "fmt"
5 "strconv"
6
7 "github.com/spf13/cobra"
8
9 bugcmd "github.com/git-bug/git-bug/commands/bug"
10 "github.com/git-bug/git-bug/commands/execenv"
11 _select "github.com/git-bug/git-bug/commands/select"
12 "github.com/git-bug/git-bug/entity"
13)
14
15type boardAddBugOptions struct {
16 column string
17}
18
19func newBoardAddBugCommand() *cobra.Command {
20 env := execenv.NewEnv()
21 options := boardAddBugOptions{}
22
23 cmd := &cobra.Command{
24 Use: "add-bug [BOARD_ID] [BUG_ID]",
25 Short: "Add a bug to a board",
26 PreRunE: execenv.LoadBackend(env),
27 RunE: execenv.CloseBackend(env, func(cmd *cobra.Command, args []string) error {
28 return runBoardAddBug(env, options, args)
29 }),
30 ValidArgsFunction: BoardAndBugCompletion(env),
31 }
32
33 flags := cmd.Flags()
34 flags.SortFlags = false
35
36 flags.StringVarP(&options.column, "column", "c", "1",
37 "The column to add to. Either a column Id or prefix, or the column number starting from 1.")
38 _ = cmd.RegisterFlagCompletionFunc("column", ColumnCompletion(env))
39
40 return cmd
41}
42
43func runBoardAddBug(env *execenv.Env, opts boardAddBugOptions, args []string) error {
44 board, args, err := ResolveSelected(env.Backend, args)
45 if err != nil {
46 return err
47 }
48
49 var columnId entity.CombinedId
50
51 switch {
52 case err == nil:
53 // try to parse as column number
54 index, err := strconv.Atoi(opts.column)
55 if err == nil {
56 if index-1 >= 0 && index-1 < len(board.Snapshot().Columns) {
57 columnId = board.Snapshot().Columns[index-1].CombinedId
58 } else {
59 return fmt.Errorf("invalid column")
60 }
61 }
62 fallthrough // could be an Id
63 case _select.IsErrNoValidId(err):
64 board, columnId, err = env.Backend.Boards().ResolveColumn(opts.column)
65 if err != nil {
66 return err
67 }
68 default:
69 // actual error
70 return err
71 }
72
73 bug, _, err := bugcmd.ResolveSelected(env.Backend, args)
74 if err != nil {
75 return err
76 }
77
78 id, _, err := board.AddItemEntity(columnId, bug)
79 if err != nil {
80 return err
81 }
82
83 env.Out.Printf("%s created\n", id.Human())
84
85 return board.Commit()
86}