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  });