diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index 91424e23c..cb5ec9f22 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -29,11 +29,11 @@ func startGUI(cfg GUIConfiguration, m *Model) { router := martini.NewRouter() router.Get("/", getRoot) router.Get("/rest/version", restGetVersion) - router.Get("/rest/model", restGetModel) + router.Get("/rest/model/:repo", restGetModel) router.Get("/rest/connections", restGetConnections) router.Get("/rest/config", restGetConfig) router.Get("/rest/config/sync", restGetConfigInSync) - router.Get("/rest/need", restGetNeed) + router.Get("/rest/need/:repo", restGetNeed) router.Get("/rest/system", restGetSystem) router.Get("/rest/errors", restGetErrors) @@ -73,20 +73,20 @@ func restGetVersion() string { return Version } -func restGetModel(m *Model, w http.ResponseWriter) { +func restGetModel(m *Model, w http.ResponseWriter, params martini.Params) { + var repo = params["repo"] var res = make(map[string]interface{}) - globalFiles, globalDeleted, globalBytes := m.GlobalSize() + globalFiles, globalDeleted, globalBytes := m.GlobalSize(repo) res["globalFiles"], res["globalDeleted"], res["globalBytes"] = globalFiles, globalDeleted, globalBytes - localFiles, localDeleted, localBytes := m.LocalSize() + localFiles, localDeleted, localBytes := m.LocalSize(repo) res["localFiles"], res["localDeleted"], res["localBytes"] = localFiles, localDeleted, localBytes - inSyncFiles, inSyncBytes := m.InSyncSize() - res["inSyncFiles"], res["inSyncBytes"] = inSyncFiles, inSyncBytes + needFiles, needBytes := m.NeedSize(repo) + res["needFiles"], res["needBytes"] = needFiles, needBytes - files, total := m.NeedFiles() - res["needFiles"], res["needBytes"] = len(files), total + res["inSyncFiles"], res["inSyncBytes"] = globalFiles-needFiles, globalBytes-needBytes w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(res) @@ -142,8 +142,9 @@ func (f guiFile) MarshalJSON() ([]byte, error) { }) } -func restGetNeed(m *Model, w http.ResponseWriter) { - files, _ := m.NeedFiles() +func restGetNeed(m *Model, w http.ResponseWriter, params martini.Params) { + repo := params["repo"] + files := m.NeedFilesRepo(repo) gfs := make([]guiFile, len(files)) for i, f := range files { gfs[i] = guiFile(f) diff --git a/cmd/syncthing/model.go b/cmd/syncthing/model.go index b1c87b8cc..cfaa06165 100644 --- a/cmd/syncthing/model.go +++ b/cmd/syncthing/model.go @@ -158,70 +158,45 @@ func sizeOf(fs []scanner.File) (files, deleted int, bytes int64) { // GlobalSize returns the number of files, deleted files and total bytes for all // files in the global model. -func (m *Model) GlobalSize() (files, deleted int, bytes int64) { +func (m *Model) GlobalSize(repo string) (files, deleted int, bytes int64) { m.rmut.RLock() - var fs []scanner.File - for _, rf := range m.repoFiles { - fs = append(fs, rf.Global()...) + defer m.rmut.RUnlock() + if rf, ok := m.repoFiles[repo]; ok { + return sizeOf(rf.Global()) } - m.rmut.RUnlock() - return sizeOf(fs) + return 0, 0, 0 } // LocalSize returns the number of files, deleted files and total bytes for all // files in the local repository. -func (m *Model) LocalSize() (files, deleted int, bytes int64) { +func (m *Model) LocalSize(repo string) (files, deleted int, bytes int64) { m.rmut.RLock() - var fs []scanner.File - for _, rf := range m.repoFiles { - fs = append(fs, rf.Have(cid.LocalID)...) + defer m.rmut.RUnlock() + if rf, ok := m.repoFiles[repo]; ok { + return sizeOf(rf.Have(cid.LocalID)) } - m.rmut.RUnlock() - return sizeOf(fs) -} - -// InSyncSize returns the number and total byte size of the local files that -// are in sync with the global model. -func (m *Model) InSyncSize() (files int, bytes int64) { - var gf []scanner.File - var nf []scanner.File - - m.rmut.RLock() - for _, rf := range m.repoFiles { - gf = append(gf, rf.Global()...) - nf = append(nf, rf.Need(cid.LocalID)...) - } - m.rmut.RUnlock() - - gn, _, gb := sizeOf(gf) - nn, _, nb := sizeOf(nf) - - return gn - nn, gb - nb + return 0, 0, 0 } // NeedFiles returns the list of currently needed files and the total size. -func (m *Model) NeedFiles() ([]scanner.File, int64) { - var nf []scanner.File - m.rmut.RLock() - for _, rf := range m.repoFiles { - nf = append(nf, rf.Need(cid.LocalID)...) - } - m.rmut.RUnlock() +func (m *Model) NeedSize(repo string) (files int, bytes int64) { + var nf = m.NeedFilesRepo(repo) - var bytes int64 for _, f := range nf { bytes += f.Size } - return nf, bytes + return len(nf), bytes } // NeedFiles returns the list of currently needed files and the total size. func (m *Model) NeedFilesRepo(repo string) []scanner.File { m.rmut.RLock() - nf := m.repoFiles[repo].Need(cid.LocalID) - m.rmut.RUnlock() - return nf + defer m.rmut.RUnlock() + if rf, ok := m.repoFiles[repo]; ok { + return rf.Need(cid.LocalID) + } + return nil } // Index is called when a new node is connected and we receive their full index.