aboutsummaryrefslogtreecommitdiffstats
path: root/commands/label.go
diff options
context:
space:
mode:
Diffstat (limited to 'commands/label.go')
-rw-r--r--commands/label.go108
1 files changed, 108 insertions, 0 deletions
diff --git a/commands/label.go b/commands/label.go
new file mode 100644
index 00000000..ad3a388b
--- /dev/null
+++ b/commands/label.go
@@ -0,0 +1,108 @@
+package commands
+
+import (
+ "errors"
+ "flag"
+ "fmt"
+ "github.com/MichaelMure/git-bug/bug"
+ "github.com/MichaelMure/git-bug/bug/operations"
+ "github.com/MichaelMure/git-bug/repository"
+)
+
+var labelFlagSet = flag.NewFlagSet("label", flag.ExitOnError)
+
+var (
+ labelRemove = newFlagSet.Bool("r", false, "Remove a label")
+)
+
+func runLabel(repo repository.Repo, args []string) error {
+ labelFlagSet.Parse(args)
+ args = labelFlagSet.Args()
+
+ if len(args) == 0 {
+ return errors.New("You must provide a bug id")
+ }
+
+ if len(args) == 1 {
+ return errors.New("You must provide a label")
+ }
+
+ prefix := args[0]
+
+ b, err := bug.FindBug(repo, prefix)
+ if err != nil {
+ return err
+ }
+
+ author, err := bug.GetUser(repo)
+ if err != nil {
+ return err
+ }
+
+ var added, removed []bug.Label
+
+ snap := b.Compile()
+
+ for _, arg := range args[1:] {
+ label := bug.Label(arg)
+
+ if *labelRemove {
+ // check for duplicate
+ if labelExist(removed, label) {
+ fmt.Printf("label \"%s\" is a duplicate\n", arg)
+ continue
+ }
+
+ // check that the label actually exist
+ if !labelExist(snap.Labels, label) {
+ fmt.Printf("label \"%s\" doesn't exist on this bug\n", arg)
+ continue
+ }
+
+ removed = append(removed, label)
+ } else {
+ // check for duplicate
+ if labelExist(added, label) {
+ fmt.Printf("label \"%s\" is a duplicate\n", arg)
+ continue
+ }
+
+ // check that the label doesn't already exist
+ if labelExist(snap.Labels, label) {
+ fmt.Printf("label \"%s\" is already set on this bug\n", arg)
+ continue
+ }
+
+ added = append(added, label)
+ }
+ }
+
+ if len(added) == 0 && len(removed) == 0 {
+ return errors.New("no label added or removed")
+ }
+
+ labelOp := operations.NewLabelChangeOperation(author, added, removed)
+
+ b.Append(labelOp)
+
+ err = b.Commit(repo)
+
+ return err
+}
+
+func labelExist(labels []bug.Label, label bug.Label) bool {
+ for _, l := range labels {
+ if l == label {
+ return true
+ }
+ }
+
+ return false
+}
+
+var labelCmd = &Command{
+ Description: "Manipulate bug's label",
+ Usage: "<id> [<option>...] [<label>...]",
+ flagSet: labelFlagSet,
+ RunMethod: runLabel,
+}