github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/public/static/js/build.js (about) 1 mciModule.controller('BuildVariantHistoryController', function($scope, $http, $filter, $timeout, $window) { 2 $scope.userTz = $window.userTz; 3 $scope.builds = []; 4 $scope.buildId = ""; 5 $scope.buildResults = {}; 6 7 $scope.setBuildId = function(buildId) { 8 $scope.buildId = buildId; 9 if (!$scope.build.PatchInfo) { 10 $scope.loadHistory(); 11 } 12 }; 13 14 $scope.checkTaskHidden = function(task) { 15 return !task.activated; 16 }; 17 18 var computeBuildResults = function(buildData) { 19 var build = buildData.Build; 20 $scope.buildResults[build._id] = []; 21 22 for (var j = 0; j < build.tasks.length; ++j) { 23 if (!build.tasks[j].activated) { 24 build.tasks[j].status = 'unscheduled'; 25 } 26 27 $scope.buildResults[build._id].push({ 28 "class": $filter('statusFilter')(build.tasks[j]), 29 "tooltip": build.tasks[j].display_name + " - " + $filter('statusLabel')(build.tasks[j]), 30 "link": '/task/' + build.tasks[j].id 31 }); 32 } 33 }; 34 35 36 $scope.setBuilds = function(data) { 37 var builds = data.builds; 38 $scope.buildResults = {}; 39 if (data.lastSuccess) { 40 $scope.lastSuccess = data.lastSuccess; 41 $scope.showLastSuccess = true; 42 computeBuildResults($scope.lastSuccess); 43 } else { 44 $scope.lastSuccess = null; 45 $scope.showLastSuccess = false; 46 } 47 48 $scope.builds = builds; 49 for (var i = 0; i < builds.length; ++i) { 50 if ($scope.showLastSuccess && builds[i].Build._id == $scope.lastSuccess.Build._id) { 51 $scope.showLastSuccess = false; 52 } 53 computeBuildResults(builds[i]); 54 } 55 $scope.lastUpdate = new Date(); 56 } 57 58 $scope.loadHistory = function() { 59 $http.get('/json/build_history/' + $scope.buildId) 60 .success(function(data) { 61 $scope.setBuilds(data); 62 }) 63 .error(function(data) { 64 console.log("Error getting build history: " + data); 65 }); 66 }; 67 }); 68 69 70 mciModule.controller('BuildViewController', function($scope, $http, $timeout, $rootScope, mciTime, $window) { 71 $scope.build = {}; 72 $scope.computed = {}; 73 $scope.loading = false; 74 $scope.lastUpdate = null; 75 76 var dateSorter = function(a, b){ return (+a) - (+b) } 77 78 79 $scope.setBuild = function(build) { 80 $scope.build = build; 81 $scope.commit = { 82 message: $scope.build.Version.message, 83 author: $scope.build.Version.author, 84 author_email: $scope.build.Version.author_email, 85 push_time: $scope.build.Version.create_time, 86 gitspec: $scope.build.Build.gitspec, 87 repo_owner: $scope.build.repo_owner, 88 repo_name: $scope.build.repo_name 89 }; 90 91 $scope.computed = {}; 92 93 build.Build.activated_time = new Date(build.Build.activated_time); 94 95 build.Build.start_time = mciTime.fromMilliseconds(build.Build.start_time); 96 build.Build.finish_time = mciTime.fromMilliseconds(build.Build.finish_time); 97 build.CurrentTime = mciTime.fromNanoseconds(build.CurrentTime); 98 99 build.Build.time_taken = mciTime.finishConditional(build.Build.start_time, build.Build.finish_time, build.CurrentTime) * 1000 * 1000; 100 101 if ($scope.build.PatchInfo) { 102 $scope.showBaseCommitLink = $scope.build.PatchInfo.BaseBuildId !== ''; 103 104 if ($scope.build.PatchInfo.StatusDiffs) { 105 // setup diff data to use statusFilter 106 for (var i = 0; i < $scope.build.PatchInfo.StatusDiffs.length; ++i) { 107 108 var original = $scope.build.PatchInfo.StatusDiffs[i].diff.original; 109 110 // in case the base task has not yet run 111 if (_.size(original) !== 0) { 112 $scope.build.PatchInfo.StatusDiffs[i].diff.original = { 113 'task_end_details': original, 114 'status': original.status, 115 }; 116 } 117 118 var patch = $scope.build.PatchInfo.StatusDiffs[i].diff.patch; 119 120 // in case the patch task has not yet run 121 if (_.size(patch) !== 0) { 122 $scope.build.PatchInfo.StatusDiffs[i].diff.patch = { 123 'task_end_details': patch, 124 'status': patch.status, 125 }; 126 } 127 } 128 } 129 } 130 131 // Initialize to 1 so we avoid divide-by-zero errors 132 $scope.computed.maxTaskTime = 1; 133 for (var i = 0; i < build.Tasks.length; ++i) { 134 if (build.Tasks[i].Task.status === 'started' || build.Tasks[i].Task.status === 'dispatched') { 135 var d = new Date(build.Tasks[i].Task.start_time).getTime(); 136 if (build.CurrentTime && d) { 137 build.Tasks[i].Task.time_taken = (build.CurrentTime - d) * 1000 * 1000; 138 } 139 } 140 if (build.Tasks[i].Task.time_taken > $scope.computed.maxTaskTime) { 141 $scope.computed.maxTaskTime = build.Tasks[i].Task.time_taken; 142 } 143 } 144 145 $scope.lastUpdate = mciTime.now(); 146 147 //calculate makespan and total processing time for the build 148 149 // filter function to remove zero times from a list of times 150 var nonZeroTimeFilter = function(y){return (+y) != (+new Date(0))} 151 152 // extract the start an end times for the tasks in the build, discarding the zero times 153 var taskStartTimes = _.filter(build.Tasks.map(function(x){return new Date(x.Task.start_time)}).sort(dateSorter), nonZeroTimeFilter) 154 var taskEndTimes = _.filter(build.Tasks.map(function(x){return new Date(x.Task.finish_time)}).sort(dateSorter), nonZeroTimeFilter) 155 156 // calculate the makespan by taking the difference of the first start time and last end time 157 if(taskStartTimes.length == 0 || taskEndTimes.length == 0) { 158 $scope.makeSpanMS = 0 159 }else { 160 $scope.makeSpanMS = taskEndTimes[taskEndTimes.length-1] - taskStartTimes[0] 161 } 162 163 var finishedOnly = _.filter(build.Tasks, 164 function(x){ 165 return new Date(x.Task.start_time) > new Date(0) && new Date(x.Task.finish_time) > new Date(0) 166 } 167 ) 168 $scope.totalTimeMS = _.reduce( 169 _.map(finishedOnly, 170 function(x){return new Date(x.Task.finish_time) - new Date(x.Task.start_time)}), 171 function(sum, el){return sum+el}, 172 0) 173 }; 174 175 $rootScope.$on("build_updated", function(e, newBuild){ 176 newBuild.PatchInfo = $scope.build.PatchInfo 177 $scope.setBuild(newBuild); 178 }); 179 180 181 $scope.setBuild($window.build); 182 183 $scope.plugins = $window.plugins 184 185 });