diff --git a/modules/openstack_project/files/gerrit/hideci.js b/modules/openstack_project/files/gerrit/hideci.js index 4634ca9d5e..233896f009 100644 --- a/modules/openstack_project/files/gerrit/hideci.js +++ b/modules/openstack_project/files/gerrit/hideci.js @@ -28,7 +28,7 @@ var pipelineNameRegex = /Build \w+ \((\w+) pipeline\)/; // The url to full status information on running jobs var zuulStatusURL = 'http://status.openstack.org/zuul'; // The json URL to check for running jobs -var zuulStatusJSON = 'https://zuul.openstack.org/status.json'; +var zuulStatusJSON = 'https://zuul.openstack.org/status/change/'; // This is a variable to determine if we're in debugging mode, which // lets you globally set it to see what's going on in the flow. @@ -449,18 +449,6 @@ var ci_zuul_process_changes = function(data, change_psnum) { } }; -var ci_zuul_inner_loop = function(change_psnum) { - var current = ci_current_change(); - if (current && change_psnum.indexOf(current) != 0) { - // window url is dead - return; - } - $.getJSON(zuulStatusJSON, function(data) { - ci_zuul_process_changes(data, change_psnum); - }); - setTimeout(function() {ci_zuul_inner_loop(change_psnum);}, 10000); -}; - var ci_zuul_for_change = function(comments) { if (!comments) { comments = ci_parse_comments(); @@ -468,9 +456,57 @@ var ci_zuul_for_change = function(comments) { var change = ci_current_change(); var psnum = ci_latest_patchset(comments); var change_psnum = change + "," + psnum; - ci_zuul_inner_loop(change_psnum); + + // do the loop recursively in ajax + (function poll() { + $.ajax({ + url: zuulStatusJSON + change_psnum, + type: "GET", + success: function(data) { + dbg("Found zuul data for " + change_psnum, data); + ci_zuul_process_changes(data, change_psnum); + }, + dataType: "json", + complete: setTimeout(function() { + // once we are done with this cycle in the loop we + // schedule ourselves again in the future with + // setTimeout. However, by the time the function + // actually gets called, other things might have + // happened, and we may want to just dump the data + // instead. + // + // the UI might have gone hidden (user was bored, + // switched to another tab / window). + // + // the user may have navigated to another review url, + // so the data returned is not relevant. + // + // both cases are recoverable when the user navigates + // around, because a new "thread" gets started on + // ci_page_load. + // + // BUG(sdague): there is the possibility that the user + // navigates away from a page and back fast enough + // that the first "thread" is not dead, and a second + // one is started. greghaynes totally said he'd come + // up with a way to fix that. + if (window.zuul_enable_status_updates == false) { + return; + } + var current = ci_current_change(); + if (current && change_psnum.indexOf(current) != 0) { + // window url is dead, so don't schedule any more future + // updates for this url. + return; + } + poll(); + }, 15000), + timeout: 5000 + }); + })(); }; + window.onload = function() { var input = document.createElement("input"); input.id = "toggleci"; @@ -501,4 +537,14 @@ window.onload = function() { subtree: true, attributes: true }); + + $(document).on({ + 'show.visibility': function() { + window.zuul_enable_status_updates = true; + ci_page_loaded(); + }, + 'hide.visibility': function() { + window.zuul_enable_status_updates = false; + } + }); };