2018-07-12 22:31:41 +03:00
|
|
|
package operations
|
|
|
|
|
2018-07-18 01:16:06 +03:00
|
|
|
import (
|
2018-09-15 14:15:00 +03:00
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
2018-07-18 01:16:06 +03:00
|
|
|
"github.com/MichaelMure/git-bug/bug"
|
2018-09-15 14:15:00 +03:00
|
|
|
"github.com/MichaelMure/git-bug/util/text"
|
2018-07-18 01:16:06 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// SetTitleOperation will change the title of a bug
|
2018-07-12 22:31:41 +03:00
|
|
|
|
2018-07-13 17:13:40 +03:00
|
|
|
var _ bug.Operation = SetTitleOperation{}
|
2018-07-12 22:31:41 +03:00
|
|
|
|
|
|
|
type SetTitleOperation struct {
|
2018-09-24 21:19:16 +03:00
|
|
|
*bug.OpBase
|
2018-09-12 17:57:04 +03:00
|
|
|
Title string `json:"title"`
|
|
|
|
Was string `json:"was"`
|
2018-07-12 22:31:41 +03:00
|
|
|
}
|
|
|
|
|
2018-07-25 22:25:26 +03:00
|
|
|
func (op SetTitleOperation) Apply(snapshot bug.Snapshot) bug.Snapshot {
|
|
|
|
snapshot.Title = op.Title
|
|
|
|
|
|
|
|
return snapshot
|
|
|
|
}
|
|
|
|
|
2018-09-15 14:15:00 +03:00
|
|
|
func (op SetTitleOperation) Validate() error {
|
|
|
|
if err := bug.OpBaseValidate(op, bug.SetTitleOp); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if text.Empty(op.Title) {
|
|
|
|
return fmt.Errorf("title is empty")
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.Contains(op.Title, "\n") {
|
|
|
|
return fmt.Errorf("title should be a single line")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !text.Safe(op.Title) {
|
|
|
|
return fmt.Errorf("title should be fully printable")
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.Contains(op.Was, "\n") {
|
|
|
|
return fmt.Errorf("previous title should be a single line")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !text.Safe(op.Was) {
|
|
|
|
return fmt.Errorf("previous title should be fully printable")
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-08-15 23:01:45 +03:00
|
|
|
func NewSetTitleOp(author bug.Person, title string, was string) SetTitleOperation {
|
2018-07-12 22:31:41 +03:00
|
|
|
return SetTitleOperation{
|
2018-07-18 01:16:06 +03:00
|
|
|
OpBase: bug.NewOpBase(bug.SetTitleOp, author),
|
2018-07-13 22:21:24 +03:00
|
|
|
Title: title,
|
2018-08-15 23:01:45 +03:00
|
|
|
Was: was,
|
2018-07-12 22:31:41 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-25 22:25:26 +03:00
|
|
|
// Convenience function to apply the operation
|
2018-09-15 14:15:00 +03:00
|
|
|
func SetTitle(b bug.Interface, author bug.Person, title string) error {
|
2018-08-15 23:01:45 +03:00
|
|
|
it := bug.NewOperationIterator(b)
|
|
|
|
|
|
|
|
var lastTitleOp bug.Operation
|
|
|
|
for it.Next() {
|
|
|
|
op := it.Value()
|
|
|
|
if op.OpType() == bug.SetTitleOp {
|
|
|
|
lastTitleOp = op
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var was string
|
|
|
|
if lastTitleOp != nil {
|
|
|
|
was = lastTitleOp.(SetTitleOperation).Title
|
|
|
|
} else {
|
|
|
|
was = b.FirstOp().(CreateOperation).Title
|
|
|
|
}
|
|
|
|
|
|
|
|
setTitleOp := NewSetTitleOp(author, title, was)
|
2018-09-15 14:15:00 +03:00
|
|
|
|
|
|
|
if err := setTitleOp.Validate(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2018-07-25 19:01:32 +03:00
|
|
|
b.Append(setTitleOp)
|
2018-09-15 14:15:00 +03:00
|
|
|
return nil
|
2018-07-25 19:01:32 +03:00
|
|
|
}
|