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
56// Sign post method for gqlgen
57func (op *SetMetadataOperation) IsAuthored() {}
58
59func NewSetMetadataOp(author Person, unixTime int64, target git.Hash, newMetadata map[string]string) *SetMetadataOperation {
60	return &SetMetadataOperation{
61		OpBase:      newOpBase(SetMetadataOp, author, unixTime),
62		Target:      target,
63		NewMetadata: newMetadata,
64	}
65}
66
67// Convenience function to apply the operation
68func SetMetadata(b Interface, author Person, unixTime int64, target git.Hash, newMetadata map[string]string) (*SetMetadataOperation, error) {
69	SetMetadataOp := NewSetMetadataOp(author, unixTime, target, newMetadata)
70	if err := SetMetadataOp.Validate(); err != nil {
71		return nil, err
72	}
73	b.Append(SetMetadataOp)
74	return SetMetadataOp, nil
75}