Mozilla Mercurial - Filters changelogs(pushlogs)

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

2015-10-18 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

// ==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');