1package cache
2
3import (
4 "time"
5
6 "github.com/MichaelMure/git-bug/bug"
7 "github.com/MichaelMure/git-bug/operations"
8 "github.com/MichaelMure/git-bug/util/git"
9)
10
11type BugCache struct {
12 repoCache *RepoCache
13 bug *bug.WithSnapshot
14}
15
16func NewBugCache(repoCache *RepoCache, b *bug.Bug) *BugCache {
17 return &BugCache{
18 repoCache: repoCache,
19 bug: &bug.WithSnapshot{Bug: b},
20 }
21}
22
23func (c *BugCache) Snapshot() *bug.Snapshot {
24 return c.bug.Snapshot()
25}
26
27func (c *BugCache) Id() string {
28 return c.bug.Id()
29}
30
31func (c *BugCache) HumanId() string {
32 return c.bug.HumanId()
33}
34
35func (c *BugCache) notifyUpdated() error {
36 return c.repoCache.bugUpdated(c.bug.Id())
37}
38
39func (c *BugCache) AddComment(message string) error {
40 return c.AddCommentWithFiles(message, nil)
41}
42
43func (c *BugCache) AddCommentWithFiles(message string, files []git.Hash) error {
44 author, err := bug.GetUser(c.repoCache.repo)
45 if err != nil {
46 return err
47 }
48
49 return c.AddCommentRaw(author, time.Now().Unix(), message, files, nil)
50}
51
52func (c *BugCache) AddCommentRaw(author bug.Person, unixTime int64, message string, files []git.Hash, metadata map[string]string) error {
53 err := operations.CommentWithFiles(c.bug, author, unixTime, message, files)
54 if err != nil {
55 return err
56 }
57
58 return c.notifyUpdated()
59}
60
61func (c *BugCache) ChangeLabels(added []string, removed []string) ([]operations.LabelChangeResult, error) {
62 author, err := bug.GetUser(c.repoCache.repo)
63 if err != nil {
64 return nil, err
65 }
66
67 return c.ChangeLabelsRaw(author, time.Now().Unix(), added, removed)
68}
69
70func (c *BugCache) ChangeLabelsRaw(author bug.Person, unixTime int64, added []string, removed []string) ([]operations.LabelChangeResult, error) {
71 changes, err := operations.ChangeLabels(c.bug, author, unixTime, added, removed)
72 if err != nil {
73 return changes, err
74 }
75
76 err = c.notifyUpdated()
77 if err != nil {
78 return nil, err
79 }
80
81 return changes, nil
82}
83
84func (c *BugCache) Open() error {
85 author, err := bug.GetUser(c.repoCache.repo)
86 if err != nil {
87 return err
88 }
89
90 return c.OpenRaw(author, time.Now().Unix())
91}
92
93func (c *BugCache) OpenRaw(author bug.Person, unixTime int64) error {
94 err := operations.Open(c.bug, author, unixTime)
95 if err != nil {
96 return err
97 }
98
99 return c.notifyUpdated()
100}
101
102func (c *BugCache) Close() error {
103 author, err := bug.GetUser(c.repoCache.repo)
104 if err != nil {
105 return err
106 }
107
108 return c.CloseRaw(author, time.Now().Unix())
109}
110
111func (c *BugCache) CloseRaw(author bug.Person, unixTime int64) error {
112 err := operations.Close(c.bug, author, unixTime)
113 if err != nil {
114 return err
115 }
116
117 return c.notifyUpdated()
118}
119
120func (c *BugCache) SetTitle(title string) error {
121 author, err := bug.GetUser(c.repoCache.repo)
122 if err != nil {
123 return err
124 }
125
126 return c.SetTitleRaw(author, time.Now().Unix(), title)
127}
128
129func (c *BugCache) SetTitleRaw(author bug.Person, unixTime int64, title string) error {
130 err := operations.SetTitle(c.bug, author, unixTime, title)
131 if err != nil {
132 return err
133 }
134
135 return c.notifyUpdated()
136}
137
138func (c *BugCache) Commit() error {
139 return c.bug.Commit(c.repoCache.repo)
140}
141
142func (c *BugCache) CommitAsNeeded() error {
143 if c.bug.HasPendingOp() {
144 return c.bug.Commit(c.repoCache.repo)
145 }
146 return nil
147}