aboutsummaryrefslogtreecommitdiffstats
path: root/repository/mock_repo.go
diff options
context:
space:
mode:
Diffstat (limited to 'repository/mock_repo.go')
-rw-r--r--repository/mock_repo.go118
1 files changed, 110 insertions, 8 deletions
diff --git a/repository/mock_repo.go b/repository/mock_repo.go
index f9b070b4..f526c3dc 100644
--- a/repository/mock_repo.go
+++ b/repository/mock_repo.go
@@ -1,14 +1,32 @@
package repository
import (
+ "crypto/sha1"
+ "fmt"
"github.com/MichaelMure/git-bug/util"
+ "github.com/pkg/errors"
)
// mockRepoForTest defines an instance of Repo that can be used for testing.
-type mockRepoForTest struct{}
+type mockRepoForTest struct {
+ blobs map[util.Hash][]byte
+ trees map[util.Hash]string
+ commits map[util.Hash]commit
+ refs map[string]util.Hash
+}
+
+type commit struct {
+ treeHash util.Hash
+ parent util.Hash
+}
func NewMockRepoForTest() Repo {
- return &mockRepoForTest{}
+ return &mockRepoForTest{
+ blobs: make(map[util.Hash][]byte),
+ trees: make(map[util.Hash]string),
+ commits: make(map[util.Hash]commit),
+ refs: make(map[string]util.Hash),
+ }
}
// GetPath returns the path to the repo.
@@ -39,22 +57,106 @@ func (r *mockRepoForTest) PullRefs(remote string, refPattern string, remoteRefPa
return nil
}
-func (r *mockRepoForTest) StoreData([]byte) (util.Hash, error) {
- return "", nil
+func (r *mockRepoForTest) StoreData(data []byte) (util.Hash, error) {
+ rawHash := sha1.Sum(data)
+ hash := util.Hash(fmt.Sprintf("%x", rawHash))
+ r.blobs[hash] = data
+ return hash, nil
+}
+
+func (r *mockRepoForTest) ReadData(hash util.Hash) ([]byte, error) {
+ data, ok := r.blobs[hash]
+
+ if !ok {
+ return nil, errors.New("unknown hash")
+ }
+
+ return data, nil
}
-func (r *mockRepoForTest) StoreTree(mapping map[string]util.Hash) (util.Hash, error) {
- return "", nil
+func (r *mockRepoForTest) StoreTree(entries []TreeEntry) (util.Hash, error) {
+ buffer := prepareTreeEntries(entries)
+ rawHash := sha1.Sum(buffer.Bytes())
+ hash := util.Hash(fmt.Sprintf("%x", rawHash))
+ r.trees[hash] = buffer.String()
+
+ return hash, nil
}
func (r *mockRepoForTest) StoreCommit(treeHash util.Hash) (util.Hash, error) {
- return "", nil
+ rawHash := sha1.Sum([]byte(treeHash))
+ hash := util.Hash(fmt.Sprintf("%x", rawHash))
+ r.commits[hash] = commit{
+ treeHash: treeHash,
+ }
+ return hash, nil
}
func (r *mockRepoForTest) StoreCommitWithParent(treeHash util.Hash, parent util.Hash) (util.Hash, error) {
- return "", nil
+ rawHash := sha1.Sum([]byte(treeHash + parent))
+ hash := util.Hash(fmt.Sprintf("%x", rawHash))
+ r.commits[hash] = commit{
+ treeHash: treeHash,
+ parent: parent,
+ }
+ return hash, nil
}
func (r *mockRepoForTest) UpdateRef(ref string, hash util.Hash) error {
+ r.refs[ref] = hash
return nil
}
+
+func (r *mockRepoForTest) ListRefs(refspec string) ([]string, error) {
+ keys := make([]string, len(r.refs))
+
+ i := 0
+ for k := range r.refs {
+ keys[i] = k
+ i++
+ }
+
+ return keys, nil
+}
+
+func (r *mockRepoForTest) ListCommits(ref string) ([]util.Hash, error) {
+ var hashes []util.Hash
+
+ hash := r.refs[ref]
+
+ for {
+ commit, ok := r.commits[hash]
+
+ if !ok {
+ break
+ }
+
+ hashes = append([]util.Hash{hash}, hashes...)
+ hash = commit.parent
+ }
+
+ return hashes, nil
+}
+
+func (r *mockRepoForTest) ListEntries(hash util.Hash) ([]TreeEntry, error) {
+ var data string
+
+ data, ok := r.trees[hash]
+
+ if !ok {
+ // Git will understand a commit hash to reach a tree
+ commit, ok := r.commits[hash]
+
+ if !ok {
+ return nil, errors.New("unknown hash")
+ }
+
+ data, ok = r.trees[commit.treeHash]
+
+ if !ok {
+ return nil, errors.New("unknown hash")
+ }
+ }
+
+ return readTreeEntries(data)
+}