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