mirror of
https://github.com/MichaelMure/git-bug.git
synced 2024-12-16 02:33:26 +03:00
109 lines
2.1 KiB
Go
109 lines
2.1 KiB
Go
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,
|
|
}
|