op_set_metadata.go

 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}