diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index cda50d4a8..bfe7bbe60 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -354,7 +354,12 @@ func folderSummary(m *model.Model, folder string) map[string]interface{} { res["inSyncFiles"], res["inSyncBytes"] = globalFiles-needFiles, globalBytes-needBytes - res["state"], res["stateChanged"] = m.State(folder) + var err error + res["state"], res["stateChanged"], err = m.State(folder) + if err != nil { + res["error"] = err.Error() + } + res["version"] = m.CurrentLocalVersion(folder) + m.RemoteLocalVersion(folder) ignorePatterns, _, _ := m.GetIgnores(folder) diff --git a/cmd/syncthing/main_test.go b/cmd/syncthing/main_test.go index b64a10274..ccd05184a 100644 --- a/cmd/syncthing/main_test.go +++ b/cmd/syncthing/main_test.go @@ -42,6 +42,7 @@ func TestFolderErrors(t *testing.T) { m := model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m.AddFolder(fcfg) + m.StartFolderRW("folder") if err := m.CheckFolderHealth("folder"); err != nil { t.Error("Unexpected error", cfg.Folders()["folder"].Invalid) @@ -69,6 +70,7 @@ func TestFolderErrors(t *testing.T) { m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m.AddFolder(fcfg) + m.StartFolderRW("folder") if err := m.CheckFolderHealth("folder"); err != nil { t.Error("Unexpected error", cfg.Folders()["folder"].Invalid) @@ -90,8 +92,9 @@ func TestFolderErrors(t *testing.T) { m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m.AddFolder(fcfg) + m.StartFolderRW("folder") - if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "Folder marker missing" { + if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" { t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder")) } @@ -117,8 +120,9 @@ func TestFolderErrors(t *testing.T) { m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m.AddFolder(fcfg) + m.StartFolderRW("folder") - if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "Folder path missing" { + if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder path missing" { t.Error("Incorrect error: Folder path missing !=", m.CheckFolderHealth("folder")) } @@ -126,7 +130,7 @@ func TestFolderErrors(t *testing.T) { os.Mkdir("testdata/testfolder", 0700) - if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "Folder marker missing" { + if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" { t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder")) } diff --git a/gui/index.html b/gui/index.html index 82e9b6513..e448e7c31 100644 --- a/gui/index.html +++ b/gui/index.html @@ -193,9 +193,9 @@ Folder Path {{folder.path}} - + Error - {{model[folder.id].invalid}} + {{model[folder.id].invalid || model[folder.id].error}} Global State diff --git a/gui/scripts/syncthing/core/controllers/syncthingController.js b/gui/scripts/syncthing/core/controllers/syncthingController.js index 7478afe01..76dbce854 100644 --- a/gui/scripts/syncthing/core/controllers/syncthingController.js +++ b/gui/scripts/syncthing/core/controllers/syncthingController.js @@ -461,10 +461,14 @@ angular.module('syncthing.core') return 'unshared'; } - if ($scope.model[folderCfg.id].invalid !== '') { + if ($scope.model[folderCfg.id].invalid) { return 'stopped'; } + if ($scope.model[folderCfg.id].state == 'error') { + return 'stopped'; // legacy, the state is called "stopped" in the GUI + } + return '' + $scope.model[folderCfg.id].state; }; @@ -494,6 +498,9 @@ angular.module('syncthing.core') if (state == 'scanning') { return 'primary'; } + if (state == 'error') { + return 'danger'; + } return 'info'; }; diff --git a/internal/auto/gui.files.go b/internal/auto/gui.files.go index 92a36f69b..194092581 100644 --- a/internal/auto/gui.files.go +++ b/internal/auto/gui.files.go @@ -5,7 +5,7 @@ import ( ) const ( - AssetsBuildDate = "Sun, 12 Apr 2015 21:49:29 GMT" + AssetsBuildDate = "Sun, 12 Apr 2015 22:43:36 GMT" ) func Assets() map[string][]byte { @@ -75,7 +75,7 @@ func Assets() map[string][]byte { assets["assets/lang/valid-langs.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/ypLLFIoS8zJTPFJzEsvVrBViFZKSlXSUUpKBxLJiSCiGEikgMRSc0BEHpjQdXcC0SC5tCIgkVEKJDJLgEQOiMhLAhEg9Xkg9QUgVkGJrlMQhA4IAdJFIC3FZUCiBGRCaTaQqMrQdfaD0CHhSrFcAAAAAP//AQAA//+S0NbanwAAAA==") - assets["index.html"], _ = base64.StdEncoding.DecodeString("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") + assets["index.html"], _ = base64.StdEncoding.DecodeString("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") assets["modal.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3yTUW+bMBDH3/cpbjwsrVRCW/UpSzptkSZN6qRK7csejX2AV2Mj+0jHEN99h2EsrdI9JDbmfnf3/5/ZKn0AaUQIu6R2ShgohMIESOTaKvy1S9KrBGyZCiKfKkEizYV8Ut41u6TvGXUB4ROQbxE2sAokSMsVDMMr6gm73AmvIvXFOYPCnkX6fAy+fQewfZ+mvGQZ7F3TeV1WBGf7c7i+vLqBxwrhobOSKm1L+NxS5XxYx/CJeax0gAfXeonMK4SvztfAZ6HNf6IkIAfESQh9HcAV8eG7+62NEXDf5kbLKdGdlmgDXsBhDdfryzV8K0CA5JYW6v4OnkUA6wiUDuR13hIqeNZUcQDXLLTBiyndD9eCFBZcTkLzYhEEQUXUbLKsnuqvnS8zzppxvWwUlabRkNfDSZUWxpXR2vm8X01vTLnagBG+xMnMU7R0ltDS/P5URIU8fQ/CoKfpP+37caZtGIaFY7K6eQmSJoNHARwSGlbNjepil2gunfwlStM11XgCy46rjMtYY5uN4HGmvo/Zh+Ff+ay6WURkrOJtRblTXfSLvLBBmlbh2+TcbbyWycs8hXN8c44t4JkTa6CuwV0yPSxMThb4lyosRGso7kOdQPwU+MrUesnMiqNT/zHHY+0OuFjzAevQfJyoqMoIwtv92PQcsc2mfk4oXbbzZl7+AAAA//8BAAD//53P618IBAAA") @@ -83,7 +83,7 @@ func Assets() map[string][]byte { assets["scripts/syncthing/core/controllers/eventController.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/7RUQYvbPBC951fMtyzY4XO9SaGnkPbQ7sKeeuiWHkoPij22BbIUNNKGUPLfO5ITr+M4bCmtLnFGM2/ePD3pWVgocePr+2fUjmANlVCEq9lM6NorYfPWlF5hmtBeF66Rus4LYzGZz4AXf2tnjVJo0yRCfOwDSQaV5xppNKS3VJgtZnDbOLedw89YHVbiCYGclYVLuOsp3OXnSpCLsExMe6VWfUIgHnYfP/HWYlAZNsgXBRI96DBPz6EUTgxbh3V3B98a1PDlNB1YJCcsS7FrpEJwDYIyHN/yUGGfJ9bYIUoCqcdwW2tqxqBYubFmR2iBk8m0CFslXGVsS9zGeasJBLxdLCAlqYvYbAzXoCjREjSCYIPMtFKeGixhJ10Te3RIzKvEgDXPui1tIAycjwGfGqa9ESQLodQeWhQ6cBUugg2m6zvyNOgyELrsUrhuDLrjXG0ciML5CMsnwBpUXp33lxWk/02dQ1horbEPujun1cV2N+d5/DA7+3t0zS220qXJ18fPmo+MvbqaXbA4euc9LKaoROX4oO5F0aQvDsJgxan8E+rgKl1LC4tVJqPY3qZObyLoTQbxN5fl6cvtw4Xpvq9I0kkwFT1T4gJvAuow/x1lh/cxcPoehVKoa3bcG1j+OAfpL+i4nMccnQlb7Em2aLwb6D2lYXxB8hpd6q1iHyP8D8ldHIs+xGu0TjjUtZ5PipMf34e0fyeu5EVHpkdfjgXK4B3ftpfgYfQIHctefYIuTFtVk679OwopyW3Wy+TfKrNcXJXmD9i9xmqSTTD0LwAAAP//AQAA//8bMA983gYAAA==") - assets["scripts/syncthing/core/controllers/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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") + assets["scripts/syncthing/core/controllers/syncthingController.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/+x9e3MbN/Lg//kUY50vJCOakvNw7UpRUopl7+oSP8qyN1el1V6NSFCc9XCGOw/J2tj32X/deMwMgAYGQ8nZ3aplpWKK02g0Go3uRqPRE2dXdRoXs3W+qFM2HpW32bxaJdnVbJ4XbDT5IoIPfM+WydV4WcPDJM/GD9N8HuO310V+nSxYMYl+45D4sR7OVtU6/e5FvmDjqqjZZLaKy9Xrgi2TD+PRg9HkkDf91PZVFXmasmI8OlPUPG1+HE0jRUY0fljO8w2bRg9XVbWZtj1Po1/gW8rOWHGdzFmXulFdsqisimRejQ6/aH7e24s2RXIdV2xvxdINK6IF0JcliK1swa7jAuDY9QkARkfR/qH2JIuvkysgILs6volv4fkyTkumw+RZmmSMflawsooLbN8+bwCaUSNVLT/G3cHhRxv5LK6r/CmfPfH7eHKoQZesOs0qAI5Tyc0ZTAwQsppGj/fh04H/9IXOr/oyme/xNjSzJL55vt6kjJN+FP326dB+juT5np1mKAgAgeJDwWSMs6akkbCiyAt8dn5hPQO5ZyndbH17egJPRiPryYIhbx0YxcM37O9empZ5CiujD2pT5FU+z9OnK1inbGFLTTNlm7yoQChjGo94DkvuOmE3TiyCJgcpJWPZM2QkzZJ6c1XEC3aaLXMAyOo0dTDmrIorL088AMCOKxBNx9NroL0Vsvbp+CbJFvnNZHYJ/45Hl2wJmq3O0jxeaMrEXEjWatal79Pk0BL1h6AbdxotJGbtrJ6DrJQ7vq70NQsaSi7WBhWwPy7mq/FklgLOiZ+KjLHFcStWWk+jYj06iEYnLB1NzQeLpJDPojF8n5gQaBsQABej+azK6/kKH77bLEA3jloCrXlC8k7nHuIKts6vmZM++rEiDmZaTq2DwLgEdZeU7zUSqYkcvTt9xZW1JiXsmmXVNIqLK3MSk2U0ltr9yy+jB60yNwHxU7CqLjJdF3/6QvsTWZSnbJbmVx1auvMtEHFtfXYLw1qb2l0+FAbA/VCqT77yHFAn7eJ1QDxvV+/YJJLb59kVq8Z1kV7GYIF3o9FeyWnek+t2NJmVYqmMW26DLMUU+6wlj4AGNydC8SuzxtZJ9ee3b19zJRZI4PV8T6jObYjTlPLnoU8wUOrebWjU1baHSLfucmLTjYDAZgyrcYZ01YofyhfSuhyP/lfGqpu8eM85BqMHWw5ezGiVLNhoYkO3GPthy1VdoSZxQ7rUP67U5XKg2jBMzceP0QPBmntSHZIgY6AuV1RR1aPCnDMwMWnr5Vkj94E8A+/zGSyXClyimxXLojhCDBHYzBQGk6TlLPqVRejpVyv09uOqLoEpC/g7B1m7NZHBr6Ag64JFeV0ByrgaldFNkcM26Ivfd7K6nMCB3+uMIQggnUmGHB3BDoaCk1w5juT0RlwHTKMsr6I4E7zmP5Et1cSiQvNIH+dExGAcJl0/HEXf7u+jEe38+P1R9N0f/+il9oplNbKnj75BmqPbKlSDdNv0axKzBap674LinBu6xNAwM7mPCFxluCVdCPOFE2FbB5y37j7qHEGkG3/hsRM2MJ9lJk3QrMoHaxDuMJ9mC/ZBOKD3Nkbau+ml5w04qRXbgiCQ5Jc5j3n0dyKcspOklFvg4E6A/QzYbW+gzxUTZsniYogj2EPj04EEcmXWQ55HwFxNrB1H0192uSkPov0p+RSMgu9xkv10W7HybV7FqQ9HAFS8WOAG96ARxhn+Yq9+WyFYwZawgf+/StDzeH+/r5eAVagiTeAEEjNNTbIW55nlGz5ns7o4Bkd2g/bdaaRgoZwuwcbHVywSrjb6iqu4jC4ZuAQZS8D2F1GsEGU5xvTmaIoWNvMB2w2LbuKsQmcgLt9zzwE8iAL/XsfvGTgZ81WO+/PoJ3QSWLSATUvF21DooNllfYVo1tGiLpA4HiKLUwy61ZtpVOaIBf5A1Hn+PgECgGgSGRBTJWvwT5b8+zIpyiq6TsqkAlcHXaAKnBaFJSkxSFkymrA4W7T4AHSdF+gngWFf5nURreB/ZRRf5VOkTnKCwvOPGswhxia+sJ6iVuUk/gUpRLWez+s10DMTFOLeKI3nbLw3/vEA/vvbx9lXh38tv5q0jeCvvx7B/8bnfzu8+Goy++rh5OPf4P9702jn4eMdwiRyndEicLkKBilA3E7b6GgHNlYY3J1l+Q1sdXajncN1/OERCBl/9M1+9FX09bfwv2+e7O87HRqHkgECdzts+b7b06NIYYV/MPLqoh8/6CbUXv+AE3N3r+GkE8wMVt6OQGirkMSTC2FzA2zI806wdCgVZqC1pUI8wSl+hFO7NXVC6Z3F18Gk1dwj4C6LDM2ozgft+4XS3EsyHvvaYvdvRNf56Lu/DQtY9AuTDM29lmHcAS5aKYPCtI8mTmXI2DB+lqD5x1wliRlPMoGP4oxCcy4dUwKdjjJJWYPw3OP6NiMBjBrwOaK4oFewOBQCK4Sh/8dcNZQz+cMefOXG290UWJ+wxfMiX78qkqsk6yCxHg1C9wyUHGy8C0ZibJ8GIN3UaaoNT/4Q2FTEh7pt8ZeexmC8fmUYB0AjXeQ1GMR606BD+1+lLC7RLm9YMQfBRFvNLSyo7Zu8ThfgZHSgLhNhjC9hG+9U/Qr/99Fj3NvKce6SbN21525XSQLshN0bYfx0+BJqGHgzQ/SFYDo9R/wIig7kv7RLix9zMAfWLyFtG/YcUD+6MQhOH8h//XDAtwP1xQ152fHky1n7V0+LkzxjTQP8g4Yn9I3LcOOHUG/GeZkrFvRg3DZpYF2S1fHW8QQHuC/agn8usPhEUm4eX0JD2We4z9LGiLbqnrNHqWmDMX0Ku8MoicBq6Ws6aOTqc1mw+L0bhF674a4efuzjVPX10BmZ3DGt987UErNgV+6sXq/j4va+YjTOsJJyakrRXzB9T5td9H2Gyh7Ye/Suw+l11MgWhHNCTrSjOcmqFtZwRXGIYFMx68VWW/Os0tNh8NMopvl601l8A4aPXMPGGATYEaGKHdeCw7yhJDOPkWye4AfHsXvUxx7omfDLcKi7lmkdwveZGAkeewEde4jRL5map43Rf83Bn8oDjmm0YjEmcEwj4cQ7dkQyMN89afgN8RxEXWwHJtYDE/2B/PdTd90f6rlSC3YJ7tUctDX8vzRTM5pxaEHWMa3PEd17hnkYOxo47t1EC2LF6f2fQ3tSzggwXA/y157DT85acp+2uNwTTPxREHg0gp9ZhgdR796copIBHyCr1ICH7OCMORWqT1/Kbhui6XWdmVPJy2kkt6NU+9CdYAMvcsmm/JjXeTromIixnoGmvjYssjfTtPSj/Kzi8qnKNnuQlM/Wm+r21SWGBvRApLUNNzLVxBfSCBmRzDSBrXp2LMK6ZxWu3gDA2d/zBIzRNLLOpsm2V2l+GafHWcZ5h2lEsEx9nZENtE7dAZ3Swip/JymVz8DKFM/i+aor2eJgYEmfLdsKVIFLlKcn9xPUphmsyC7zolKUAi1xYYqvlTonvr2IN0ZoW0IYzYXwzUDOy7GOakKwzO3okgrUeUggu1D6YttJ6nTcOkxje6KUTqE0g6kNTNHjWrxZth5RkVZNO4FwJyK4bZBKpDJtpy8QJ5T8NhE4mWPKvQP87pwy0ZNTs0uoWF/Rb6WbwdGzD5Va8K9+jn7URM8GmMxSll1Vq+jA9Orww3ebcSICN+eEk9S4fiWnBL0/og/PTvOBDX4ucHk3a4Ko2aYuV2MBvmVs3M3U52rcoi/CQSSsq5CqHdKqBsdV3UJrLb+pY1OMrBUQ3KfuSOGWyStOx6dV3T+KDrnzI/sGmC/v3SVybbHc24vOJNsNHJFfp5jYGM5Dt1b48W6v8ENusfATsM3ys2DILotT4txp0QzCj3vH5d1sqYHbGy66Kyd+cs8VtHTbtYXLV1tdUw+vP8MaN/J0h1ioTkLEIDPFb7XkeGWgPaqkxbNClThG2EfNDZkJMJo7/rTYLYgZ6FyuAVwEAEbtHQe7InUIZnnG0zkAxYu4Ws3W8Ycx7D3G2vM2FwPotbNG3lpgOJZq4bAmHdQiV8TTt5YI4ulcg3P2/imax9V8FY3J7EMHWwgl4hoFdcbtXnX6ENp0Ln4SY++629TobluHhksWyovo9xvAYXx1g/fPNqyobqGpN0y7lT5ziqEa2XmyuHALonzaIwkWlFcKtZ7dcqgeh/QdJoScTb2CSDLGIYr0UBzAA3w5/a4Y7UvTRqBp99mcOA46UK8zmSc6eOPR3IkTfjb/K4wVgszP6MqKuyoDrRu0GcQGO2rkiHc5pAFabMeCoaP690vvcM9d95ArYP52cJ+Ah3kqPLpzr3uBrU4LqenGYYUFRrUunQrm0135LtJCzHTcsIg1PRE8I2VP+K47W4iafreTHnazT5GbwHar0mnds03rQDaefRqX1RmmfILLyG64ozoOAPdPoa/lSXxbcmdX9TZpDai3R+kOwz9/ePItmT4YpH46c35HNTyNvv6OX/GmROu5dh33jqIlFs82oqXfCu4RLSsFotM6ILGhA90ER3H2niep160JaD6LK0JAe1rcIXhFCU6nt3sXnObSI+9JO6Q0ORd4ZTXgVqpymegDSIvHdanRJR4QwW2UiOp2w/Ildb6GoW2eUg/GZFRnvPQBBpudATSEep/hHSBvKA17bXtQMXkZhv3+KHrs76FcxQWQ0duFe0TglF/HKWyWPP2UVb7Z3LEbedcHuCfd15D+MGkvZVfx/HbaXOrj6et46Q+M7Y6E3MHFjwB/enfqo1F1gPHHPloDxOsprNrfW7qAI++EYDnZl2TL/DNIHe9ZCJyz65u4yPCm3D0IZPQAmeHiAVcCHkIWeOet8NOhcowZr24xSCTUMFqpThYp8wu1sIEWSW6UuAXg1w49WDdFwpOqBmCdx1l2/2j7V7VjSihQQ4KJBYi8eS3SdPEukL0Ghy3AIYr9senE2WyhepDn7zyy4r7g5O7DEt3NvGqyoMkOE77hEx3u0SAdmkxby+ngcaRlmoN3AN35Ta48+Z3z0gwBp8n6TbAmAkWc+fds9noSBr78MiyzoDktOOJcdR9+CxnN34+oyKznKpBqKf0YqnmI8VonWV36V0e7ITG8n5DJEDBiI1B2Wij70Ce7sIowMTzYBvwnTr6Mz2wpAEqxDxQAMHvda7+kcCy694IDZMR2YT6riHAfAqXj3jyI/0TpoV0BPs4Q8aGNs2CTh2kh4tNveMWYMWUtTGrEHaIs0xLIfDNmO1nYwKNv8PFM3qEOcS5+DFoX3fp1/z7D7JTV241G/zvImfIPF9ydxYlMDrEGameI4DjXeObTTQlsUsmStGLdskG+8WQNL9B/VN/N0ITNJtm7UjUP/HvkxqML4JTEfL5/ESAgL+M1xTH/1q+BGeBu7uz0eZutdGVAlAeVDhjAEVtuZ2V9WVYFnis+8buD1SopT2hWkRcplAxazc0wkMXPIcwcy6iMbDoJZG4YZ4exdQueskVSnbEKix6UXo6Crn8hyhdgxRu8Fwjt9QpIis/rzauNOhtVhWERmK7SQGfCtkhmdfEsiy9FstyYetwUefgh2u/Fpq01QjIIjttIsBzqO1GlzEtbB06VR/2zl8o/vTv1M+2qTqg6Y3IGqav81FY3vmZNArt/Ec1Rs0T/5+zVyxlWu82ukuWtleRuNoKZtasy4qe5A0K7I5h2W8H++9FbWIy8yOJmkyaidOXe38s8G/X5JwZr+EnCJi99x71THOOU00wdK5BHCp/nvLUzQ8POXPnQt43B0+IxSCeUWPKszNeMFxyK5qI8lC1LTfnZB0rC2T/qOC1pxTC1F96El0nzNoYFMtUXFKHsJSWO/cTTFZu/RzhnVRgmFz3WgklK/t23JyCVWbsToJXZ956qat6GfMPgLirSzW/dirAftqbrEZl86Z0C1KCPZEHI++C/rbnDx0Jq86NQQJDcx18P3J8F00AeAnsZq2pCRzdJmkaYasBLDbFmlfJ8DF6ozr/dVasO6w2//eWMB9m19Scf9PDZrlFtF/N0D+sYDMUtPxZVpjDCmsdpemsrb4fNJ2ey9RZsSkil5bDeHRXWhwhY6UYi1JmF4Xyk3fvCy1fk3azRBXE55z27DbJGaojqXqPzIZ7Xn1XFzsWsBPNdjffOo+nF7h74JvGm0+8H/01/7td+mIHTYR3uNrLguArk4nDr99jFRft9qh2suLjjN51yxfScW3dK0tpC7qgQaXp9XtdGtvde+zOq4ZuG/ewmwTzMG3a5QSPYqAtY+yIvyRU+MxayKx28QQgbLRzLiJg2n55xCY+Jl4yJ2V3BbL9N1iyvq4BruqIS/Kypqt7pU30lOrWTHdTHqQKJ+qyffOKnDOUdxU+g2Vr6fIWkSXc6SOLdxJGlUENLTg/B6PeaZYXWOzHfy9dODdhwxlqFY7fcJ3RG6n2bhiPG4AwIEuEt1U1dFLAZbFo+xHt8LFuMf/s0beNINInYJTD52Qcwi05ma6BnLF3iJt4OUEXGDTeaJ11iVeyYydvTLc7mgfNqdtc975Dmy8/Vui5ZyoPxz8m3cBhN9VMXCt+w+8OhVHWutDm8PO/1fo36Z8CkvJg9BA3+uuDTbcX3cB20QhgYJEmoILYlqoA5WfyjU/y5XOU3Iz9mEIIQ1L4gAz+UA4/uVr5aqfshlEPBroAzRZ+f12AFwlQTam7sLqsVy0LqW9Ar2+0GdhcSvpXjFjz1xHxrSPeDxxnYAsgA+DWrYoydeBok+AakRT1ngJ+bWzeoIcQHsLJot5T2Vp2qibDydBupo/rhg1dG0653hTSD60vZwJLQgSuH6JG0vIROVOzb9r6xdsx0f+dOnc2vrgDDTqN0Z9dF3aHpq59m0RwVxA2L0rjCasULvDiA6YvyPGMdZzXuhqeReO0Nf5ZcZXkRpya2gs3zYjHzEMYbMqnE7EIe+mObl97UUJmmN5CJ2g9NGre466clWJLp2zoEvyxm8Z54GCgl9yIplLTQMk1vch1h3nteqBZmSQjpWfTZyJfs5qRxwSy/0X3ixw9DiXlQjD1Q168tiGBrE2xlAqxLn1UxzzQcLO5xiMG0r5NSRryaMsaKl4FyQpwZedMXFlibMkp0gghnmHaRYRJkAGk0HQUFj7xBI0tNIHW0NRUXhXlYNUqi703jIPIE4NHubk8ykGxxnlx0dxNHxCl40IUlRNTlFW3L5bhoxxo/jtKQ3lQfcSk6p99OY/CHl01xyaPXEAcXSrqDhQScuNB5id7/YANpi1CPuA/YWBoGtO3K0FW+q1DORueOd26oj7h/hcWUvZ5uQ6e9TilT3bNmTerdmIy1PGAp65SLAboXaffTU8sVP/RORDxx7334qw6QlD6aPZzlq71/xKb17XLMPzJPmQLH/st3pOYfzX35e+pD+X29Szdk9P2Veu/kG9LuQoAbpr8SaKG3b+6y+gMvXDuq1zQ4A4euqCGpYjsmye2y0kdDd3egcnyDTGsLfNFhLi33vxe1a8L1bOPb09HeDKFkGpmFqO7mP2WWOQeda68C/g493a3qRml7NmL97o+HO+AohExnuyXp6JWuMJiipqlU4pzaur3ayf0r/SF4jOb/kpR9J5Nd+RPVPGzx82UtAr34OqAfmmWlXvc8SPrmKYuLZ6q0iGdranTSclnQfq6PROb3PooeX3Ayh5y9cBR7nLCe6O6ySFi2SG8pCSkrK2ze+lrbrpc2TS9g1ZT8QAL+37w7aa6V2NRQYN4DPjcFj0xBBZx+vnCDGiqDLbRZ0LTHboFzXuXFrewHi0qaMA9vMCt7PJLRCOGWzjZxtdKqtGfs5jpOa0vaud6RzzBXSn2Xm87ZfBUXx9V4f8IvMf5/MndYj4d0KGgnUcgdyCk8A0E0exEJvuDDjx9PPHPjPUS4LPKbEt8vaxMIO694jbGISNJ40FBg1x0ZXubDmKXhbzVu4ejjRlWnJeQiNTUZZgZO29iOTDsnc1amqLYfPZ50jhDlvOLzM4ZsBj5sKSLOHvenEXQacIKmY1AbtVZzmUeHZLPGT7EOCklHJaTr80wrz2zvkqhrHCRi+Wpv3O13rl45QGZ4CUDUrywTvBZD1q+kB8Dhsd7GX9oeXfs7EsNSa3vGGcJNmqIlEI+A/pmxDbTd7RuxWOiz9wBucNh6X8o9MbaKr64YuOYDeKuafCb2NhSFclg1eBF/OOZXxTuXmkM5vhZtZQ0fT1Yg3fVT8EQylQE6YKLn3XZDO5X8K1971JDd5XWn1e8jY5gnUmSO8rMkGtXi80hYQ08gJgX/NF+vYx4nCp1d0YDkciAn3KPI8sxUQiFGpauO+iA+foy+C7A4zlUwBBr6sl++eXf5p4GhM7x1Z0aSTU0yj7OIlypJbzEV+5+swNenrhKeiBmVK/7KOHx9unTeTXz43lcZ1V7GdVpFwmPLlzDU72bRWY6vfr/l74rtQsECTKpRaWKL5xWPibdXHmeW0dULYPToyf5LdYH6FkYzWBADF5UJRs2cM5PDmWQm/McBqUqCmsBUpXixIBzeQD/XngTDGQs8kdTZWDCsCqMW2xn08yRkqQ3SPv36ZpAycUvXMCV0R61i3s4NFOagZnh75GVerEHF/JM+I3SKNnEU8/vK9nG2OMNSUcSmTqWDOiRehm4FmjZ0a7TtZx+5WPBEQ2L6LAvJ3BnJCDqdt//fpfjfpfj5liKv1CZa/AqOBnE+ELQcl3oOcN9Bonlw6I0D6IdAyyYHOiSc2B1p4GlQsEpxpNUEWO22HOlTvKbcpNSETCeZo9Ugc3hADujOCan5pp4WxlRWnQMZOo5jFPM9PcF8Ayc+V7aNm4BOFOlI9O86GLKLF/YcbJty6TjGJu+oeXxXeYDqHBKR1dHCunR2T0SrRXDd3fvSYx+py/kCoSO1evSa70hHrqv+HAajTohp1Lx7kQ+4MRs0Q2122hy2uUjE54Kb/eyLjgVy3xv2GjYBlZoAhdM1B5uAORBxKDUL3aVkGOOvZKTKnR8/0oJLxMSSZtqDrxs58qDrWu37FBk67DikpWDdkBZP/fE5d8O/aFG2uwmrN362nbJQKO+iLmR0y5YEwwW7Rxmg44IDGj4dFJGz0Fw7+qTTe3TPqikB3OK7u7MU7i25s4oMr2mAB6lnFy11PGrceP380U7zljh/shH3acshx4X8XVbxuscTch+K0SPDT6c4VDddLCCrhdOjpY10DvAVt5qybGYnE/N8n/PK62eLDnm2Lp2UIgD4JcedabRDv4BCo/V5K39h2eWtwNrToNXxF16lIcqORApnHqBC1exXCMVoZ3IMSD9tZ/+OOaaSYiEOimxPEqUnu3RglqHq2SMXEsSvJvgqD4loDtj23P8dMkoZNVsefbMPavhfrHpxyKc8J9KfUvUZrtrJSZK9/1RXVY630eOqKsYjVb4Hb0I338lqA8TLQUWSZ99r0R0zMgm6Oeur1cWrcgkaZBKL+uvjRz3ziOJHiNCqD3+rJ77FFpYqqiadpfwRmLHYeuO2+qi2M3Aqxx1C5S30v8J8uJoafbWhIqc+meUZH82CZbPLUoBrmVW9yea9wSnzQ1xJ1qjBS9lbEtOwbpnPaytjUyeCsKJ3uCvtWDfifsqxvnqGX9RFzfEvUgh0ouWd1zOVxyYwHnhWDF8SE3XRDFeC0/GhuMiq49enP7NbjYdz22HBLMt4kwjIAnYE+fpM5O9983Vf1DW/effmdQGWn930mkOrahF9TxOrnhQSZ7vAtlq5ffUnA7gY8xJx794EHV9q5aaIund4cv1LXMCmOKpWsXiJS4p/l1XEVBBd1PSL5PYq3LK2zHMzmPRo5mmSsbuP0Kyg9zmIRYHDd9UR2yEHxfq78aQTY7p/1qv9bEIFnrvKI0mTo2qz1cAN2iPD2PyY2M8Sr/ziO5MT4T0eRd/u//HJIfFc5ciiXD/55g/fEoFfjn22TOOrMvoS+pI4dzutJxMe0iEfudP4R8V6kVgvVmnDSHrHErnWkx95OOaWWIE8hPgqr+fmuzCcIZfuGxScxc+pSz2gO4pkEfKiGNLg8bdWKiSBb670K9HLvPan1uMS41CDqtUgyBuuLoNskGhUGA16a0SJQ+rjNKXCAOEMRST9JfoAyBnxGdbXfUzcZb3eYHyRjINR+sNN0qZI8jCSsMWXiNwJhx3//u9KVcz4N3hRqj1T0l0Qjluw1yxbqX99mqv/7WI5XVh7tIiLmyTD0PiLeB69Oov+LxFpHy2K+ArchPQWAU/4H8/T2+insxMKGiw2uyx5vP05fHVAwRAzCfUKvjqgMlZJoJescsCAi1R/QJBf+BcCQhRexGOC0a/yKwEF0hQXCYc6k191qE/nxtTk5QXu2a1fD+0JiIv5KjoiZuCbPzzBHr/5OrpMKoqseL148i2CPPnWCQKmEQCO37zooxjJoGjG3w/JtzzR0ohbr2mEOy2QLPgejfE7HyT8NXG86QNc7E3J6kUereMkm6mXJwI6+BJx9ykR5XDjsoQ9WKdaKD7BMu9FDk0K5a6ic/U/AAAA//8BAAD//+hpK0dEtgAA") assets["scripts/syncthing/core/directives/identiconDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5xVTVPbMBC951dsZwp2GkcOdHpJ6s4wDMxwgENz6IEyHVdWYk0VKSPLcSnkv3clJ8F2FL50wUj79r2V3m5SOS9FqslCZaVgYVDcS2pyLueEKs2Cfg9wkYxrRg1fYQDPmDScKhlEcBt8rLjMVIXfsxKBXEkIN3t9eHBgu1aphmI1v5lCAkFuzHIcx1VVkeozUXoen45GoxjPg0lvB9nlu9oShqtUlCyCgv9jzeQNAkyfKVouEEGoZqlhF4LZ/26moeOPILA8/ck+OlelyC65EN+x1DODqZ5K0qqKgCrRpbVLM1NqCR+2dZNlqgt2JU2tl9A81ecqY2fGpoGBzQOf6ioiOBn14QhOO4LWh/Rdc62Vfq9Cy2nZ4PjYqUiSBBY8ywQ7R+RLChaOGyMvlW5xP0/rSIeObwgnL9Y5e/sLWJj152te38bZ5/eopYYUDHmN5r9Lg1b/i7YO69eyp1PnuwEER13/HMDfW7x983fiK56ZHHNswW/B5ozPc+MD76Hxaki6XDKZnedcZKFFvOxHG+XZVdX+Jl6hz00b3/lTW8kdrVZnu0gq0qLAGhtDqSPcmS+p/zw+wpf26e5uEuzDEcQurh2yk4kx16nJCWVc1I0UY9vWlm4h+AzqzvdbFQ8wVT0ajJpiLXIe9olmS5FSFsa3P3/8uos5FuV9rBn2nvNUAqOJvW74WquGwUC3h+4ezLV84+JdT36D4ckEhsMDvdWsqjsin5ryOaSj92A8xfkJmzPv9ZQ+2uYEc1PL00vNtT546j/Z323vrHsd+9UDcjV/ktEI2Rw/dDAFWoaaMQQXQdT2OlVLNj5kOgQkQVtNGy64/DNuTFyXLgJWj9AI0m3fFb6r34RtBkkoWdX44XapSN0U3cnSa3+t7zDgPwAAAP//AQAA//9afsjulQgAAA==") diff --git a/internal/config/wrapper.go b/internal/config/wrapper.go index 586432ede..bb6e8e159 100644 --- a/internal/config/wrapper.go +++ b/internal/config/wrapper.go @@ -215,29 +215,6 @@ func (w *Wrapper) SetGUI(gui GUIConfiguration) { w.replaces <- w.cfg.Copy() } -// Sets the folder error state. Emits ConfigSaved to cause a GUI refresh. -func (w *Wrapper) SetFolderError(id string, err error) { - w.mut.Lock() - defer w.mut.Unlock() - - w.folderMap = nil - - for i := range w.cfg.Folders { - if w.cfg.Folders[i].ID == id { - errstr := "" - if err != nil { - errstr = err.Error() - } - if errstr != w.cfg.Folders[i].Invalid { - w.cfg.Folders[i].Invalid = errstr - events.Default.Log(events.ConfigSaved, w.cfg) - w.replaces <- w.cfg.Copy() - } - return - } - } -} - // Returns whether or not connection attempts from the given device should be // silently ignored. func (w *Wrapper) IgnoredDevice(id protocol.DeviceID) bool { diff --git a/internal/model/folderstate.go b/internal/model/folderstate.go index cb964afb1..089326fc0 100644 --- a/internal/model/folderstate.go +++ b/internal/model/folderstate.go @@ -1,17 +1,8 @@ // Copyright (C) 2015 The Syncthing Authors. // -// This program is free software: you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program. If not, see . +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. package model @@ -28,7 +19,7 @@ const ( FolderIdle folderState = iota FolderScanning FolderSyncing - FolderCleaning + FolderError ) func (s folderState) String() string { @@ -37,10 +28,10 @@ func (s folderState) String() string { return "idle" case FolderScanning: return "scanning" - case FolderCleaning: - return "cleaning" case FolderSyncing: return "syncing" + case FolderError: + return "error" default: return "unknown" } @@ -51,10 +42,16 @@ type stateTracker struct { mut sync.Mutex current folderState + err error changed time.Time } +// setState sets the new folder state, for states other than FolderError. func (s *stateTracker) setState(newState folderState) { + if newState == FolderError { + panic("must use setError") + } + s.mut.Lock() if newState != s.current { /* This should hold later... @@ -74,6 +71,7 @@ func (s *stateTracker) setState(newState folderState) { } s.current = newState + s.err = nil s.changed = time.Now() events.Default.Log(events.StateChanged, eventData) @@ -81,9 +79,35 @@ func (s *stateTracker) setState(newState folderState) { s.mut.Unlock() } -func (s *stateTracker) getState() (current folderState, changed time.Time) { +// getState returns the current state, the time when it last changed, and the +// current error or nil. +func (s *stateTracker) getState() (current folderState, changed time.Time, err error) { s.mut.Lock() - current, changed = s.current, s.changed + current, changed, err = s.current, s.changed, s.err s.mut.Unlock() return } + +// setError sets the folder state to FolderError with the specified error. +func (s *stateTracker) setError(err error) { + s.mut.Lock() + if s.current != FolderError || s.err.Error() != err.Error() { + eventData := map[string]interface{}{ + "folder": s.folder, + "to": FolderError.String(), + "from": s.current.String(), + "error": err.Error(), + } + + if !s.changed.IsZero() { + eventData["duration"] = time.Since(s.changed).Seconds() + } + + s.current = FolderError + s.err = err + s.changed = time.Now() + + events.Default.Log(events.StateChanged, eventData) + } + s.mut.Unlock() +} diff --git a/internal/model/model.go b/internal/model/model.go index 7965fca32..c1cd50162 100644 --- a/internal/model/model.go +++ b/internal/model/model.go @@ -48,8 +48,9 @@ type service interface { Jobs() ([]string, []string) // In progress, Queued BringToFront(string) - setState(folderState) - getState() (folderState, time.Time) + setState(state folderState) + setError(err error) + getState() (folderState, time.Time, error) } type Model struct { @@ -1083,13 +1084,13 @@ func (m *Model) AddFolder(cfg config.FolderConfiguration) { func (m *Model) ScanFolders() map[string]error { m.fmut.RLock() - var folders = make([]string, 0, len(m.folderCfgs)) + folders := make([]string, 0, len(m.folderCfgs)) for folder := range m.folderCfgs { folders = append(folders, folder) } m.fmut.RUnlock() - var errors = make(map[string]error, len(m.folderCfgs)) + errors := make(map[string]error, len(m.folderCfgs)) var errorsMut sync.Mutex var wg sync.WaitGroup @@ -1102,11 +1103,15 @@ func (m *Model) ScanFolders() map[string]error { errorsMut.Lock() errors[folder] = err errorsMut.Unlock() + // Potentially sets the error twice, once in the scanner just // by doing a check, and once here, if the error returned is // the same one as returned by CheckFolderHealth, though - // duplicate set is handled by SetFolderError - m.cfg.SetFolderError(folder, err) + // duplicate set is handled by setError. + m.fmut.RLock() + srv := m.folderRunners[folder] + m.fmut.RUnlock() + srv.setError(err) } wg.Done() }() @@ -1182,13 +1187,13 @@ nextSub: } runner.setState(FolderScanning) - defer runner.setState(FolderIdle) - fchan, err := w.Walk() + fchan, err := w.Walk() if err != nil { - m.cfg.SetFolderError(folder, err) + runner.setError(err) return err } + batchSize := 100 batch := make([]protocol.FileInfo, 0, batchSize) for f := range fchan { @@ -1298,6 +1303,7 @@ nextSub: fs.Update(protocol.LocalDeviceID, batch) } + runner.setState(FolderIdle) return nil } @@ -1340,15 +1346,18 @@ func (m *Model) clusterConfig(device protocol.DeviceID) protocol.ClusterConfigMe return cm } -func (m *Model) State(folder string) (string, time.Time) { +func (m *Model) State(folder string) (string, time.Time, error) { m.fmut.RLock() runner, ok := m.folderRunners[folder] m.fmut.RUnlock() if !ok { - return "", time.Time{} + // The returned error should be an actual folder error, so returning + // errors.New("does not exist") or similar here would be + // inappropriate. + return "", time.Time{}, nil } - state, changed := runner.getState() - return state.String(), changed + state, changed, err := runner.getState() + return state.String(), changed, err } func (m *Model) Override(folder string) { @@ -1528,7 +1537,7 @@ func (m *Model) BringToFront(folder, file string) { func (m *Model) CheckFolderHealth(id string) error { folder, ok := m.cfg.Folders()[id] if !ok { - return errors.New("Folder does not exist") + return errors.New("folder does not exist") } fi, err := os.Stat(folder.Path()) @@ -1538,9 +1547,9 @@ func (m *Model) CheckFolderHealth(id string) error { // that all files have been deleted which might not be the case, // so mark it as invalid instead. if err != nil || !fi.IsDir() { - err = errors.New("Folder path missing") + err = errors.New("folder path missing") } else if !folder.HasMarker() { - err = errors.New("Folder marker missing") + err = errors.New("folder marker missing") } } else if os.IsNotExist(err) { // If we don't have any files in the index, and the directory @@ -1555,35 +1564,21 @@ func (m *Model) CheckFolderHealth(id string) error { err = folder.CreateMarker() } - if err == nil { - if folder.Invalid != "" { - l.Infof("Starting folder %q after error %q", folder.ID, folder.Invalid) - m.cfg.SetFolderError(id, nil) + m.fmut.RLock() + runner := m.folderRunners[folder.ID] + m.fmut.RUnlock() + _, _, oldErr := runner.getState() + + if err != nil { + if oldErr != nil && oldErr.Error() != err.Error() { + l.Infof("Folder %q error changed: %q -> %q", folder.ID, oldErr, err) + } else if oldErr == nil { + l.Warnf("Stopping folder %q - %v", folder.ID, err) } - - if folder, ok := m.cfg.Folders()[id]; !ok || folder.Invalid != "" { - panic("Unable to unset folder \"" + id + "\" error.") - } - - return nil - } - - if folder.Invalid == err.Error() { - return err - } - - // folder is a copy of the original struct, hence Invalid value is - // preserved after the set. - m.cfg.SetFolderError(id, err) - - if folder.Invalid == "" { - l.Warnf("Stopping folder %q - %v", folder.ID, err) - } else { - l.Infof("Folder %q error changed: %q -> %q", folder.ID, folder.Invalid, err) - } - - if folder, ok := m.cfg.Folders()[id]; !ok || folder.Invalid != err.Error() { - panic("Unable to set folder \"" + id + "\" error.") + runner.setError(err) + } else if oldErr != nil { + l.Infof("Folder %q error is cleared, restarting", folder.ID) + runner.setState(FolderIdle) } return err diff --git a/internal/model/model_test.go b/internal/model/model_test.go index b41c02f29..7a1071559 100644 --- a/internal/model/model_test.go +++ b/internal/model/model_test.go @@ -621,21 +621,25 @@ func TestROScanRecovery(t *testing.T) { if time.Now().After(timeout) { return fmt.Errorf("Timed out waiting for status: %s, current status: %s", status, m.cfg.Folders()["default"].Invalid) } - if m.cfg.Folders()["default"].Invalid == status { + _, _, err := m.State("default") + if err == nil && status == "" { + return nil + } + if err != nil && err.Error() == status { return nil } time.Sleep(10 * time.Millisecond) } } - if err := waitFor("Folder path missing"); err != nil { + if err := waitFor("folder path missing"); err != nil { t.Error(err) return } os.Mkdir(fcfg.RawPath, 0700) - if err := waitFor("Folder marker missing"); err != nil { + if err := waitFor("folder marker missing"); err != nil { t.Error(err) return } @@ -654,14 +658,14 @@ func TestROScanRecovery(t *testing.T) { os.Remove(filepath.Join(fcfg.RawPath, ".stfolder")) - if err := waitFor("Folder marker missing"); err != nil { + if err := waitFor("folder marker missing"); err != nil { t.Error(err) return } os.Remove(fcfg.RawPath) - if err := waitFor("Folder path missing"); err != nil { + if err := waitFor("folder path missing"); err != nil { t.Error(err) return } @@ -701,21 +705,25 @@ func TestRWScanRecovery(t *testing.T) { if time.Now().After(timeout) { return fmt.Errorf("Timed out waiting for status: %s, current status: %s", status, m.cfg.Folders()["default"].Invalid) } - if m.cfg.Folders()["default"].Invalid == status { + _, _, err := m.State("default") + if err == nil && status == "" { + return nil + } + if err != nil && err.Error() == status { return nil } time.Sleep(10 * time.Millisecond) } } - if err := waitFor("Folder path missing"); err != nil { + if err := waitFor("folder path missing"); err != nil { t.Error(err) return } os.Mkdir(fcfg.RawPath, 0700) - if err := waitFor("Folder marker missing"); err != nil { + if err := waitFor("folder marker missing"); err != nil { t.Error(err) return } @@ -734,14 +742,14 @@ func TestRWScanRecovery(t *testing.T) { os.Remove(filepath.Join(fcfg.RawPath, ".stfolder")) - if err := waitFor("Folder marker missing"); err != nil { + if err := waitFor("folder marker missing"); err != nil { t.Error(err) return } os.Remove(fcfg.RawPath) - if err := waitFor("Folder path missing"); err != nil { + if err := waitFor("folder path missing"); err != nil { t.Error(err) return } diff --git a/internal/model/rofolder.go b/internal/model/rofolder.go index ac865ec57..8d1ea7770 100644 --- a/internal/model/rofolder.go +++ b/internal/model/rofolder.go @@ -67,8 +67,8 @@ func (s *roFolder) Serve() { // Potentially sets the error twice, once in the scanner just // by doing a check, and once here, if the error returned is // the same one as returned by CheckFolderHealth, though - // duplicate set is handled by SetFolderError - s.model.cfg.SetFolderError(s.folder, err) + // duplicate set is handled by setError. + s.setError(err) reschedule() continue } diff --git a/internal/model/rwfolder.go b/internal/model/rwfolder.go index 25eafcf57..4c57360a5 100644 --- a/internal/model/rwfolder.go +++ b/internal/model/rwfolder.go @@ -245,8 +245,8 @@ func (p *rwFolder) Serve() { // Potentially sets the error twice, once in the scanner just // by doing a check, and once here, if the error returned is // the same one as returned by CheckFolderHealth, though - // duplicate set is handled by SetFolderError - p.model.cfg.SetFolderError(p.folder, err) + // duplicate set is handled by setError. + p.setError(err) rescheduleScan() continue }