1package commands
2
3import (
4 "errors"
5 "flag"
6 "fmt"
7 "github.com/MichaelMure/git-bug/bug"
8 "github.com/MichaelMure/git-bug/bug/operations"
9 "github.com/MichaelMure/git-bug/repository"
10)
11
12var labelFlagSet = flag.NewFlagSet("label", flag.ExitOnError)
13
14var (
15 labelRemove = newFlagSet.Bool("r", false, "Remove a label")
16)
17
18func runLabel(repo repository.Repo, args []string) error {
19 labelFlagSet.Parse(args)
20 args = labelFlagSet.Args()
21
22 if len(args) == 0 {
23 return errors.New("You must provide a bug id")
24 }
25
26 if len(args) == 1 {
27 return errors.New("You must provide a label")
28 }
29
30 prefix := args[0]
31
32 b, err := bug.FindBug(repo, prefix)
33 if err != nil {
34 return err
35 }
36
37 author, err := bug.GetUser(repo)
38 if err != nil {
39 return err
40 }
41
42 var added, removed []bug.Label
43
44 snap := b.Compile()
45
46 for _, arg := range args[1:] {
47 label := bug.Label(arg)
48
49 if *labelRemove {
50 // check for duplicate
51 if labelExist(removed, label) {
52 fmt.Printf("label \"%s\" is a duplicate\n", arg)
53 continue
54 }
55
56 // check that the label actually exist
57 if !labelExist(snap.Labels, label) {
58 fmt.Printf("label \"%s\" doesn't exist on this bug\n", arg)
59 continue
60 }
61
62 removed = append(removed, label)
63 } else {
64 // check for duplicate
65 if labelExist(added, label) {
66 fmt.Printf("label \"%s\" is a duplicate\n", arg)
67 continue
68 }
69
70 // check that the label doesn't already exist
71 if labelExist(snap.Labels, label) {
72 fmt.Printf("label \"%s\" is already set on this bug\n", arg)
73 continue
74 }
75
76 added = append(added, label)
77 }
78 }
79
80 if len(added) == 0 && len(removed) == 0 {
81 return errors.New("no label added or removed")
82 }
83
84 labelOp := operations.NewLabelChangeOperation(author, added, removed)
85
86 b.Append(labelOp)
87
88 err = b.Commit(repo)
89
90 return err
91}
92
93func labelExist(labels []bug.Label, label bug.Label) bool {
94 for _, l := range labels {
95 if l == label {
96 return true
97 }
98 }
99
100 return false
101}
102
103var labelCmd = &Command{
104 Description: "Manipulate bug's label",
105 Usage: "<id> [<option>...] [<label>...]",
106 flagSet: labelFlagSet,
107 RunMethod: runLabel,
108}