diff --git a/userscript/origin.user.js b/userscript/origin.user.js index 745032ce..37f9199c 100644 --- a/userscript/origin.user.js +++ b/userscript/origin.user.js @@ -1,10 +1,11 @@ // ==UserScript== // @name OSRT Origin // @namespace openSUSE/openSUSE-release-tools -// @version 0.1.0 +// @version 0.2.0 // @description Supplement OBS interface with origin information. // @author Jimmy Berry // @match */package/show/* +// @match */request/show/* // @require https://code.jquery.com/jquery-3.3.1.min.js // @grant none // ==/UserScript== @@ -12,27 +13,123 @@ (function() { var pathParts = window.location.pathname.split('/'); - var project = pathParts[pathParts.length - 2]; - var package = pathParts[pathParts.length - 1]; - var domain_parent = window.location.hostname.split('.').splice(1).join('.'); - var subdomain = domain_parent.endsWith('suse.de') ? 'tortuga' : 'operator'; - var url = 'https://' + subdomain + '.' + domain_parent + '/origin/package/' + project + '/' + package; + if (pathParts[1] == 'package') { + var project = pathParts[pathParts.length - 2]; + var package = pathParts[pathParts.length - 1]; + origin_load(document.querySelector('ul.clean_list, ul.list-unstyled'), project, package); + } else if (pathParts[1] == 'request') { + request_actions_handle(); + } +})(); - $('ul.clean_list, ul.list-unstyled').append('
  • loading origin...
  • '); +function request_actions_handle() { + // Select all action tabs and store to avoid modification exceptions. + var action_elements = document.evaluate( + '//div[@class="card mb-3"][2]/div/div[@class="tab-content"]/div', document); + var actions = []; + var action; + while (action = action_elements.iterateNext()) { + actions.push(action); + } + + for (var i = 0; i < actions.length; i++) { + action = actions[i]; + + // Select the side column containing build results. + var column = document.evaluate( + '//div[@class="row"][2]/div[@class="col-md-4"]', + action, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + + // Select the text represtation of action. All other sources are + // inconsistent and do not always have the right values depending on + // request type or state. + var summary = document.evaluate( + 'div[1]/div[1]', + action, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + var parts = $(summary).text().trim().split(' '); + + // Maintenance incidents are so special. + var release_project = document.evaluate( + 'i[1]', + action, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + var project, package; + if (release_project) { + parts = parts.splice(4, 3); + project = $(release_project).text().trim().split(' ').splice(-1)[0]; + } else { + parts = parts.splice(-3); + project = parts[0]; + } + package = parts[2]; + + var card = document.createElement('div'); + card.classList.add('card'); + + var list = document.createElement('ul'); + list.classList.add('list-unstyled'); + card.appendChild(list); + + column.insertBefore(card, column.childNodes[0]); + + origin_load(list, project, package); + } +} + +function origin_load(element, project, package) { + // Add placeholder to indicated loading. + var item = document.createElement('li'); + item.innerHTML = ' Origin: loading...'; + element.appendChild(item); + + var url = operator_url() + '/origin/package/' + project + '/' + package; $.get({url: url, crossDomain: true, xhrFields: {withCredentials: true}, success: function(origin) { if (origin.endsWith('failed')) { if (origin.startsWith('OSRT:OriginConfig attribute missing')) { - $('#osrt-origin').html(''); + item.innerHTML = ''; } else { - $('#osrt-origin').html(' failed to get origin info'); + item.innerHTML = ' Origin: failed to load'; } } else { - project = origin.trim(); - if (project.endsWith('~')) { - project = project.slice(0, -1); + var origin_project = origin.trim(); + if (origin_project.endsWith('~')) { + origin_project = origin_project.slice(0, -1); } - $('#osrt-origin').html(' ' + origin + ''); + item.innerHTML = ' Origin: '; + if (origin_project != 'None') { + item.innerHTML += '' + origin + '' + } else { + item.innerHTML += origin; + } + + url = web_interface_url() + '/web/origin-manager/#' + project + '/' + package; + if (origin_project != 'None') { + url += '/' + origin_project; + } + item = document.createElement('li'); + item.innerHTML = ' ' + + 'Origin Manager Interface'; + element.appendChild(item); } }}); -})(); +} + +function operator_url() { + var domain_parent = window.location.hostname.split('.').splice(-2).join('.'); + var subdomain = domain_parent.endsWith('suse.de') ? 'tortuga' : 'operator'; + return 'https://' + subdomain + '.' + domain_parent; +} + +function web_interface_url() { + var domain_parent = window.location.hostname.split('.').splice(-2).join('.'); + var subdomain, path; + if (domain_parent.endsWith('suse.de')) { + subdomain = 'jberry.io'; + path = '/osrt-web'; + } else { + subdomain = 'osrt'; + path = ''; + } + return 'http://' + subdomain + '.' + domain_parent + path; +}