From ee701d9e023198e613fd92b65413f0bb81ac4a02 Mon Sep 17 00:00:00 2001 From: Vaibhav Kamra Date: Mon, 19 Dec 2022 14:27:48 -0800 Subject: [PATCH] Update folder entries --- src/internal/kopia/upload.go | 2 +- src/pkg/backup/details/details.go | 43 ++++++++++++++++---------- src/pkg/backup/details/details_test.go | 28 +++++++++++++++-- 3 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/internal/kopia/upload.go b/src/internal/kopia/upload.go index 46eb9cc0b..4082ce108 100644 --- a/src/internal/kopia/upload.go +++ b/src/internal/kopia/upload.go @@ -182,7 +182,7 @@ func (cp *corsoProgress) FinishedFile(relativePath string, err error) { parent = nextParent } - cp.deets.AddFolders(folders) + cp.deets.AddFoldersForItem(folders, d.info) } // Kopia interface function used as a callback when kopia finishes hashing a file. diff --git a/src/pkg/backup/details/details.go b/src/pkg/backup/details/details.go index de1b858c5..6fd23fd61 100644 --- a/src/pkg/backup/details/details.go +++ b/src/pkg/backup/details/details.go @@ -111,8 +111,8 @@ type Details struct { DetailsModel // internal - mu sync.Mutex `json:"-"` - knownFolders map[string]struct{} `json:"-"` + mu sync.Mutex `json:"-"` + knownFolders map[string]FolderEntry `json:"-"` } func (d *Details) Add(repoRef, shortRef, parentRef string, updated bool, info ItemInfo) { @@ -127,23 +127,11 @@ func (d *Details) Add(repoRef, shortRef, parentRef string, updated bool, info It }) } -// AddFolders adds entries for the given folders. It skips adding entries that -// have been added by previous calls. -func (d *Details) AddFolders(folders []FolderEntry) { +func (d *Details) Finalize() { d.mu.Lock() defer d.mu.Unlock() - if d.knownFolders == nil { - d.knownFolders = map[string]struct{}{} - } - - for _, folder := range folders { - if _, ok := d.knownFolders[folder.ShortRef]; ok { - // Entry already exists, nothing to do. - continue - } - - d.knownFolders[folder.ShortRef] = struct{}{} + for _, folder := range d.knownFolders { d.Entries = append(d.Entries, DetailsEntry{ RepoRef: folder.RepoRef, ShortRef: folder.ShortRef, @@ -153,6 +141,29 @@ func (d *Details) AddFolders(folders []FolderEntry) { } } +// AddFoldersForItem adds entries for the given folders. It skips adding entries that +// have been added by previous calls. +func (d *Details) AddFoldersForItem(folders []FolderEntry, itemInfo ItemInfo) { + d.mu.Lock() + defer d.mu.Unlock() + + if d.knownFolders == nil { + d.knownFolders = make(map[string]FolderEntry) + } + + for _, folder := range folders { + if existing, ok := d.knownFolders[folder.ShortRef]; ok { + folder = existing + } + folder.Info.Folder.Size += itemInfo.Exchange.Size + if folder.Info.Folder.Modified.Before(itemInfo.Exchange.Modified) { + folder.Info.Folder.Modified = itemInfo.Exchange.Modified + } + + d.knownFolders[folder.ShortRef] = folder + } +} + // -------------------------------------------------------------------------------- // Entry // -------------------------------------------------------------------------------- diff --git a/src/pkg/backup/details/details_test.go b/src/pkg/backup/details/details_test.go index 093eeb886..78cdf000f 100644 --- a/src/pkg/backup/details/details_test.go +++ b/src/pkg/backup/details/details_test.go @@ -222,6 +222,12 @@ func (suite *DetailsUnitSuite) TestDetailsModel_Items() { } func (suite *DetailsUnitSuite) TestDetails_AddFolders() { + itemInfo := details.ItemInfo{ + Exchange: &details.ExchangeInfo{ + Size: 1, + }, + } + table := []struct { name string folders []details.FolderEntry @@ -234,11 +240,17 @@ func (suite *DetailsUnitSuite) TestDetails_AddFolders() { RepoRef: "rr1", ShortRef: "sr1", ParentRef: "pr1", + Info: details.ItemInfo{ + Folder: &details.FolderInfo{}, + }, }, { RepoRef: "rr2", ShortRef: "sr2", ParentRef: "pr2", + Info: details.ItemInfo{ + Folder: &details.FolderInfo{}, + }, }, }, expectedShortRefs: []string{"sr1", "sr2"}, @@ -250,21 +262,33 @@ func (suite *DetailsUnitSuite) TestDetails_AddFolders() { RepoRef: "rr1", ShortRef: "sr1", ParentRef: "pr1", + Info: details.ItemInfo{ + Folder: &details.FolderInfo{}, + }, }, { RepoRef: "rr2", ShortRef: "sr2", ParentRef: "pr2", + Info: details.ItemInfo{ + Folder: &details.FolderInfo{}, + }, }, { RepoRef: "rr1", ShortRef: "sr1", ParentRef: "pr1", + Info: details.ItemInfo{ + Folder: &details.FolderInfo{}, + }, }, { RepoRef: "rr3", ShortRef: "sr3", ParentRef: "pr3", + Info: details.ItemInfo{ + Folder: &details.FolderInfo{}, + }, }, }, expectedShortRefs: []string{"sr1", "sr2", "sr3"}, @@ -273,8 +297,8 @@ func (suite *DetailsUnitSuite) TestDetails_AddFolders() { for _, test := range table { suite.T().Run(test.name, func(t *testing.T) { deets := details.Details{} - deets.AddFolders(test.folders) - + deets.AddFoldersForItem(test.folders, itemInfo) + deets.Finalize() assert.Len(t, deets.Entries, len(test.expectedShortRefs)) for _, e := range deets.Entries {