aboutsummaryrefslogtreecommitdiffstats
path: root/bugzillaBugTriage.js
diff options
context:
space:
mode:
Diffstat (limited to 'bugzillaBugTriage.js')
-rw-r--r--bugzillaBugTriage.js982
1 files changed, 552 insertions, 430 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) {