Mozilla Mercurial - Filters changelogs async

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

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

// ==UserScript==
// @name        Mozilla Mercurial - Filters changelogs async
// @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 
/*jshint multistr: true */
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 (element, index, array) {          // To get the unique elements/links in the page
    return index == array.indexOf(element);
  });

}





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: false, // Asynchronous request
      onload: function (response) {
        
        
        var thisIndex = i;
        
        
        var regex;
        var result;
        
        
        
        
        // get bugNo
        var bugNo;
        regex = /https:\/\/bugzilla\.mozilla\.org\/show_bug\.cgi\?id=(.*)/;
        bugNo = x.match(regex)[1];        
        bugNumbers[i] = bugNo;
        
        
                
        
        // get bug title     
        regex = /<title>.*\ &ndash;\ (.*)<\/title>/;        
        if (response.responseText.match(regex)){
          title = response.responseText.match(regex)[1];                
          titles[i] = title;                                            // Helper array that stores the bugs titles
        }

        // get bug title (full// in case it's a restricted one "Access Denied")    
        regex = /<title>(.*)<\/title>/;                //
        title2 = response.responseText.match(regex)[1];                // No Helper array needed
        
        
        
        // get status
        regex = /<span id="static_bug_status">(.*)/;        
        if (response.responseText.match(regex)){
        status = response.responseText.match(regex)[1];                // No Helper array needed
        }
        
                
        regex = /"field_container_product" >(.*)/;        
        if (response.responseText.match(regex)){
          product = response.responseText.match(regex)[1];        
          products[i] = product;                                       // Helper array that stores the bugs Product value
        }
                
                
        regex = /"field_container_component" >(.*)/;
        if (response.responseText.match(regex)){
          component = response.responseText.match(regex)[1];              
          components[i] = component;                                   // Helper array that stores the bugs Component value
        }

        
        generalCounter++;
        
        console.log('----------------------------------------------------------------------------------------------------------------------------------');
        // console.log(i+1 +"/"+unique.length);                                                      // Progression counter        
        console.log(generalCounter +"/"+unique.length);                                                      // Progression counter                
        console.log('BugNo: ' + bugNo + '\nTitle: ' + title + '\nStatus: '+status + '\nProduct: '+product+'\nComponent: '+component);
        
        
   
        
        

        if (title2 == 'Access Denied'){
          console.log (unique[i]+' \n is IRRELEVANT because of it\'s has restricted access');
          irrelevant[i] = 'true';     
          return;
        } else if (status != 'RESOLVED'        &&
                   status != 'RESOLVED FIXED'  && 
                   status != 'VERIFIED'){
          console.log (unique[i]+' \n is IRRELEVANT because of it\'s Status --> '+status);
          irrelevant[i] = 'true';          
          return;                
        } else if (component == 'Build Config' && (product == 'Toolkit' || product == 'Firefox' )){             
            console.log (unique[i]+' \n is IRRELEVANT because of it\'s Product --> '+product + 'having component --> ' + component);
            irrelevant[i] = 'true';          
            return;            
        } else if (product != 'Add-on SDK'      &&
                   product != 'Cloud Services'  &&
                   product != 'Core'            &&
                   product != 'Firefox'         &&
                   product != 'Hello (Loop)'    &&
                   product != 'Toolkit') {
            console.log (unique[i]+' \n is IRRELEVANT because of it\'s Product --> '+product);          
            irrelevant[i] = 'true';          
            return;            
        } else if (component == 'AutoConfig'                  ||
                   component == 'Build Config'                ||
                   component == 'DMD'                         ||
                   component == 'Embedding: GRE Core'         ||
                   component == 'Embedding: Mac'              ||
                   component == 'Embedding: MFC Embed'        ||
                   component == 'Embedding: Packaging'        ||
                   component == 'Hardware Abstraction Layer'  ||
                   component == 'mach'                        ||
                   component == 'Nanojit'                     ||
                   component == 'QuickLaunch'                 ||
                   component == 'Widget: Gonk') {
            console.log (unique[i]+' \n is IRRELEVANT because of it\'s Component --> '+component);          
            irrelevant[i] = 'true';          
            return;  
        } 

        irrelevant[i] = 'false';          
        console.log('                                                                   OK  '+unique[i]);

        if (thisIndex == (unique.length -1) ) {
            onComplete();
        } 
              
        return;
        
          
        
        
        
        
 
        
        
        
        
        
          }
      });
        
  
  
}
    





var bugsComplete = [];






var unique = [];

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



var generalCounter = 0; 


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


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





function onComplete(){



var tmp;
// alert (irrelevant[7]);
for (var z=0; z < unique.length; z++){  
  if (irrelevant[z] == 'true'){     
    continue;
  } else {      
    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: '1200px'
  });
});


console.log ('ALL IS DONE');
  
  
}

QingJ © 2025

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