label.go

  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}