Update folder entries

This commit is contained in:
Vaibhav Kamra 2022-12-19 14:27:48 -08:00
parent b75c58cc64
commit ee701d9e02
3 changed files with 54 additions and 19 deletions

View File

@ -182,7 +182,7 @@ func (cp *corsoProgress) FinishedFile(relativePath string, err error) {
parent = nextParent 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. // Kopia interface function used as a callback when kopia finishes hashing a file.

View File

@ -111,8 +111,8 @@ type Details struct {
DetailsModel DetailsModel
// internal // internal
mu sync.Mutex `json:"-"` mu sync.Mutex `json:"-"`
knownFolders map[string]struct{} `json:"-"` knownFolders map[string]FolderEntry `json:"-"`
} }
func (d *Details) Add(repoRef, shortRef, parentRef string, updated bool, info ItemInfo) { 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 func (d *Details) Finalize() {
// have been added by previous calls.
func (d *Details) AddFolders(folders []FolderEntry) {
d.mu.Lock() d.mu.Lock()
defer d.mu.Unlock() defer d.mu.Unlock()
if d.knownFolders == nil { for _, folder := range d.knownFolders {
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{}{}
d.Entries = append(d.Entries, DetailsEntry{ d.Entries = append(d.Entries, DetailsEntry{
RepoRef: folder.RepoRef, RepoRef: folder.RepoRef,
ShortRef: folder.ShortRef, 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 // Entry
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------

View File

@ -222,6 +222,12 @@ func (suite *DetailsUnitSuite) TestDetailsModel_Items() {
} }
func (suite *DetailsUnitSuite) TestDetails_AddFolders() { func (suite *DetailsUnitSuite) TestDetails_AddFolders() {
itemInfo := details.ItemInfo{
Exchange: &details.ExchangeInfo{
Size: 1,
},
}
table := []struct { table := []struct {
name string name string
folders []details.FolderEntry folders []details.FolderEntry
@ -234,11 +240,17 @@ func (suite *DetailsUnitSuite) TestDetails_AddFolders() {
RepoRef: "rr1", RepoRef: "rr1",
ShortRef: "sr1", ShortRef: "sr1",
ParentRef: "pr1", ParentRef: "pr1",
Info: details.ItemInfo{
Folder: &details.FolderInfo{},
},
}, },
{ {
RepoRef: "rr2", RepoRef: "rr2",
ShortRef: "sr2", ShortRef: "sr2",
ParentRef: "pr2", ParentRef: "pr2",
Info: details.ItemInfo{
Folder: &details.FolderInfo{},
},
}, },
}, },
expectedShortRefs: []string{"sr1", "sr2"}, expectedShortRefs: []string{"sr1", "sr2"},
@ -250,21 +262,33 @@ func (suite *DetailsUnitSuite) TestDetails_AddFolders() {
RepoRef: "rr1", RepoRef: "rr1",
ShortRef: "sr1", ShortRef: "sr1",
ParentRef: "pr1", ParentRef: "pr1",
Info: details.ItemInfo{
Folder: &details.FolderInfo{},
},
}, },
{ {
RepoRef: "rr2", RepoRef: "rr2",
ShortRef: "sr2", ShortRef: "sr2",
ParentRef: "pr2", ParentRef: "pr2",
Info: details.ItemInfo{
Folder: &details.FolderInfo{},
},
}, },
{ {
RepoRef: "rr1", RepoRef: "rr1",
ShortRef: "sr1", ShortRef: "sr1",
ParentRef: "pr1", ParentRef: "pr1",
Info: details.ItemInfo{
Folder: &details.FolderInfo{},
},
}, },
{ {
RepoRef: "rr3", RepoRef: "rr3",
ShortRef: "sr3", ShortRef: "sr3",
ParentRef: "pr3", ParentRef: "pr3",
Info: details.ItemInfo{
Folder: &details.FolderInfo{},
},
}, },
}, },
expectedShortRefs: []string{"sr1", "sr2", "sr3"}, expectedShortRefs: []string{"sr1", "sr2", "sr3"},
@ -273,8 +297,8 @@ func (suite *DetailsUnitSuite) TestDetails_AddFolders() {
for _, test := range table { for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) { suite.T().Run(test.name, func(t *testing.T) {
deets := details.Details{} deets := details.Details{}
deets.AddFolders(test.folders) deets.AddFoldersForItem(test.folders, itemInfo)
deets.Finalize()
assert.Len(t, deets.Entries, len(test.expectedShortRefs)) assert.Len(t, deets.Entries, len(test.expectedShortRefs))
for _, e := range deets.Entries { for _, e := range deets.Entries {