diff options
Diffstat (limited to 'commands/label.go')
-rw-r--r-- | commands/label.go | 108 |
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, +} |