xref: /OK3568_Linux_fs/yocto/bitbake/lib/toaster/toastergui/static/js/mrbsection.js (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun
2*4882a593Smuzhiyunfunction mrbSectionInit(ctx){
3*4882a593Smuzhiyun  $('#latest-builds').on('click', '.cancel-build-btn', function(e){
4*4882a593Smuzhiyun    e.stopImmediatePropagation();
5*4882a593Smuzhiyun    e.preventDefault();
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun    var url = $(this).data('request-url');
8*4882a593Smuzhiyun    var buildReqIds = $(this).data('buildrequest-id');
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun    libtoaster.cancelABuild(url, buildReqIds, function () {
11*4882a593Smuzhiyun      window.location.reload();
12*4882a593Smuzhiyun    }, null);
13*4882a593Smuzhiyun  });
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun  $('#latest-builds').on('click', '.rebuild-btn', function(e){
16*4882a593Smuzhiyun    e.stopImmediatePropagation();
17*4882a593Smuzhiyun    e.preventDefault();
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun    var url = $(this).data('request-url');
20*4882a593Smuzhiyun    var target = $(this).data('target');
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun    libtoaster.startABuild(url, target, function(){
23*4882a593Smuzhiyun      window.location.reload();
24*4882a593Smuzhiyun    }, null);
25*4882a593Smuzhiyun  });
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun  // cached version of buildData, so we can determine whether a build has
28*4882a593Smuzhiyun  // changed since it was last fetched, and update the DOM appropriately
29*4882a593Smuzhiyun  var buildData = {};
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun  // returns the cached version of this build, or {} is there isn't a cached one
32*4882a593Smuzhiyun  function getCached(build) {
33*4882a593Smuzhiyun    return buildData[build.id] || {};
34*4882a593Smuzhiyun  }
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun  // returns true if a build's state changed to "Succeeded", "Failed"
37*4882a593Smuzhiyun  // or "Cancelled" from some other value
38*4882a593Smuzhiyun  function buildFinished(build) {
39*4882a593Smuzhiyun    var cached = getCached(build);
40*4882a593Smuzhiyun    return cached.state &&
41*4882a593Smuzhiyun      cached.state !== build.state &&
42*4882a593Smuzhiyun      (build.state == 'Succeeded' || build.state == 'Failed' ||
43*4882a593Smuzhiyun       build.state == 'Cancelled');
44*4882a593Smuzhiyun  }
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun  // returns true if the state changed
47*4882a593Smuzhiyun  function stateChanged(build) {
48*4882a593Smuzhiyun    var cached = getCached(build);
49*4882a593Smuzhiyun    return (cached.state !== build.state);
50*4882a593Smuzhiyun  }
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun  // returns true if the tasks_complete_percentage changed
53*4882a593Smuzhiyun  function tasksProgressChanged(build) {
54*4882a593Smuzhiyun    var cached = getCached(build);
55*4882a593Smuzhiyun    return (cached.tasks_complete_percentage !== build.tasks_complete_percentage);
56*4882a593Smuzhiyun  }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun  // returns true if the number of recipes parsed/to parse changed
59*4882a593Smuzhiyun  function recipeProgressChanged(build) {
60*4882a593Smuzhiyun    var cached = getCached(build);
61*4882a593Smuzhiyun    return (cached.recipes_parsed_percentage !== build.recipes_parsed_percentage);
62*4882a593Smuzhiyun  }
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun  // returns true if the number of repos cloned/to clone changed
65*4882a593Smuzhiyun  function cloneProgressChanged(build) {
66*4882a593Smuzhiyun    var cached = getCached(build);
67*4882a593Smuzhiyun    return (cached.repos_cloned_percentage !== build.repos_cloned_percentage);
68*4882a593Smuzhiyun  }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun  function refreshMostRecentBuilds(){
71*4882a593Smuzhiyun    libtoaster.getMostRecentBuilds(
72*4882a593Smuzhiyun      libtoaster.ctx.mostRecentBuildsUrl,
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun      // success callback
75*4882a593Smuzhiyun      function (data) {
76*4882a593Smuzhiyun        var build;
77*4882a593Smuzhiyun        var tmpl;
78*4882a593Smuzhiyun        var container;
79*4882a593Smuzhiyun        var selector;
80*4882a593Smuzhiyun        var colourClass;
81*4882a593Smuzhiyun        var elements;
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun        for (var i = 0; i < data.length; i++) {
84*4882a593Smuzhiyun          build = data[i];
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun          if (buildFinished(build)) {
87*4882a593Smuzhiyun            // a build finished: reload the whole page so that the build
88*4882a593Smuzhiyun            // shows up in the builds table
89*4882a593Smuzhiyun            window.location.reload(true);
90*4882a593Smuzhiyun          }
91*4882a593Smuzhiyun          else if (stateChanged(build)) {
92*4882a593Smuzhiyun            // update the whole template
93*4882a593Smuzhiyun            build.warnings_pluralise = (build.warnings !== 1 ? 's' : '');
94*4882a593Smuzhiyun            build.errors_pluralise = (build.errors !== 1 ? 's' : '');
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun            tmpl = $.templates("#build-template");
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun            html = $(tmpl.render(build));
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun            selector = '[data-latest-build-result="' + build.id + '"] ' +
101*4882a593Smuzhiyun              '[data-role="build-status-container"]';
102*4882a593Smuzhiyun            container = $(selector);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun            // initialize bootstrap tooltips in the new HTML
105*4882a593Smuzhiyun            html.find('span.glyphicon-question-sign').tooltip();
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun            container.html(html);
108*4882a593Smuzhiyun          }
109*4882a593Smuzhiyun          else if (cloneProgressChanged(build)) {
110*4882a593Smuzhiyun            // update the clone progress text
111*4882a593Smuzhiyun            selector = '#repos-cloned-percentage-' + build.id;
112*4882a593Smuzhiyun            $(selector).html(build.repos_cloned_percentage);
113*4882a593Smuzhiyun            selector = '#repos-cloned-progressitem-' + build.id;
114*4882a593Smuzhiyun            $(selector).html('('+build.progress_item+')');
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun            // update the recipe progress bar
117*4882a593Smuzhiyun            selector = '#repos-cloned-percentage-bar-' + build.id;
118*4882a593Smuzhiyun            $(selector).width(build.repos_cloned_percentage + '%');
119*4882a593Smuzhiyun          }
120*4882a593Smuzhiyun          else if (tasksProgressChanged(build)) {
121*4882a593Smuzhiyun            // update the task progress text
122*4882a593Smuzhiyun            selector = '#build-pc-done-' + build.id;
123*4882a593Smuzhiyun            $(selector).html(build.tasks_complete_percentage);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun            // update the task progress bar
126*4882a593Smuzhiyun            selector = '#build-pc-done-bar-' + build.id;
127*4882a593Smuzhiyun            $(selector).width(build.tasks_complete_percentage + '%');
128*4882a593Smuzhiyun          }
129*4882a593Smuzhiyun          else if (recipeProgressChanged(build)) {
130*4882a593Smuzhiyun            // update the recipe progress text
131*4882a593Smuzhiyun            selector = '#recipes-parsed-percentage-' + build.id;
132*4882a593Smuzhiyun            $(selector).html(build.recipes_parsed_percentage);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun            // update the recipe progress bar
135*4882a593Smuzhiyun            selector = '#recipes-parsed-percentage-bar-' + build.id;
136*4882a593Smuzhiyun            $(selector).width(build.recipes_parsed_percentage + '%');
137*4882a593Smuzhiyun          }
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun          buildData[build.id] = build;
140*4882a593Smuzhiyun        }
141*4882a593Smuzhiyun      },
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun      // fail callback
144*4882a593Smuzhiyun      function (data) {
145*4882a593Smuzhiyun        console.error(data);
146*4882a593Smuzhiyun      }
147*4882a593Smuzhiyun    );
148*4882a593Smuzhiyun  }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun  window.setInterval(refreshMostRecentBuilds, 1500);
151*4882a593Smuzhiyun  refreshMostRecentBuilds();
152*4882a593Smuzhiyun}
153