From c9cf01e0b6f80d4579a7a50c64339df91f0b1e4e Mon Sep 17 00:00:00 2001 From: Antoine Lamielle Date: Tue, 9 Aug 2016 19:58:44 +0000 Subject: [PATCH] gui: weighting % of devices according to folder size (fixes #1300) The completion of remote devices was based only on the average of the percentages of all folders, which is irrelevant in case of two folders with very different sizes. GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3481 LGTM: calmh, AudriusButkevicius --- .../syncthing/core/syncthingController.js | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/gui/default/syncthing/core/syncthingController.js b/gui/default/syncthing/core/syncthingController.js index dda8fbfd..26900c61 100755 --- a/gui/default/syncthing/core/syncthingController.js +++ b/gui/default/syncthing/core/syncthingController.js @@ -312,15 +312,25 @@ angular.module('syncthing.core') $scope.completion[data.device][data.folder] = data.completion; var tot = 0, - cnt = 0; + cnt = 0, + isComplete = true; for (var cmp in $scope.completion[data.device]) { if (cmp === "_total") { continue; } - tot += $scope.completion[data.device][cmp]; - cnt += 1; + tot += $scope.completion[data.device][cmp] * $scope.model[cmp].globalBytes; + cnt += $scope.model[cmp].globalBytes; + if ($scope.completion[data.device][cmp] != 100) { + isComplete = false; + } + } + //To be sure that we won't get any rounding errors resulting in non-100% status when it should be + if (isComplete) { + $scope.completion[data.device]._total = 100; + } + else { + $scope.completion[data.device]._total = tot / cnt; } - $scope.completion[data.device]._total = tot / cnt; }); $scope.$on(Events.FOLDER_ERRORS, function (event, arg) { @@ -460,15 +470,25 @@ angular.module('syncthing.core') $scope.completion[device][folder] = data.completion; var tot = 0, - cnt = 0; + cnt = 0, + isComplete = true; for (var cmp in $scope.completion[device]) { if (cmp === "_total") { continue; } - tot += $scope.completion[device][cmp]; - cnt += 1; + tot += $scope.completion[device][cmp] * $scope.model[cmp].globalBytes; + cnt += $scope.model[cmp].globalBytes; + if ($scope.completion[device][cmp] != 100) { + isComplete = false; + } + } + //To be sure that we won't get any rounding errors resulting in non-100% status when it should be + if (isComplete) { + $scope.completion[device]._total = 100; + } + else { + $scope.completion[device]._total = tot / cnt; } - $scope.completion[device]._total = tot / cnt; console.log("refreshCompletion", device, folder, $scope.completion[device]); }).error($scope.emitHTTPError);