diff options
author | Matěj Cepl <mcepl@redhat.com> | 2009-11-15 23:41:54 +0100 |
---|---|---|
committer | Matěj Cepl <mcepl@redhat.com> | 2009-11-15 23:41:54 +0100 |
commit | 39ab570c1841d4826b695315c3d7978fde6eb7a5 (patch) | |
tree | 624eb0b34685a737d9505bc6f036f2b0d673f0d0 | |
parent | d2aac544677b18881fd0515aa5302e46d3ed8aea (diff) | |
download | bugzilla-triage-39ab570c1841d4826b695315c3d7978fde6eb7a5.tar.gz |
Further progress towards salvation ... the last large piece remaining is XML-RPC change of MIME type of attachments
-rw-r--r-- | bugzillaBugTriage.js | 982 | ||||
-rw-r--r-- | skip-process-bug.js | 17 |
2 files changed, 552 insertions, 447 deletions
diff --git a/bugzillaBugTriage.js b/bugzillaBugTriage.js index 210d41c..a285081 100644 --- a/bugzillaBugTriage.js +++ b/bugzillaBugTriage.js @@ -22,7 +22,7 @@ var badMIMEArray = ["application/octet-stream","text/x-log"]; // the second parameter. Then reload the bug page and comment out // again. // myConfig.JSONURL = "URL-somewhere-with-your-JSON"; -var jsonDataURL = myConfig.JSONURL ? myConfig.JSONURL : +var jsonDataURL = myConfig.JSONURL ? myConfig.JSONURL : "http://mcepl.fedorapeople.org/scripts/BugZappers_data.json"; var PCIIDsURL = "http://mcepl.fedorapeople.org/scripts/drm_pciids.json"; //var debug = GM_getValue("debug",false); @@ -34,6 +34,8 @@ var BlankLineRe = new RegExp("^\\s*$"); var ChipsetRE = new RegExp("^\\(--\\) ([A-Za-z]+)\\([0-9]?\\): Chipset: (.*)$"); var ATIgetIDRE = new RegExp("^.*\\(ChipID = 0x([0-9a-fA-F]+)\\).*$"); +var inArray = ["application/octet-stream","text/x-log"]; + // For identification of graphics card var manuChipStrs = [ ["ATI Radeon", "ATI", "1002"], @@ -62,22 +64,20 @@ var queryButtonAvailable = false; var chipIDsGroupings = []; var AddrArray = []; var PCI_ID_Array = []; -var XorgLogAttList = []; -var XorgLogAttListIndex = 0; var topRow = {}; var bottomRow = {}; // Get JSON configuration data $.getJSON(jsonDataURL, function (response) { - msgStrs = response.strings; - signatureFedoraString = response.signature; - hashBugzillaName = response.bugzillalabelNames; - hashBugzillaWholeURL = response.bugzillaIDURLs; - // [{'regexp to match component':'email address of an universal maintainer'}, ...] - AddrArray = response.CCmaintainer; - defAssigneeList = response.defaultAssignee; - queryButtonAvailable = response.queryButton; - chipIDsGroupings = response.chipIDsGroupings; + msgStrs = response.strings; + signatureFedoraString = response.signature; + hashBugzillaName = response.bugzillalabelNames; + hashBugzillaWholeURL = response.bugzillaIDURLs; + // [{'regexp to match component':'email address of an universal maintainer'}, ...] + AddrArray = response.CCmaintainer; + defAssigneeList = response.defaultAssignee; + queryButtonAvailable = response.queryButton; + chipIDsGroupings = response.chipIDsGroupings; topRow = response.topRow; bottomRow = response.bottomRow; }); @@ -98,18 +98,18 @@ $.getJSON(PCIIDsURL, * @return string chosen element */ filterByRegexp = function(list, chosingMark) { - var chosenPair = []; - if (list.length > 0) { - chosenPair = list.filter( - function (pair) { - return new RegExp(pair.regexp, "i").test(chosingMark); - }); - } - if (chosenPair.length > 0) { - return $.trim(chosenPair[0].addr); - } else { - return ""; - } + var chosenPair = []; + if (list.length > 0) { + chosenPair = list.filter( + function (pair) { + return new RegExp(pair.regexp, "i").test(chosingMark); + }); + } + if (chosenPair.length > 0) { + return $.trim(chosenPair[0].addr); + } else { + return ""; + } } /** @@ -119,14 +119,14 @@ filterByRegexp = function(list, chosingMark) { * @return array of values */ valuesToList = function(list) { - var outL = []; - - list.forEach(function (e, i, a) { - if (e.hasAttribute("value")) { - outL.push(e.getAttribute("value").trim()); - } - }); - return outL; + var outL = []; + + list.forEach(function (e, i, a) { + if (e.hasAttribute("value")) { + outL.push(e.getAttribute("value").trim()); + } + }); + return outL; } /** @@ -138,7 +138,7 @@ valuesToList = function(list) { * @return position of the string in the list, or -1 if none found. */ isInList = function(mbr, list) { - return (list.indexOf(mbr) !== -1); + return (list.indexOf(mbr) !== -1); } /** @@ -187,10 +187,40 @@ function parseURL(url) { * */ bzPage.prototype.hasKeyword = function (str) { - var kwd = $.trim($('#keywords', this.doc).text()); - return (new RegExp(str).test(kwd)); + var kwd = $.trim($('#keywords', this.doc).text()); + return (new RegExp(str).test(kwd)); }; +/** + * Send mouse click to the specified element + * @param element where to send mouseclick to + * @return None + */ +bzPage.prototype.clickMouse = function(target) { + var localEvent = this.doc.get(0).createEvent("MouseEvents"); + localEvent.initMouseEvent("click", true, true, + this.doc.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + $(target).get(0).dispatchEvent(localEvent); +} + +/** + * Add new keyword among the keywords. + * + * @param str string with the new keyword + * @return none + * + * Checks for the existing keywords. + */ +bzPage.prototype.addKeyword = function (str) { + var kwd = $('#keywords',this.doc); + if (kwd.text().length == 0) { + kwd.text(str); + }else{ + kwd.text(kwd.text() + ", " + str); + } +} + /* Bugzilla functions.*/ /** @@ -198,10 +228,10 @@ bzPage.prototype.hasKeyword = function (str) { * */ bzPage.prototype.checkComments = function () { - var reporter = this.reporter; + var that = this; $("#comments .bz_comment", this.doc).each(function (i) { var email = $(".vcard a", this).text(); - if (new RegExp(reporter).test(email)) { + if (new RegExp(that.reporter).test(email)) { $(this).css("background-color", ReporterColor); } }); @@ -217,42 +247,42 @@ bzPage.prototype.checkComments = function () { * */ bzPage.prototype.setBranding = function () { - var brandColor = ""; - - if (new RegExp("Red Hat Enterprise Linux").test(this.product)) { - if (this.its.length > 0) { - brandColor = RHITColor; - } else { - brandColor = RHColor; - } - } else if (new RegExp("Fedora").test(this.product)) { - if (new RegExp("rawhide", "i").test(this.version)) { - brandColor = RawhideColor; - } else { - brandColor = FedoraColor; - } - } - - // Comment each of the following lines to get only partial branding - $("body", this.doc).css("background", brandColor); - $("#titles", this.doc).css("background", brandColor); - - // Make background-color of the body of bug salmon pink + var brandColor = ""; + + if (new RegExp("Red Hat Enterprise Linux").test(this.product)) { + if (this.its.length > 0) { + brandColor = RHITColor; + } else { + brandColor = RHColor; + } + } else if (new RegExp("Fedora").test(this.product)) { + if (new RegExp("rawhide", "i").test(this.version)) { + brandColor = RawhideColor; + } else { + brandColor = FedoraColor; + } + } + + // Comment each of the following lines to get only partial branding + $("body", this.doc).css("background", brandColor); + $("#titles", this.doc).css("background", brandColor); + + // Make background-color of the body of bug salmon pink // for security bugs. - if (this.hasKeyword("Security")) { - $("#bugzilla-body", this.doc).css({ - 'background-image' : 'none', - 'background-color' : SalmonPink - }); - } - - // we should make visible whether maintCCAddr is in CCList - if (isInList(this.maintCCAddr, this.CCList)) { - $("#cc_edit_area_showhide", this.doc). - css({ "color": "navy", - "font-weight": "bolder", - "text-decoration": "underline"}); - } + if (this.hasKeyword("Security")) { + $("#bugzilla-body", this.doc).css({ + 'background-image' : 'none', + 'background-color' : SalmonPink + }); + } + + // we should make visible whether maintCCAddr is in CCList + if (isInList(this.maintCCAddr, this.CCList)) { + $("#cc_edit_area_showhide", this.doc). + css({ "color": "navy", + "font-weight": "bolder", + "text-decoration": "underline"}); + } }; /** @@ -296,7 +326,7 @@ bzPage.prototype.fillInWhiteBoard = function (iLine, driverStr) { var outStr = ""; var cardIDStr = ""; var cardIDArr = []; - + console.log("driverStr = " + driverStr); console.log("iLine: " + iLine); @@ -305,7 +335,7 @@ bzPage.prototype.fillInWhiteBoard = function (iLine, driverStr) { var cardID = iLine.replace(ATIgetIDRE,"$1"); cardIDArr = this.checkChipStringFromID("1002",cardID); if (cardIDArr.length > 0) { - cardIDStr = cardIDArr[0]; + cardIDStr = cardIDArr[0]; if (cardIDArr[1]) { optionStr = cardIDArr[1]; outStr = this.groupIDs(driverStr,cardIDStr)+"/" + optionStr; @@ -341,84 +371,66 @@ bzPage.prototype.fillInWhiteBoard = function (iLine, driverStr) { outStr = iLine; } } - console.log("result = " + outStr); - var whiteboardInput = $("#status_whiteboard"); + var whiteboardInput = $("#status_whiteboard",this.doc); + var oldWhiteboard = whiteboardInput.attr("value"); var attachedText = $.trim("card_"+outStr); - if (whiteboardInput.text().length == 0) { - whiteboardInput.text(attachedText); - } else { - whiteboardInput.text(whiteboardInput.text()+", " + attachedText); + if (oldWhiteboard) { + attachedText += ", " + oldWhiteboard; } -}; - -// -bzPage.prototype.fillInAddButton = function (interestLine,driverString) { - var newButt = this.originalButton.clone(true); - var whiteboardInput = $("#status_whiteboard"); - - newButt.attr("id","chipmagic"); - newButt.attr("value","Fill In"); - console.log("fillInAddButton newButt = " + newButt.html()); - newButt.get(0).setAttribute("type","button"); - newButt.click(function (evt) { - fillInWhiteBoard(interestLine,driverString); - }); - whiteboardInput.append(newButt); - whiteboardInput.before("\u00A0"); + whiteboardInput.attr("value",attachedText); + $("#chipmagic", this.doc).css("display","none"); }; /** - * Recursive function to run Get attached Xorg.0.log, parse it and find the value of chip - * @return None + * Generic function to add new button to the page. + * Actually copies new button from the old one (in order to have the same + * look-and-feel, etc. + * @param originalLocation object with the button to be copied from + * @param newId string with the id of the new button; has to be unique in + whole page + * @param newLabel string with the label which will be shown to user + * @param commentString string with comment to be added to the comment box + * @param nState string with the new state bug should switch to (see + * generalPurposeCureForAllDisease function for details) + * @param secPar string with second parameter for generalPurposeForAllDisease + * @param doSubmit bool optional whether the button should submit whole page + * (default true) * + * @return none */ -bzPage.prototype.fillInChipMagicProcessAtts = function (ret) { - if (ret) { - if (ret.status != 200) { - alert([ret.status,ret.statusText,ret.responseHeaders, - ret.responseText]); - throw "XMLHTTPRequest got return code " + ret.status; - } - console.log('fetched ' + ret.finalUrl); - var interestingLineArr = ret.responseText.split("\n").filter(function (v,i,a) { - return ChipsetRE.test(v); - }); - console.log("interestingLineArr = " + interestingLineArr.toSource()); - if (interestingLineArr.length >0) { - // Process and exit - // .replace(ChipsetRE,"$1\t$2").split("\t") - var interestingArray = ChipsetRE.exec(interestingLineArr[0]); - console.log("interesting array = " + interestingArray.toSource()); - interestingLine = trim(interestingArray[2].replace(/[\s"]+/g," ")); - console.log("interesting line = " + interestingLine); - fillInAddButton(interestingLine,interestingArray[1].toUpperCase()); - console.log("XMLHTTPRequest done!"); - return; - } +bzPage.prototype.addNewButton = function (originalLocation,newId,newLabel, + commentString,nState,secPar,doSubmit,after) { + var that = this; + var commStr = ""; + if (doSubmit === null) { // missing optional argument + doSubmit = false; } - - if (XorgLogAttList[XorgLogAttListIndex]) { - var XorgLogAttID = XorgLogAttList[XorgLogAttListIndex][1]; - var attURL = "https://bugzilla.redhat.com/attachment.cgi?id="+XorgLogAttID; - GM_xmlhttpRequest({ - method: 'GET', - url: attURL, - headers: { - 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey getXorgLog', - 'Accept': 'text/plain', - 'Content-type': 'text/xml' - }, - onload:fillInChipMagicProcessAtts + if (after === null) { // missing optional argument + after = false; + } + if (msgStrs[commentString]) { + commStr = msgStrs[commentString]; + } + var newButton = this.originalButton.clone(true).attr({ + "id":newId, + "value":newLabel + }).click(function (evt) { + that.generalPurposeCureForAllDisease(commStr,nState, secPar); }); - XorgLogAttListIndex++; + newButton; + if (after) { + $(originalLocation, this.doc).after(newButton).after("\u00A0"); } else { - console.log("No more Xorg.0.log attachments!"); + $(originalLocation, this.doc).before(newButton).before("\u00A0"); } -}; + if (!doSubmit) { + newButton.get(0).setAttribute("type","button"); + } +} /** * Get attached Xorg.0.log, parse it and find the value of chip. - * Does not fill the whiteboard itself, just adds button to do so, + * Does not fill the whiteboard itself, just adds button to do so,paramList * so that slow XMLHTTPRequest is done in advance. * * @return None @@ -427,18 +439,39 @@ bzPage.prototype.fillInChipMagic = function () { var XorgLogURL = ""; var XorgLogAttID = ""; var XorgLogFound = false; + var attURL = "", interestingLine = ""; + var interestingArray = []; // Find out Xorg.0.log attachment URL - XorgLogAttList = this.attachments.filter(function (value, index, array) { + this.XorgLogAttList = this.attachments.filter(function (value, index, array) { // Xorg.0.log must be text, otherwise we cannot parse it - return (RegExp("[xX].*log").test(value[0]) && /text/.test(value[2])); + return (/[xX].*log/.test(value[0]) && /text/.test(value[2])); }); - console.log("XorgLogAttList = " + XorgLogAttList.toSource()); - if (XorgLogAttList.length == 0) { + if (this.XorgLogAttList.length == 0) { console.log("No Xorg.0.log attachments found.") return; } - fillInChipMagicProcessAtts(); + + var XorgLogAttID = this.XorgLogAttList[this.XorgLogAttListIndex][1]; + attURL = "https://bugzilla.redhat.com/attachment.cgi?id="+XorgLogAttID; + that = this; + $.get(attURL,function (ret){ + var interestingLineArr = ret.split("\n").filter(function (v,i,a) { + return ChipsetRE.test(v); + }); + if (interestingLineArr.length >0) { + interestingArray = ChipsetRE.exec(interestingLineArr[0]); + interestingLine = $.trim(interestingArray[2].replace(/[\s"]+/g," ")); + console.log("interestingArray = " + interestingArray.toSource() + + ", interestingLine = " + interestingLine); + var whiteboardInput = $("#status_whiteboard",that.doc); + that.addNewButton(whiteboardInput,"chipmagic","Fill In", + "","CHIPMAGIC", + interestingLine+"\t"+interestingArray[1].toUpperCase(), + false,true); + } + }); + this.XorgLogAttListIndex++; }; /** @@ -454,23 +487,22 @@ bzPage.prototype.fillInChipMagic = function () { * long_desc_type=substring&long_desc=Xpress%20200&bug_status=NEW&bug_status=ASSIGNED */ bzPage.prototype.queryInNewTab = function(text,component,product) { - // Optional parameter - console.log("text = " + text + ", component = " + component + ", product " + product); - if (product == null) { - product = "Fedora"; - } - var url = "https://bugzilla.redhat.com/buglist.cgi?query_format=advanced"; - if (product) { - url += "&product="+product; - } - if (component) { - url += "&component="+component; - } - if (text) { - url += "&long_desc_type=substring&long_desc="+ text.replace(" ","%20"); - } - console.log("queryInNewTab: url = " + url); - jetpack.tabs.open(url); + // Optional parameter + if (product == null) { + product = "Fedora"; + } + var url = "https://bugzilla.redhat.com/buglist.cgi?query_format=advanced"; + if (product) { + url += "&product="+product; + } + if (component) { + url += "&component="+component; + } + if (text) { + url += "&field0-0-0=longdesc&type0-0-0=substring&value0-0-0="+text+ + "&field0-0-1=attach_data.thedata&type0-0-1=substring&value0-0-1="+text; + } + jetpack.tabs.open(url); } /** @@ -478,13 +510,13 @@ bzPage.prototype.queryInNewTab = function(text,component,product) { * function this.queryInNewTab, and run it. */ bzPage.prototype.queryForSelection = function() { - var text = $.trim(jetpack.selection.text); - if (text.length < 1) { - text = jetpack.clipboard.get(); - }; - if (text.length > 0) { - this.queryInNewTab(text, this.component); - } + var text = $.trim(jetpack.selection.text); + if (text.length < 1) { + text = jetpack.clipboard.get(); + }; + if (text.length > 0) { + this.queryInNewTab(text, this.component); + } } /** @@ -492,34 +524,34 @@ bzPage.prototype.queryForSelection = function() { * * @param <tr> DOM element to be parsed * @return array with string name of the attachment, - integer its id number, - string of MIME type, - integer of size in kilobytes, - and the whole element itself + integer its id number, + string of MIME type, + integer of size in kilobytes, + and the whole element itself */ -bzPage.prototype.parseAttachmentLine = function (index,inElem) { - var MIMEtype = String(); - var size = Number(); - inElem.normalize(); +bzPage.prototype.parseAttachmentLine = function (inElem,idx) { + var MIMEtype = String(); + var size = Number(); // Skip over obsolete attachments if ($(".bz_obsolete",inElem).length>0) { - return; + return([]); } - // getting name of the attachment - var attName = $.trim($("b:first", inElem).text()); - // getting id - var aHrefs = $("a", inElem); - var id = parseInt(aHrefs.attr("href").replace(/^.*attachment.cgi\?id=/, ""),10); + // getting name of the attachment + var attName = $.trim($("b:first", inElem).text()); - //getting MIME type and size - var stringArray = $(".bz_attach_extra_info >*:first",inElem).text(). - replace(/[\n ()]+/g," ").trim().split(", "); - size = parseInt(stringArray[0],10); - MIMEtype = stringArray[1]; + // getting id + var aHrefs = $("a:contains('Details')", inElem); + var id = parseInt(aHrefs.attr("href").replace(/^.*attachment.cgi\?id=/, ""),10); - return([attName,id,MIMEtype,size,inElem]); + //getting MIME type and size + var stringArray = $(".bz_attach_extra_info",inElem).text(). + replace(/[\n ()]+/g," ").trim().split(", "); + size = parseInt(stringArray[0],10); + MIMEtype = stringArray[1].split(" ")[0]; + + return [attName,id,MIMEtype,size,inElem]; }; /** @@ -532,20 +564,12 @@ bzPage.prototype.parseAttachmentLine = function (index,inElem) { * @return none */ bzPage.prototype.selectOption = function(id,label) { -// var theOption = $("#"+id+" option[value='"+label+"']",this.doc); -// theOption.select(); - var selectElement = $(this.doc).get(0).getElementById(id); - var values = selectElement.options; - for (var i = 0; i < values.length; i++) { - values[i].normalize(); - if (values[i].text.search(label) != -1) { - values[i].selected = true; - var intEvent = $(this.doc).get(0).createEvent("HTMLEvents"); - intEvent.initEvent("change", true, true); - selectElement.dispatchEvent(intEvent); - break; - } - } + var selectElement = $("#"+id,this.doc); + var theOption = $("option[value='"+label+"']",selectElement); + theOption.attr("selected","selected"); + var intEvent = $(this.doc).get(0).createEvent("HTMLEvents"); + intEvent.initEvent("change", true, true); + selectElement.get(0).dispatchEvent(intEvent); } /** @@ -556,8 +580,25 @@ bzPage.prototype.selectOption = function(id,label) { * */ bzPage.prototype.hasKeyword = function(str) { - var kwd = $.trim($('#keywords',this.doc).text()); - return (RegExp(str).test(kwd)); + var kwd = $.trim($('#keywords',this.doc).text()); + return (RegExp(str).test(kwd)); +} + +/** + * Add accesskey to the particular element + * + * @param rootElement element to which the new text object will be attached + * @param beforeText text before the accesskey character + * @param accKey what will be the accesskey itself + * @param afterText text after the accesskey character + * @return modified element with the fixed accesskey + * +*/ +bzPage.prototype.fixElement = function (rootElement,beforeText,accKey,afterText) { + elem = $(rootElement); + elem.attr("accesskey",accKey.toLowerCase()); + elem.html(beforeText + "<b><u>" + accKey + "</u></b>" + afterText); + return elem; } /** @@ -566,16 +607,19 @@ bzPage.prototype.hasKeyword = function(str) { * @param evt event which made this function active * @return none */ -bzPage.prototype.changeOwnerHandler = function(evt) { - /** Take care that when changing assignment of the bug, - * current owner is added to CC list. - * Switch off setting to the default assignee - */ - if (!isInList(this.maintCCAddr, CCList)) { - $("#newcc",this.doc).text(this.maintCCAddr); - } - $("#set_default_assignee",this.doc).removeAttr("checked"); - this.selectOption("bug_status", "ASSIGNED"); +bzPage.prototype.changeOwner = function(newAssignee) { + /** Take care that when changing assignment of the bug, + * current owner is added to CC list. + * Switch off setting to the default assignee + */ + console.log("Changing owner of the bug to " + newAssignee); + if (!isInList(newAssignee, this.CCList)) { + $("#newcc",this.doc).text(newAssignee); + } + this.clickMouse($("#bz_assignee_edit_action",this.doc)); + $("#set_default_assignee",this.doc).removeAttr("checked"); + $("#assigned_to", this.doc).attr("value",newAssignee); + $("#setdefaultassigneebutton", this.doc).css("display","none"); } /** @@ -585,8 +629,8 @@ bzPage.prototype.changeOwnerHandler = function(evt) { * @return none */ bzPage.prototype.setNeedinfoReporter = function() { - $("#needinfo",this.doc).click(); - this.selectOption("needinfo_role", "reporter"); + $("#needinfo",this.doc).click(); + this.selectOption("needinfo_role", "reporter"); } /** @@ -596,14 +640,14 @@ bzPage.prototype.setNeedinfoReporter = function() { * @return none */ bzPage.prototype.addTextToComment = function(string2BAdded) { - var commentTextarea = $("#comment",this.doc); - - // don't remove the current content of the comment box, - // just behave accordingly - if (commentTextarea.text().length > 0) { - commentTextarea.text(commentTextarea.text() + "\n\n"); - } - commentTextarea.text(commentTextarea.text() + string2BAdded); + var commentTextarea = $("#comment",this.doc); + + // don't remove the current content of the comment box, + // just behave accordingly + if (commentTextarea.text().length > 0) { + commentTextarea.text(commentTextarea.text() + "\n\n"); + } + commentTextarea.text(commentTextarea.text() + string2BAdded); } /** @@ -614,13 +658,13 @@ bzPage.prototype.addTextToComment = function(string2BAdded) { * @return string with the string for the external_id SELECT */ bzPage.prototype.getBugzillaName = function(URLhostname) { - var bugzillaID = ""; - if (hashBugzillaName[URLhostname]) { - bugzillaID = hashBugzillaName[URLhostname]; - } else { - bugzillaID = ""; - } - return bugzillaID; + var bugzillaID = ""; + if (hashBugzillaName[URLhostname]) { + bugzillaID = hashBugzillaName[URLhostname]; + } else { + bugzillaID = ""; + } + return bugzillaID; } /** @@ -630,13 +674,132 @@ bzPage.prototype.getBugzillaName = function(URLhostname) { * @return string with the URL */ bzPage.prototype.getWholeURL = function(selectValue,bugID) { - var returnURL = ""; - if (hashBugzillaWholeURL[selectValue]) { - returnURL = hashBugzillaWholeURL[selectValue]+bugID; - } else { - returnURL = ""; - } - return returnURL; + var returnURL = ""; + if (hashBugzillaWholeURL[selectValue]) { + returnURL = hashBugzillaWholeURL[selectValue]+bugID; + } else { + returnURL = ""; + } + return returnURL; +} + +/** + * Sends XMLRPC request + * + * @param url string with URL of the XML-RPC interface + * @param data string with XML of the data to be sent + * @param method string -- either 'post' or 'get' + * @param callback function catching callback + */ +bzPage.prototype.sendRequest = function(url,data,method,callback) { + //$.rpc(url, dataType, onLoadCallback, version); + GM_xmlhttpRequest({ + method: method, + url: url, + headers: { + 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey fixAttType XMLRPC', + 'Accept': 'application/atom+xml,application/xml,text/xml', + 'Content-type': 'text/xml' + }, + data: data, + onload: callback + }); +} + +/** + * Callback function for the XMLRPC request + * + * @param ret object with xmlhttprequest response + * with attributes: + * + status -- int return code + * + statusText + * + responseHeaders + * + responseText + */ +bzPage.prototype.callBack = function(ret) { + if (ret.status != 200) { + alert([ret.status,ret.statusText,ret.responseHeaders, + ret.responseText]); + } + if (--this.reqCounter <= 0) { + setTimeout(document.location.reload,1000); + } +} + +/** + * The worker function -- call XMLRPC to fix MIME type of the + * particular attachment + * + * @param id integer with the attachment id to be fixed + * @param type string with the new MIME type, e.g. "text/plain" + * + +updateAttachMimeType($data_ref, $username, $password) + +Update the attachment mime type of an attachment. The first argument is a data hash containing information on the new MIME type and the attachment id that you want to act on. + + $data_ref = { + "attach_id" => "<Attachment ID>", + # Attachment ID to perform MIME type change on. + "mime_type" => "<New MIME Type Value>", + # Legal MIME type value that you want to change the attachment to. + "nomail" => 0, + # OPTIONAL Flag that is either 1 or 0 if you want email to be sent or not for this change + }; + */ +bzPage.prototype.fixAttachById = function(id,type) { + var ret = {}; + var msg = new XMLRPCMessage("bugzilla.updateAttachMimeType"); + msg.addParameter({'attach_id':id, 'mime_type':type}); + msg.addParameter(login); + msg.addParameter(password); + try { + ret = sendRequest(XMLRPCurl, + msg.xml(),'post',callBack); + } + catch (e) { + alert([e,ret]); + } + this.reqCounter++; +} + +bzPage.prototype.fixAllAttachments = function(list) { + var tmpElem = {}; + + for(var i=0;i<list.length;i++) { + tmpElem = list[i]; + fixAttachById(tmpElem[1],"text/plain"); + } +} + +bzPage.prototype.createFixAllButton = function (list) { + var aElem = $("<a href=''></a>", this.doc).click(function() { + this.fixAllAttachments(list); + }); + this.fixElement(aElem,"","F","ix all"); + return aElem; +} + +bzPage.prototype.getTextAllLink = function (table,list) { + var vAllElem = $("a[href*='action=enter']", $(table)).get(); +} + +bzPage.prototype.addTextLink = function (row) { + var aList = row[row.length-1].getElementsByTagName("a"); + var curElem = aList[aList.length-1]; + var tElem = {}; + var t2Elem = {}; + var that = this; + + var tElem = $(" <a href=''>Text</a>",this.doc).click(function (event) { + that.fixAttachById(row[1],"text/plain"); + }); + + $("a",row).after(tElem).after("<br/>"); +} + +bzPage.prototype.isOctetStream = function (element, index, array) { + return(inArray.indexOf(element[2]) != -1); } /** @@ -646,42 +809,42 @@ bzPage.prototype.getWholeURL = function(selectValue,bugID) { * @return none */ bzPage.prototype.addClosingUpstream = function() { - var refs = $("#external_bugs_table tr",this.doc); - // that's a bad id, if there is a one. :) - var inputBox = $("#inputbox",this.doc); - var externalBugID = 0; - var wholeURL = ""; - - // Fix missing ID on the external_id SELECT - $("select[name='external_id']:first",this.doc).attr("id","external_id"); - - if (inputBox.text().match(/^http.*/)) { - var IBURLArr = parseURL(inputBox.text()); - console.log("IBURLArr = " + IBURLArr.toSource()); - externalBugID = parseInt(IBURLArr.params["id"]); - inputBox.text(externalBugID); - var bugzillaName = getBugzillaName(IBURLArr.host); - this.selectOption("external_id", bugzillaName); - console.log("externalBugID = " + externalBugID); - } else if (!isNaN(inputBox.text())) { - externalBugID = parseInt(inputBox.text()); - var bugzillaID = $("#external_id").text(); - wholeURL = getWholeURL(bugzillaID,externalBugID); - } else { - // no inputBox.value -- maybe there is an external bug from - // the previous commit? - ; - } - - // It is not good to close bug as UPSTREAM, if there is no reference - // to the upstream bug. - if ((refs.length > 2) || (externalBugID > 0)) { - this.addTextToComment(msgStrs['sentUpstreamString'].replace("§§§",wholeURL)); - this.selectOption("bug_status", "CLOSED"); - this.selectOption("resolution", "UPSTREAM"); - } else { - alert("No external bug specified among the External References!"); - } + var refs = $("#external_bugs_table tr",this.doc); + // that's a bad id, if there is a one. :) + var inputBox = $("#inputbox",this.doc); + var externalBugID = 0; + var wholeURL = ""; + + // Fix missing ID on the external_id SELECT + $("select[name='external_id']:first",this.doc).attr("id","external_id"); + + if (inputBox.text().match(/^http.*/)) { + var IBURLArr = parseURL(inputBox.text()); + console.log("IBURLArr = " + IBURLArr.toSource()); + externalBugID = parseInt(IBURLArr.params["id"]); + inputBox.text(externalBugID); + var bugzillaName = getBugzillaName(IBURLArr.host); + this.selectOption("external_id", bugzillaName); + console.log("externalBugID = " + externalBugID); + } else if (!isNaN(inputBox.text())) { + externalBugID = parseInt(inputBox.text()); + var bugzillaID = $("#external_id").text(); + wholeURL = getWholeURL(bugzillaID,externalBugID); + } else { + // no inputBox.value -- maybe there is an external bug from + // the previous commit? + ; + } + + // It is not good to close bug as UPSTREAM, if there is no reference + // to the upstream bug. + if ((refs.length > 2) || (externalBugID > 0)) { + this.addTextToComment(msgStrs['sentUpstreamString'].replace("§§§",wholeURL)); + this.selectOption("bug_status", "CLOSED"); + this.selectOption("resolution", "UPSTREAM"); + } else { + alert("No external bug specified among the External References!"); + } } /** Insert a row of buttons before the marked element @@ -691,12 +854,12 @@ bzPage.prototype.addClosingUpstream = function() { * @return none */ bzPage.prototype.generateToolBar = function(anchor,array) { - for (var i=0; i<array.length; i++) { - var butt = array[i]; - this.addNewButton(anchor, butt['idx'], - butt['msg'], butt['string'], butt['state'], butt['parameter'], - butt['submit']); - } + for (var i=0; i<array.length; i++) { + var butt = array[i]; + this.addNewButton(anchor, butt['idx'], + butt['msg'], butt['string'], butt['state'], butt['parameter'], + butt['submit']); + } } /** @@ -704,115 +867,60 @@ bzPage.prototype.generateToolBar = function(anchor,array) { * * @param addString string to be added as new comment * @param nextState string signifying next state of the bug (whatever is in Bugzilla + - "NEEDINFO" meaning NEEDINFO(Reporter)) + "NEEDINFO" meaning NEEDINFO(Reporter)) * @param secondParameter string with label on the subbutton for reason * of closing the bug * @return none */ bzPage.prototype.generalPurposeCureForAllDisease = function (addString,nextState,secondParameter) { - if (addString.length >0) { - this.addTextToComment(addString); - } - - if (nextState == "CLOSED") { - if (secondParameter == "UPSTREAM") { - this.addClosingUpstream(); - } else if (secondParameter.length > 0) { - this.selectOption("bug_status", nextState); - this.selectOption("resolution",secondParameter); - return 0; - } else { - throw("Missing resolution for CLOSED status."); - } - } - - // Now closing bugs is done, what about the rest? - if (nextState == "NEEDINFO") { - this.setNeedinfoReporter(); - } else if (nextState == "ADDKEYWORD") { - if (secondParameter.length == 0) { - throw "Keyword has to be defined"; - } - this.addKeyword(secondParameter); - } else if (nextState == "ASSIGNED") { - if (!isInList(this.maintCCAddr, this.CCList)) { - $("#newcc",this.doc).text(this.maintCCAddr); - } - this.selectOption("bug_status", nextState); - } else if (nextState == "QUERYSEL") { - this.queryForSelection(); - } else if (nextState == "SETDEFASS") { - if (secondParameter.length > 0) { - console.log("default assignee = " + secondParameter); - //$("#bz_assignee_edit_action",this.doc).click(); - //$("#assigned_to", this.doc).text(secondParameter); - } - } else if (nextState.length >0) { - this.selectOption("bug_status", nextState); - } - - if (secondParameter == "ADDSELFCC") { - $("#addselfcc", this.doc).attr("checked","checked"); - } else if (secondParameter == "NODEFAULTASSIGNEE") { - $("#set_default_assignee", this.doc).removeAttr("checked"); - } -} - -/** - * Generic function to add new button to the page. - * Actually copies new button from the old one (in order to have the same - * look-and-feel, etc. - * @param originalLocation object with the button to be copied from - * @param newId string with the id of the new button; has to be unique in - whole page - * @param newLabel string with the label which will be shown to user - * @param commentString string with comment to be added to the comment box - * @param nState string with the new state bug should switch to (see - * generalPurposeCureForAllDisease function for details) - * @param secPar string with second parameter for generalPurposeForAllDisease - * @param doSubmit bool optional whether the button should submit whole page - * (default true) - * - * @return none - */ -bzPage.prototype.addNewButton = function (originalLocation,newId,newLabel, - commentString,nState,secPar,doSubmit) { - var that = this; - var commStr = ""; - if (doSubmit === null) { // missing optional argument - doSubmit = true; - } - if (msgStrs[commentString]) { - commStr = msgStrs[commentString]; - } - var newButton = this.originalButton.clone(true).attr({ - "id":newId, - "value":newLabel - }).click(function (evt) { - that.generalPurposeCureForAllDisease(commStr,nState, secPar); - }); - $(originalLocation, this.doc).before(newButton).before("\u00A0"); - if (!doSubmit) { - newButton.get(0).setAttribute("type","button"); - } -} - -/** - * Add new keyword among the keywords. - * - * @param str string with the new keyword - * @return none - * - * Checks for the existing keywords. - */ -bzPage.prototype.addKeyword = function (str) { - var kwd = $('#keywords',this.doc); - if (kwd.text().length == 0) { - kwd.text(str); - }else{ - kwd.text(kwd.text() + ", " + str); - } + if (addString.length >0) { + this.addTextToComment(addString); + } + + if (nextState == "CLOSED") { + if (secondParameter == "UPSTREAM") { + this.addClosingUpstream(); + } else if (secondParameter.length > 0) { + this.selectOption("bug_status", nextState); + this.selectOption("resolution",secondParameter); + return 0; + } else { + throw("Missing resolution for CLOSED status."); + } + } + + // Now closing bugs is done, what about the rest? + if (nextState == "NEEDINFO") { + this.setNeedinfoReporter(); + } else if (nextState == "ADDKEYWORD") { + if (secondParameter.length == 0) { + throw "Keyword has to be defined"; + } + this.addKeyword(secondParameter); + } else if (nextState == "ASSIGNED") { + if (!isInList(this.maintCCAddr, this.CCList)) { + $("#newcc",this.doc).text(this.maintCCAddr); + } + this.selectOption("bug_status", nextState); + } else if (nextState == "QUERYSEL") { + this.queryForSelection(); + } else if (nextState == "SETDEFASS") { + if (secondParameter.length > 0) { + this.changeOwner(secondParameter); + } + } else if (nextState == "CHIPMAGIC") { + var splitArr = secondParameter.split("\t"); + this.fillInWhiteBoard(splitArr[0],splitArr[1]); + } else if (nextState.length >0) { + this.selectOption("bug_status", nextState); + } + + if (secondParameter == "ADDSELFCC") { + $("#addselfcc", this.doc).attr("checked","checked"); + } else if (secondParameter == "NODEFAULTASSIGNEE") { + $("#set_default_assignee", this.doc).removeAttr("checked"); + } } /** @@ -824,47 +932,49 @@ bzPage.prototype.addKeyword = function (str) { * @return none */ bzPage.prototype.buildButtons = function (above,below) { - //Generate a list of <input> elements in the page - var IBLast = $("#commit_top", this.doc); - this.addNewButton(IBLast,"changeOwnerbtn","reASSIGN", - "","ASSIGNED","NODEFAULTASSIGNEE"); - - // THE MAIN BUTTON ROWS - var commentBox = $("#comment", this.doc); - commentBox.before("<br>"); - this.generateToolBar(commentBox.prev(),above); - this.generateToolBar(this.originalButton,below); - - if (queryButtonAvailable) { - // Add query search button - // Apparently there is a bug in jQuery, we have to use plain DOM - //newPosition = $("#newcommentprivacy ~ br", this.doc); - newPosition = $(this.doc.get(0).querySelector("#newcommentprivacy ~ br")); - newPosition.css("border","solid blue"); - this.addNewButton(newPosition,"newqueryintab","Query for string", + //Generate a list of <input> elements in the page + var IBLast = $("#commit_top", this.doc); + this.addNewButton(IBLast,"changeOwnerbtn","reASSIGN", + "","ASSIGNED","NODEFAULTASSIGNEE"); + + // THE MAIN BUTTON ROWS + var commentBox = $("#comment", this.doc); + commentBox.before("<br>"); + this.generateToolBar(commentBox.prev(),above); + this.generateToolBar(this.originalButton,below); + + if (queryButtonAvailable) { + // Add query search button + // Apparently there is a bug in jQuery, we have to use plain DOM + //newPosition = $("#newcommentprivacy ~ br", this.doc); + newPosition = $(this.doc.get(0).querySelector("#newcommentprivacy ~ br")); + newPosition.css("border","solid blue"); + this.addNewButton(newPosition,"newqueryintab","Query for string", "","QUERYSEL","",false); - } - console.log("chipIDsGroupings = " + chipIDsGroupings.length); - if ((chipIDsGroupings.length >0) && this.maintCCAddr == "xgl-maint@redhat.com") { - // Add find chip magic button - if (!$("#status_whiteboard:contains('card_')", this.doc)) { + } + if ((chipIDsGroupings.length >0) && this.maintCCAddr == "xgl-maint@redhat.com") { + // Add find chip magic button + var whiteboard_string = $("#status_whiteboard", this.doc).attr("value"); + if (whiteboard_string.indexOf("card_") == -1) { this.fillInChipMagic(); - } - } - // Add setting default assignee - if ((this.defaultAssignee.length > 0) && (this.defaultAssignee != this.owner)) { - this.addNewButton($("#bz_assignee_edit_container", this.doc), - "setdefaultassigneebutton","Def. Assignee", - "","SETDEFASS",this.defaultAssignee,false); - } + } + } + // Add setting default assignee + console.log("defaultAssignee = " + this.defaultAssignee + ", owner = " + this.owner); + if ((this.defaultAssignee.length > 0) && (this.defaultAssignee != this.owner)) { + this.addNewButton($("#bz_assignee_edit_container", this.doc), + "setdefaultassigneebutton","Def. Assignee", + "","SETDEFASS",this.defaultAssignee,false,true); + } }; /////////////////////////////////////////////////////////////////////////////// function bzPage(doc) { this.doc = $(doc); + that = this; this.originalButton = $("#commit", this.doc); var bugNoTitle = $.trim($("#title > p:first", this.doc).text()); - this.bugNo = new RegExp("[0-9]+").exec(bugNoTitle)[0]; + this.bugNo = new RegExp("[0-9]+").exec(bugNoTitle)[0]; this.reporter = $("#bz_show_bug_column_2 > table .vcard:first > a", this.doc).attr("title"); @@ -872,24 +982,31 @@ function bzPage(doc) { this.component = $("#component option:selected:first", this.doc).text(); this.version = $("#version option:selected:first", this.doc).text(); this.its = $.trim($("#cf_issuetracker", this.doc).text()); - this.CCList = $("#cc", this.doc).attr("value"); + this.CCList = $.makeArray($("#cc", this.doc).attr("value")); + this.owner = $("#bz_assignee_edit_container .fn:first", this.doc).text(); this.defaultAssignee = filterByRegexp(defAssigneeList, this.component).toLowerCase(); this.maintCCAddr = filterByRegexp(AddrArray,this.component).toLowerCase(); - - this.attachments = $("#attachment_table tr", - this.doc).slice(1,-1).map(this.parseAttachmentLine); - - var badAttachments = this.attachments.filter(function (a) { - return (badMIMEArray.indexOf(a[2]) != -1); + + this.XorgLogAttList = []; + this.XorgLogAttListIndex = 0; + this.attachments = []; + this.reqCounter=0; + atts = $.makeArray($(("#attachment_table tr"),this.doc).slice(1,-1)); + atts.forEach(function (val,idx,arr) { + that.attachments.push(that.parseAttachmentLine(val,idx)); + }); + + var badAttachments = this.attachments.filter(function (att,idx,arr) { + return (badMIMEArray.indexOf(att[2]) != -1); }); - if (badAttachments.length>0) { - console.log("we have " + badAttachments.length + " bad attachments."); - var titleElement = $(".bz_alias_short_desc_container:first").css("background-color", - "olive").append($(this.createFixAllButton(badAttachments))); - badAttachments.forEach(function (x) { - this.addTextLink(x); - }); + if (badAttachments.length > 0) { + console.log("we have " + badAttachments.length + " bad attachments."); + var titleElement = $(".bz_alias_short_desc_container:first").css("background-color", + "olive").append($(this.createFixAllButton(badAttachments))); + badAttachments.forEach(function (x) { + this.addTextLink(x); + }); } // Take care of signature for Fedora bugzappers @@ -902,11 +1019,16 @@ function bzPage(doc) { cmntText.text($.trim(cmntText.text()) + signatureFedoraString); } }); - } + } this.setBranding(); this.checkComments(); - this.buildButtons(topRow,bottomRow); + this.buildButtons(topRow,bottomRow); + + var that = this; + $("#component",this.doc).change(function (){ + that.changeOwner(that.maintCCAddr); + }); } var callback = function (doc) { diff --git a/skip-process-bug.js b/skip-process-bug.js index 691d6d1..32d05b4 100644 --- a/skip-process-bug.js +++ b/skip-process-bug.js @@ -23,20 +23,3 @@ options.matches = [ "https://bugzilla.mozilla.org/post_bug.cgi", ]; jetpack.pageMods.add(callback, options); - -// "https://bugzilla.redhat.com/attachment.cgi", -// http://code.google.com/chrome/extensions/match_patterns.html sucks, we don't have $ - -// paths = pages.map(function(p) root + p + '.cgi'), -// collision = 'Mid-air collision!'; -// if (paths.some(function(p) doc.location == p) && doc.title != collision) { -// var $doc = $(doc), -// mail = $doc.find('#bugzilla-body > dl').text(), -// bug = $($doc.find('.bz_alias_short_desc_container > a')); -// /* Bail if we sense a disturbance. */ -// if (bug.size() != 0) { -// jetpack.notifications.show({title: 'Mail sent for ' + bug.text(), body: mail}); -// doc.location = root + bug.attr('href'); -// } -// } -//}); |