diff options
Diffstat (limited to 'bug')
-rw-r--r-- | bug/label.go | 4 | ||||
-rw-r--r-- | bug/operation.go | 1 | ||||
-rw-r--r-- | bug/operations/label_change.go | 56 | ||||
-rw-r--r-- | bug/operations/operations.go | 1 |
4 files changed, 62 insertions, 0 deletions
diff --git a/bug/label.go b/bug/label.go index c202cd70..889bf455 100644 --- a/bug/label.go +++ b/bug/label.go @@ -1,3 +1,7 @@ package bug type Label string + +func (l Label) String() string { + return string(l) +} diff --git a/bug/operation.go b/bug/operation.go index 15374f08..9e31637a 100644 --- a/bug/operation.go +++ b/bug/operation.go @@ -10,6 +10,7 @@ const ( SetTitleOp AddCommentOp SetStatusOp + LabelChangeOp ) type Operation interface { diff --git a/bug/operations/label_change.go b/bug/operations/label_change.go new file mode 100644 index 00000000..ca07f6f5 --- /dev/null +++ b/bug/operations/label_change.go @@ -0,0 +1,56 @@ +package operations + +import ( + "github.com/MichaelMure/git-bug/bug" + "sort" +) + +// LabelChangeOperation will add or remove a set of labels + +var _ bug.Operation = LabelChangeOperation{} + +type LabelChangeOperation struct { + bug.OpBase + Added []bug.Label + Removed []bug.Label +} + +func NewLabelChangeOperation(author bug.Person, added, removed []bug.Label) LabelChangeOperation { + return LabelChangeOperation{ + OpBase: bug.NewOpBase(bug.LabelChangeOp, author), + Added: added, + Removed: removed, + } +} + +func (op LabelChangeOperation) Apply(snapshot bug.Snapshot) bug.Snapshot { + // Add in the set +AddLoop: + for _, added := range op.Added { + for _, label := range snapshot.Labels { + if label == added { + // Already exist + continue AddLoop + } + } + + snapshot.Labels = append(snapshot.Labels, added) + } + + // Remove in the set + for _, removed := range op.Removed { + for i, label := range snapshot.Labels { + if label == removed { + snapshot.Labels[i] = snapshot.Labels[len(snapshot.Labels)-1] + snapshot.Labels = snapshot.Labels[:len(snapshot.Labels)-1] + } + } + } + + // Sort + sort.Slice(snapshot.Labels, func(i, j int) bool { + return string(snapshot.Labels[i]) < string(snapshot.Labels[j]) + }) + + return snapshot +} diff --git a/bug/operations/operations.go b/bug/operations/operations.go index 50692952..0bfd3b84 100644 --- a/bug/operations/operations.go +++ b/bug/operations/operations.go @@ -8,4 +8,5 @@ func init() { gob.Register(CreateOperation{}) gob.Register(SetTitleOperation{}) gob.Register(SetStatusOperation{}) + gob.Register(LabelChangeOperation{}) } |