diff options
| author | Paul Buetow <paul@buetow.org> | 2024-08-15 11:09:03 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-08-15 11:09:03 +0300 |
| commit | b7b3a4b5baa6bb8055a1fd0695b261e971cffd4d (patch) | |
| tree | 6138cacb62544996644f1d58c1a38afe77bbbf4c /internal | |
| parent | 98599f8c592dcf1eb60c598328116b37d88fd1e4 (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.go | 2 | ||||
| -rw-r--r-- | internal/server/repository/repository_test.go | 35 | ||||
| -rw-r--r-- | internal/types/entry.go | 24 |
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 } |
