1package bug
2
3import "github.com/MichaelMure/git-bug/util/git"
4
5var _ Operation = &SetMetadataOperation{}
6
7type SetMetadataOperation struct {
8 OpBase
9 Target git.Hash `json:"target"`
10 NewMetadata map[string]string `json:"new_metadata"`
11}
12
13func (op *SetMetadataOperation) base() *OpBase {
14 return &op.OpBase
15}
16
17func (op *SetMetadataOperation) Hash() (git.Hash, error) {
18 return hashOperation(op)
19}
20
21func (op *SetMetadataOperation) Apply(snapshot *Snapshot) {
22 for _, target := range snapshot.Operations {
23 hash, err := target.Hash()
24 if err != nil {
25 // Should never error unless a programming error happened
26 // (covered in OpBase.Validate())
27 panic(err)
28 }
29
30 if hash == op.Target {
31 base := target.base()
32
33 if base.extraMetadata == nil {
34 base.extraMetadata = make(map[string]string)
35 }
36
37 for key, val := range op.NewMetadata {
38 if _, exist := base.extraMetadata[key]; !exist {
39 base.extraMetadata[key] = val
40 }
41 }
42
43 return
44 }
45 }
46}
47
48func (op *SetMetadataOperation) Validate() error {
49 if err := opBaseValidate(op, SetMetadataOp); err != nil {
50 return err
51 }
52
53 return nil
54}
55
56func NewSetMetadataOp(author Person, unixTime int64, target git.Hash, newMetadata map[string]string) *SetMetadataOperation {
57 return &SetMetadataOperation{
58 OpBase: newOpBase(SetMetadataOp, author, unixTime),
59 Target: target,
60 NewMetadata: newMetadata,
61 }
62}
63
64// Convenience function to apply the operation
65func SetMetadata(b Interface, author Person, unixTime int64, target git.Hash, newMetadata map[string]string) (*SetMetadataOperation, error) {
66 SetMetadataOp := NewSetMetadataOp(author, unixTime, target, newMetadata)
67 if err := SetMetadataOp.Validate(); err != nil {
68 return nil, err
69 }
70 b.Append(SetMetadataOp)
71 return SetMetadataOp, nil
72}