您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
It creates a list of only the bugs related to Firefox for desktop in Mozilla Mercurial pushlogs
当前为
// ==UserScript== // @name Mozilla Mercurial - Filter changelogs // @namespace darkred // @description It creates a list of only the bugs related to Firefox for desktop in Mozilla Mercurial pushlogs // @include http://hg.mozilla.org/*/pushloghtml* // @include https://hg.mozilla.org/*/pushloghtml* // @version 1 // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_getResourceText // @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== /* jshint multistr: true */ $("head").append ( '<link ' + 'href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/themes/redmond/jquery-ui.min.css" ' + // 'href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/themes/smoothness/jquery-ui.min.css" ' + // uncomment this (and comment #19) in order to change theme 'rel="stylesheet" type="text/css">' ); var bugNumbers = []; var title; var status; var platforms = []; var platform; var whiteboards = []; var whiteboard; var unique = []; var titles = []; var product; var products = []; var component; var components = []; var irrelevant = []; var bugsComplete = []; var flag = 0; var counter = 0; var thisIndex; 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) retrieveValues(unique[i],i); } while (flag == 1){ onComplete(); flag++; } 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); }); } function retrieveValues(x,i) { var target = x; var details = GM_xmlhttpRequest({ method: 'GET', url: target, synchronous: false, // Asynchronous request onload: function (response) { var regex; // 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>.*\ –\ (.*)<\/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">(.*)\n\ *(.*)\n.*<\/span>/; if (response.responseText.match(regex)){ status = response.responseText.match(regex)[1] + ' ' + response.responseText.match(regex)[2]; // No Helper array needed // alert (status); } else { regex = /<span id="static_bug_status">(.*)\n\ *<\/span>/; if (response.responseText.match(regex)){ status = response.responseText.match(regex)[1]; // No Helper array needed // alert (status); } } 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 } regex = /<label for="rep_platform" accesskey="h">Platform<\/label>:.*\n.*<\/th>\n.*<td class="field_value">(.*)\n\ *(.*)/; if (response.responseText.match(regex)){ platform = response.responseText.match(regex)[1] + '/' + response.responseText.match(regex)[2] ; if (platform == 'Unspecified/Unspecified'){ platform = 'Uns'; } platforms[i] = platform; } regex = />Whiteboard:<\/a>\n<\/label>\n<\/th><td colspan="2">(.*)\ ./; if (response.responseText.match(regex)){ whiteboard = response.responseText.match(regex)[1]; whiteboards[i] = whiteboard; } counter++; console.log('----------------------------------------------------------------------------------------------------------------------------------'); console.log(counter +"/"+unique.length); // Progression counter console.log('BugNo: ' + bugNo + '\nTitle: ' + title + '\nStatus: '+status + '\nProduct: '+product+'\nComponent: '+component + '\nPlatform: ' + platform + '\nWhiteboard: ' + whiteboard); if (title2 == 'Access Denied'){ console.log (unique[i]+' \n is IRRELEVANT because of it\'s has restricted access'); irrelevant[i] = 'true'; } else if (status != 'RESOLVED' && status != 'RESOLVED FIXED' && status != 'VERIFIED' && status != 'VERIFIED FIXED'){ console.log (unique[i]+' \n is IRRELEVANT because of it\'s Status --> '+status); irrelevant[i] = 'true'; } 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'; } 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'; } 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'; } else { irrelevant[i] = 'false'; console.log(' OK '+unique[i]); } var limit = unique.length -1; if (flag == limit ) { // Don/t put `unique.length -1` inside parentheses, i.e. NOT `(unique.length -1)'' onComplete(); } flag++; return; } });} function onComplete(){ var tmp; 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] + ' [' + platforms[z] + ']' + '[' + whiteboards[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 + ')', width: '1350px' }); }); console.log ('ALL IS DONE'); } // $(function() { $("#dialog").dialog({ modal: false, title: "Draggable, sizeable dialog", position: { my: "top", at: "top", of: document, collision: "none" }, width: "auto", minWidth: 400, minHeight: 200, zIndex: 3666 } ) .dialog ("widget").draggable ("option", "containment", "none"); //-- Fix crazy bug in FF! ... $("#dialog").parent ().css ( { position: "fixed", top: 0, left: "4em", width: "75ex" } );