summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-08-15 11:09:03 +0300
committerPaul Buetow <paul@buetow.org>2024-08-15 11:09:03 +0300
commitb7b3a4b5baa6bb8055a1fd0695b261e971cffd4d (patch)
tree6138cacb62544996644f1d58c1a38afe77bbbf4c /internal
parent98599f8c592dcf1eb60c598328116b37d88fd1e4 (diff)
Update marks checksum only dirty when there was really something changed in the entry
Diffstat (limited to 'internal')
-rw-r--r--internal/server/repository/repository.go2
-rw-r--r--internal/server/repository/repository_test.go35
-rw-r--r--internal/types/entry.go24
3 files changed, 38 insertions, 23 deletions
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go
index 4d84f7f..97f7397 100644
--- a/internal/server/repository/repository.go
+++ b/internal/server/repository/repository.go
@@ -201,6 +201,7 @@ func (r Repository) Merge(otherEnt types.Entry) error {
r.entries[otherEnt.ID] = ent
if !ent.Changed {
+ // Hasn't changed, so no need to write anything to file.
return nil
}
@@ -208,6 +209,7 @@ func (r Repository) Merge(otherEnt types.Entry) error {
if err != err {
return err
}
+
return r.fs.WriteFile(r.entryPath(ent), bytes)
}
diff --git a/internal/server/repository/repository_test.go b/internal/server/repository/repository_test.go
index 27840ed..79ea293 100644
--- a/internal/server/repository/repository_test.go
+++ b/internal/server/repository/repository_test.go
@@ -142,8 +142,6 @@ func TestRepositoryMerge(t *testing.T) {
}
}
-// TODO: Finish implementing this test
-// TODO: Also test merging Shared update status'
func TestRepositoryMergeFromPartner(t *testing.T) {
fs1 := make(vfs.MemoryFS)
repo1 := newRepository(server.ServerConfig{DataDir: "./data1"}, fs1)
@@ -199,16 +197,6 @@ func TestRepositoryMergeFromPartner(t *testing.T) {
return nil
}
- // Merge entries from repo2 into repo1
- if err := repo1.mergeFromPartner(context.Background(), "repo2", getPair, getEntry); err != nil {
- t.Error(err)
- }
-
- // Merge entries from repo1 into repo2
- if err := repo2.mergeFromPartner(context.Background(), "repo1", getPair, getEntry); err != nil {
- t.Error(err)
- }
-
// Compare both repos, they should now contain the same entries
compare := func(repo1, repo2 Repository) error {
pairs, err := repo1.List()
@@ -238,12 +226,23 @@ func TestRepositoryMergeFromPartner(t *testing.T) {
return nil
}
- if err := compare(repo1, repo2); err != nil {
- t.Error(err)
- }
- if err := compare(repo2, repo1); err != nil {
- t.Error(err)
- }
+ t.Run("Merge entries from repo2 into repo1", func(t *testing.T) {
+ if err := repo1.mergeFromPartner(context.Background(), "repo2", getPair, getEntry); err != nil {
+ t.Error(err)
+ }
+ if err := compare(repo2, repo1); err != nil {
+ t.Error(err)
+ }
+ })
+
+ t.Run("Merge entries from repo1 into repo2", func(t *testing.T) {
+ if err := repo2.mergeFromPartner(context.Background(), "repo1", getPair, getEntry); err != nil {
+ t.Error(err)
+ }
+ if err := compare(repo1, repo2); err != nil {
+ t.Error(err)
+ }
+ })
}
func makeEntries(t *testing.T) []types.Entry {
diff --git a/internal/types/entry.go b/internal/types/entry.go
index 117cb83..fe15270 100644
--- a/internal/types/entry.go
+++ b/internal/types/entry.go
@@ -123,15 +123,17 @@ func (e Entry) Update(other Entry) (Entry, error) {
if e.ID != other.ID {
return e, fmt.Errorf("can update entry only with other entry with same ID: this(%s) other(%s)", e, other)
}
- e.checksumDirty = true
- e.Changed = true
+
+ var changed bool
if e.Body != other.Body {
e.Body = other.Body
+ changed = true
}
if e.Epoch != other.Epoch {
e.Epoch = other.Epoch
+ changed = true
}
sharedMap := make(map[string]Shared)
@@ -144,10 +146,11 @@ func (e Entry) Update(other Entry) (Entry, error) {
switch {
case !ok:
sharedMap[otherShared.Name] = shared
- continue
- case otherShared.Is:
+ changed = true
+ case otherShared.Is && !shared.Is:
shared.Is = true
sharedMap[otherShared.Name] = shared
+ changed = true
}
}
@@ -156,6 +159,11 @@ func (e Entry) Update(other Entry) (Entry, error) {
e.Shared = append(e.Shared, shared)
}
+ if changed {
+ e.checksumDirty = true
+ e.Changed = true
+ }
+
return e, nil
}
@@ -164,6 +172,12 @@ func (e Entry) JSONMarshal() ([]byte, error) {
}
func (e Entry) String() string {
+ return e.checksumBase()
+}
+
+// Used to calculate the checksum, better don't change the output, otherwise
+// repository database will get confused with entry checksum mismatches.
+func (e Entry) checksumBase() string {
var sb strings.Builder
sb.WriteString("ID:")
@@ -192,7 +206,7 @@ func (e *Entry) Checksum() string {
return e.checksum
}
- e.checksum = fmt.Sprintf("%x", sha256.Sum256([]byte(e.String())))
+ e.checksum = fmt.Sprintf("%x", sha256.Sum256([]byte(e.checksumBase())))
e.checksumDirty = false
return e.checksum
}