aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2021-03-21 18:22:04 +0100
committerMichael Muré <batolettre@gmail.com>2021-03-21 18:22:04 +0100
commit5215634d0dca37c545904fbc8a12ddd9b8eb72df (patch)
treeee8094fe3eacd9c732cdd489a37340fdcaf1e678
parent214abe4dea1984086e45d1399538fb12aa010642 (diff)
downloadgit-bug-5215634d0dca37c545904fbc8a12ddd9b8eb72df.tar.gz
entity: add support for storing files
-rw-r--r--entity/dag/common_test.go6
-rw-r--r--entity/dag/operation_pack_test.go71
-rw-r--r--repository/tree_entry.go10
3 files changed, 76 insertions, 11 deletions
diff --git a/entity/dag/common_test.go b/entity/dag/common_test.go
index 1898451d..25289b76 100644
--- a/entity/dag/common_test.go
+++ b/entity/dag/common_test.go
@@ -21,9 +21,9 @@ import (
type op1 struct {
author identity.Interface
- OperationType int `json:"type"`
- Field1 string `json:"field_1"`
- Files []repository.Hash
+ OperationType int `json:"type"`
+ Field1 string `json:"field_1"`
+ Files []repository.Hash `json:"files"`
}
func newOp1(author identity.Interface, field1 string, files ...repository.Hash) *op1 {
diff --git a/entity/dag/operation_pack_test.go b/entity/dag/operation_pack_test.go
index 0fe98dc7..73960800 100644
--- a/entity/dag/operation_pack_test.go
+++ b/entity/dag/operation_pack_test.go
@@ -7,21 +7,16 @@ import (
"github.com/stretchr/testify/require"
"github.com/MichaelMure/git-bug/identity"
+ "github.com/MichaelMure/git-bug/repository"
)
func TestOperationPackReadWrite(t *testing.T) {
repo, id1, _, resolver, def := makeTestContext()
- blobHash1, err := repo.StoreData(randomData())
- require.NoError(t, err)
-
- blobHash2, err := repo.StoreData(randomData())
- require.NoError(t, err)
-
opp := &operationPack{
Author: id1,
Operations: []Operation{
- newOp1(id1, "foo", blobHash1, blobHash2),
+ newOp1(id1, "foo"),
newOp2(id1, "bar"),
},
CreateTime: 123,
@@ -43,7 +38,7 @@ func TestOperationPackReadWrite(t *testing.T) {
opp3 := &operationPack{
Author: id1,
Operations: []Operation{
- newOp1(id1, "foo", blobHash1, blobHash2),
+ newOp1(id1, "foo"),
newOp2(id1, "bar"),
},
CreateTime: 123,
@@ -94,6 +89,66 @@ func TestOperationPackSignedReadWrite(t *testing.T) {
require.Equal(t, opp.Id(), opp3.Id())
}
+func TestOperationPackFiles(t *testing.T) {
+ repo, id1, _, resolver, def := makeTestContext()
+
+ blobHash1, err := repo.StoreData(randomData())
+ require.NoError(t, err)
+
+ blobHash2, err := repo.StoreData(randomData())
+ require.NoError(t, err)
+
+ opp := &operationPack{
+ Author: id1,
+ Operations: []Operation{
+ newOp1(id1, "foo", blobHash1, blobHash2),
+ newOp1(id1, "foo", blobHash2),
+ },
+ CreateTime: 123,
+ EditTime: 456,
+ }
+
+ commitHash, err := opp.Write(def, repo)
+ require.NoError(t, err)
+
+ commit, err := repo.ReadCommit(commitHash)
+ require.NoError(t, err)
+
+ opp2, err := readOperationPack(def, repo, resolver, commit)
+ require.NoError(t, err)
+
+ require.Equal(t, opp, opp2)
+
+ require.ElementsMatch(t, opp2.Operations[0].(OperationWithFiles).GetFiles(), []repository.Hash{
+ blobHash1,
+ blobHash2,
+ })
+ require.ElementsMatch(t, opp2.Operations[1].(OperationWithFiles).GetFiles(), []repository.Hash{
+ blobHash2,
+ })
+
+ tree, err := repo.ReadTree(commit.TreeHash)
+ require.NoError(t, err)
+
+ extraTreeHash, ok := repository.SearchTreeEntry(tree, extraEntryName)
+ require.True(t, ok)
+
+ extraTree, err := repo.ReadTree(extraTreeHash.Hash)
+ require.NoError(t, err)
+ require.ElementsMatch(t, extraTree, []repository.TreeEntry{
+ {
+ ObjectType: repository.Blob,
+ Hash: blobHash1,
+ Name: "file0",
+ },
+ {
+ ObjectType: repository.Blob,
+ Hash: blobHash2,
+ Name: "file1",
+ },
+ })
+}
+
func randomData() []byte {
var letterRunes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, 32)
diff --git a/repository/tree_entry.go b/repository/tree_entry.go
index 6c5ec1a5..9d70814c 100644
--- a/repository/tree_entry.go
+++ b/repository/tree_entry.go
@@ -100,3 +100,13 @@ func readTreeEntries(s string) ([]TreeEntry, error) {
return casted, nil
}
+
+// SearchTreeEntry search a TreeEntry by name from an array
+func SearchTreeEntry(entries []TreeEntry, name string) (TreeEntry, bool) {
+ for _, entry := range entries {
+ if entry.Name == name {
+ return entry, true
+ }
+ }
+ return TreeEntry{}, false
+}