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