Mozilla Mercurial - Filters changelogs

It creates a list of only the bugs related to Firefox for desktop in Mozilla Mercurial pushlogs

目前為 2015-10-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name        Mozilla Mercurial - Filters changelogs
// @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*
// @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 (var 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 'Status' values
var statusYES = [
  'RESOLVED',
  'RESOLVED FIXED',
  'VERIFIED'
];





// 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'
];





var bugNumbers = [];

var title;
var status;
var product;
var component;



function retrieveValues(x,i) {
  
    var thisIndex = i;
  
  
    
    var target = x;
    var details = GM_xmlhttpRequest({
      method: 'GET',
      url: target,
      synchronous: true, // Synchronous request
      onload: function (response) {
        

        
        
        var regex;
        var result;
        
        
        
        
        // get bugNo
        var bugNo;
        regex = /https:\/\/bugzilla\.mozilla\.org\/show_bug\.cgi\?id=(.*)/;
        bugNo = x.match(regex)[1];
        // alert (bugNo);
        bugNumbers.push(bugNo);
        
        
                
        
        // get bug title     
        regex = /<title>.*\ &ndash;\ (.*)<\/title>/;        
        title = response.responseText.match(regex)[1];        
        titles.push(title);                                                // Helper array that stores the bugs titles
        
        
        // get status
        regex = /<span id="static_bug_status">(.*)/;        
        status = response.responseText.match(regex)[1];                    // No Helper array
        
                
        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('BugNo: ' + bugNo + '\nTitle: ' + title + '\nStatus: '+status + '\nProduct: '+product+'\nComponent: '+component);
        
        
   
        
        
        
        hasData[i] = true;    
        var flag = 0;

        

        // (For keeping only bugs with relevant 'STATUS' values)
        loop1:
        for (var 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);
          // irrelevant.push(unique[i]);
          // delete unique[i];
          // unique[i,1] = false;          
          hasData[i] = false;          
          return;      
        }

        
        
       flag = 0;        
        
        // (For keeping only bugs with relevant 'PRODUCT' values)
        loop2:
        for (var 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);
          // irrelevant.push(unique[i]);
          // delete unique[i];
          // unique[i,1] = false;          
          hasData[i] = false;          
          return;      

        }
        
        
        
        flag = 0;       
        
        // (For filtering out bugs with irrelevant 'COMPONENT' values)
        // loop3:
        for (var t = 0; t < ComponentNO.length; t++) {          
          if (component == ComponentNO[t]) {
            console.log (unique[i]+' \n is IRRELEVANT because of it\'s Component --> '+component);
            // irrelevant.push(unique[i]);
            // delete unique[i];
            // unique[i,1] = false;          
            hasData[i] = false;          
            return;
          }
        }
        
        
        
            

        
     
        
        console.log('                                                                   OK  '+unique[i]);
        return;
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
          }
      });
        
  
  
}
    





var bugsComplete = [];



  
/*

function removeIrrelevant(){  
}
*/



var unique = [];

var titles = [];
var products = [];
var components = [];
// var irrelevant = [];
var hasData = [];





getUnique();                                            // Get the unique linkes in the page


for (var i = 0; i < unique.length+1; i++) {                   // Retrieves the values for each bug (from it's bug target HTML page)
  retrieveValues(unique[i],i);  
}







var tmp;
// alert (hasData[7]);
for (var z=0; z < unique.length; z++){    
  if (hasData[z] === true){     
    // tmp = (z+1) + '. #'  + '<a href="' + unique[z] + '">'+ bugNumbers[z] + '</a>' +  ' (' + products[z] + ': ' + components[z] + ') ' + titles[z] + '<br>';          
    tmp = '<a href="' + unique[z] + '">#'+ bugNumbers[z] + '</a>' +  ' (' + products[z] + ': ' + components[z] + ') ' + titles[z] + '<br>';          
    bugsComplete.push(tmp);    
  } 
}







// SORTING based on the bugs 'Product' value
var rx = /.*<\/a>\ (.*)/;
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: 'auto'    
    width: '1000px'
  });
});


console.log ('ALL IS DONE');

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址