diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index b9910e863..a39def1da 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -71,7 +71,7 @@ type modelIntf interface { Completion(device protocol.DeviceID, folder string) model.FolderCompletion Override(folder string) NeedFolderFiles(folder string, page, perpage int) ([]db.FileInfoTruncated, []db.FileInfoTruncated, []db.FileInfoTruncated, int) - NeedSize(folder string) (nfiles int, bytes int64) + NeedSize(folder string) (nfiles, ndeletes int, bytes int64) ConnectionStats() map[string]interface{} DeviceStatistics() map[string]stats.DeviceStatistics FolderStatistics() map[string]stats.FolderStatistics @@ -609,8 +609,8 @@ func folderSummary(cfg configIntf, m modelIntf, folder string) map[string]interf localFiles, localDeleted, localBytes := m.LocalSize(folder) res["localFiles"], res["localDeleted"], res["localBytes"] = localFiles, localDeleted, localBytes - needFiles, needBytes := m.NeedSize(folder) - res["needFiles"], res["needBytes"] = needFiles, needBytes + needFiles, needDeletes, needBytes := m.NeedSize(folder) + res["needFiles"], res["needDeletes"], res["needBytes"] = needFiles, needDeletes, needBytes res["inSyncFiles"], res["inSyncBytes"] = globalFiles-needFiles, globalBytes-needBytes diff --git a/cmd/syncthing/mocked_model_test.go b/cmd/syncthing/mocked_model_test.go index 72ac6f83c..6c8c805e5 100644 --- a/cmd/syncthing/mocked_model_test.go +++ b/cmd/syncthing/mocked_model_test.go @@ -31,8 +31,8 @@ func (m *mockedModel) NeedFolderFiles(folder string, page, perpage int) ([]db.Fi return nil, nil, nil, 0 } -func (m *mockedModel) NeedSize(folder string) (nfiles int, bytes int64) { - return 0, 0 +func (m *mockedModel) NeedSize(folder string) (nfiles, ndeletes int, bytes int64) { + return 0, 0, 0 } func (m *mockedModel) ConnectionStats() map[string]interface{} { diff --git a/lib/model/model.go b/lib/model/model.go index e1f32de03..0eab34c3c 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -564,7 +564,7 @@ func (m *Model) LocalSize(folder string) (nfiles, deleted int, bytes int64) { } // NeedSize returns the number and total size of currently needed files. -func (m *Model) NeedSize(folder string) (nfiles int, bytes int64) { +func (m *Model) NeedSize(folder string) (nfiles, ndeletes int, bytes int64) { m.fmut.RLock() defer m.fmut.RUnlock() if rf, ok := m.folderFiles[folder]; ok { @@ -576,7 +576,8 @@ func (m *Model) NeedSize(folder string) (nfiles int, bytes int64) { } fs, de, by := sizeOfFile(f) - nfiles += fs + de + nfiles += fs + ndeletes += de bytes += by return true }) diff --git a/lib/model/model_test.go b/lib/model/model_test.go index e4b62c0fd..f4e36a88a 100644 --- a/lib/model/model_test.go +++ b/lib/model/model_test.go @@ -1720,6 +1720,17 @@ func TestIssue3496(t *testing.T) { t.Errorf("Fully complete, not possible: %.02f%%", comp.CompletionPct) } t.Log(comp) + + // Check that NeedSize does the correct thing + files, deletes, bytes := m.NeedSize("default") + if files != 1 || bytes != 1234 { + // The one we added synthetically above + t.Errorf("Incorrect need size; %d, %d != 1, 1234", files, bytes) + } + if deletes != len(localFiles)-1 { + // The rest + t.Errorf("Incorrect need deletes; %d != %d", deletes, len(localFiles)-1) + } } func addFakeConn(m *Model, dev protocol.DeviceID) {