diff options
author | Michael Muré <batolettre@gmail.com> | 2018-08-23 19:11:38 +0200 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2018-08-23 19:15:50 +0200 |
commit | 16f55e3f4d560330a638986130d27fd067300169 (patch) | |
tree | 41cfedb5c11bf9accd131d34b8a9ac25cfafaa05 /bug/with_snapshot.go | |
parent | 6d7dc465d881d0d04b01dfb6e09870346216d2d0 (diff) | |
download | git-bug-16f55e3f4d560330a638986130d27fd067300169.tar.gz |
bug: introduce WithSnapshot to maintain incrementally and effitiently a snapshot
Diffstat (limited to 'bug/with_snapshot.go')
-rw-r--r-- | bug/with_snapshot.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/bug/with_snapshot.go b/bug/with_snapshot.go new file mode 100644 index 00000000..0aa3b37d --- /dev/null +++ b/bug/with_snapshot.go @@ -0,0 +1,58 @@ +package bug + +import "github.com/MichaelMure/git-bug/repository" + +var _ Interface = &WithSnapshot{} + +// WithSnapshot encapsulate a Bug and maintain the corresponding Snapshot efficiently +type WithSnapshot struct { + *Bug + snap *Snapshot +} + +// Snapshot return the current snapshot +func (b *WithSnapshot) Snapshot() *Snapshot { + if b.snap == nil { + snap := b.Bug.Compile() + b.snap = &snap + } + return b.snap +} + +// Append intercept Bug.Append() to update the snapshot efficiently +func (b *WithSnapshot) Append(op Operation) { + b.Bug.Append(op) + + if b.snap == nil { + return + } + + snap := op.Apply(*b.snap) + b.snap = &snap +} + +// Commit intercept Bug.Commit() to update the snapshot efficiently +func (b *WithSnapshot) Commit(repo repository.Repo) error { + err := b.Bug.Commit(repo) + + if err != nil { + b.snap = nil + return err + } + + // Commit() shouldn't change anything of the bug state apart from the + // initial ID set + + if b.snap == nil { + return nil + } + + b.snap.id = b.Bug.id + return nil +} + +// Merge intercept Bug.Merge() and clear the snapshot +func (b *WithSnapshot) Merge(repo repository.Repo, other Interface) (bool, error) { + b.snap = nil + return b.Bug.Merge(repo, other) +} |