您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
It creates a list of only the bugs related to Firefox for desktop in Mozilla Mercurial pushlogs
当前为
// ==UserScript== // @name Mozilla Mercurial - Filters changelogs(pushlogs) // @namespace darkred // @description It creates a list of only the bugs related to Firefox for desktop in Mozilla Mercurial pushlogs // @include https://hg.mozilla.org/integration/mozilla-inbound/pushloghtml?startdate=*&enddate=* // @version 1 // @grant GM_xmlhttpRequest // @require http://code.jquery.com/jquery-2.1.4.min.js // @require http://code.jquery.com/ui/1.11.4/jquery-ui.min.js // ==/UserScript== // CSS rules used for jQuery 'display' containing the relevant bugs list var stylesheet = ' \ <style> \ .ui-dialog { \ background-color: white; \ border: solid; \ border-width: 1px; \ } \ button.ui-button:nth-child(2) { \ position: absolute; \ right: .3em; \ top: 10%; \ width: 40px; \ margin: -10px 0 0 0; \ padding: 1px; \ height: 25px; \ } \ #ui-id-1 { \ background-color: rgb(225, 225, 225) !important; \ font-size: 14px !important; \ } \ </style>'; $('head').append(stylesheet); function getUnique() { var buglinks = $('tr.pushlogentry').length; // counter (helper) var links = []; var linksTexts = []; for (k = 2; k < buglinks+2; k++) { if (document.querySelector('tr.pushlogentry:nth-child(' + k + ') > td:nth-child(3) > strong:nth-child(1) > a:nth-child(1)')) { links.push(document.querySelector('tr.pushlogentry:nth-child(' + k + ') > td:nth-child(3) > strong:nth-child(1) > a:nth-child(1)')); linksTexts.push(document.querySelector('tr.pushlogentry:nth-child(' + k + ') > td:nth-child(3) > strong:nth-child(1) > a:nth-child(1)').href); } } unique = linksTexts.filter(function (itm, i, a) { // To get the unique elements/links in the page return i == a.indexOf(itm); }); } // Array with relevant 'Product' values var productYES = [ 'Add-on SDK', 'Cloud Services', 'Core', 'Firefox', 'Hello (Loop)', 'Toolkit' ]; // Array with irrelevant 'Component' values (relevant is only the ommited one 'Embedding: APIs' ) var ComponentNO = [ 'AutoConfig', 'Build Config', 'DMD', 'Embedding: GRE Core', 'Embedding: Mac', 'Embedding: MFC Embed', 'Embedding: Packaging', 'Hardware Abstraction Layer', 'mach', 'Nanojit', 'QuickLaunch', 'Widget: Gonk' ]; // Array with relevant 'Status' values var statusYES = [ 'RESOLVED', 'RESOLVED FIXED', 'VERIFIED' ]; var title; var status; var product; var component; function retrieveValues(x,i) { var target = x; var details = GM_xmlhttpRequest({ method: 'GET', url: target, synchronous: true, // Synchronous request onload: function (response) { var regex; var result; var matches = response.responseText.match(/<title>(.*)<\/title>/); regex = /<title>(.*)<\/title>/; title = regex.exec(matches[0]); titles.push(title[1]); // Helper array that stores the bugs titles regex = /<span id="static_bug_status">(.*)/; status = regex.exec(response.responseText)[1]; regex = /"field_container_product" >(.*)/; product = response.responseText.match(regex)[1]; products.push(product); // Helper array that stores the bugs Product value regex = /"field_container_component" >(.*)/; component = response.responseText.match(regex)[1]; components.push(component); // Helper array that stores the bugs Component value console.log('----------------------------------------------------------------------------------------------------------------------------------'); console.log(i+1 +"/"+unique.length); // Progression counter console.log('Title: ' + title[1] + '\nStatus: '+status + '\nProduct: '+product+'\nComponent: '+component); if (i == unique.length -1 ) { onComplete(); } } }); } function filterBugs(x,i) { hasData[i] = true; var flag = 0; // (For keeping only bugs with relevant 'STATUS' values) loop1: for (m = 0; m < statusYES.length; m++) { // alert (product); if (status == statusYES[m]) { flag = 0; break loop1; } else { flag = 1; } } if (flag == 1) { console.log (unique[i]+' \n is IRRELEVANT because of it\'s Status --> '+status); hasData[i] = false; return; } flag = 0; // (For keeping only bugs with relevant 'PRODUCT' values) loop2: for (j = 0; j < productYES.length; j++) { if (product == productYES[j]) { flag = 0; break loop2; } else { flag = 1; } } if (flag == 1) { console.log (unique[i]+' \n is IRRELEVANT because of it\'s Product --> '+product); hasData[i] = false; return; } flag = 0; // (For filtering out bugs with irrelevant 'COMPONENT' values) // loop3: for (k = 0; k < ComponentNO.length; k++) { if (component == ComponentNO[k]) { console.log (unique[i]+' \n is IRRELEVANT because of it\'s Component --> '+component); hasData[i] = false; return; } } console.log(' OK '+unique[i]); return; } var unique = []; var titles = []; var products = []; var components = []; var hasData = []; getUnique(); // Get the unique linkes in the page for (i = 0; i < unique.length; i++) { // Retrieves the values for each bug (from it's bug target HTML page) retrieveValues(unique[i],i); } function onComplete() { for (i = 0; i < unique.length; i++) { // Filters the irrelevant bugs out filterBugs(unique[i],i); } } var bugsComplete = []; var tmp; for (i=0; i < unique.length; i++){ if (hasData[i] === true){ tmp = '<a href="' + unique[i] + '">(' + products[i] + ': ' + components[i] + ') ' + titles[i] + '</a><br>'; bugsComplete.push(tmp); } } // SORTING based on the bugs 'Product' value var rx = /.*(\(.*\))/; bugsComplete.sort(function(x,y){ return getSortingKey(x) > getSortingKey(y); // If you use `<` instead, you'll get sorting in descending order }); function getSortingKey(value) { return value.match(rx)[1]; } // Variable that will contain all values of the bugsComplete array, and will be displayed in the 'dialog' below var docu =''; docu = bugsComplete.join(""); var div = document.createElement('div'); $('div.page_nav').append(div); div.id = 'dialog'; docu = '<div id="dialog" title="Relevant Bugs">' + docu + '</div>'; div.innerHTML = docu; $("#dialog").hide(); $(function() { $( "#dialog" ).dialog({ title: 'List of relevant bugs ('+ bugsComplete.length + ')', buttons: [ { click: function() { $( this ).dialog( "close" ); } } ], width: '1000px' }); }); console.log ('ALL IS DONE');