aboutsummaryrefslogtreecommitdiffstats
path: root/bugzillaBugTriage.js
diff options
context:
space:
mode:
Diffstat (limited to 'bugzillaBugTriage.js')
-rw-r--r--bugzillaBugTriage.js311
1 files changed, 175 insertions, 136 deletions
diff --git a/bugzillaBugTriage.js b/bugzillaBugTriage.js
index 2397445..d57adf7 100644
--- a/bugzillaBugTriage.js
+++ b/bugzillaBugTriage.js
@@ -261,6 +261,21 @@ hlpr.isInList = function(mbr, list) {
};
/**
+ * format date to be in ISO format (just day part)
+ *
+ * @param date
+ * @return string with the formatted date
+ */
+hlpr.getISODate = function (dateStr) {
+ function pad(n) {
+ return n < 10 ? '0' + n : n;
+ }
+ let date = new Date(dateStr);
+ return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-'
+ + pad(date.getDate());
+};
+
+/**
* Make sure value returned is Array
*
* @param Array/String
@@ -312,6 +327,37 @@ hlpr.removeCSVValue = function removeCSVValue(str, value) {
};
/**
+ * From given URL returns hostname of the server
+ *
+ * @param url String with the investigated URL
+ * @return String with hostname
+ */
+hlpr.getHost = function(url) {
+ let aElem = jetpack.tabs.focused.contentWindow.document.createElement("a");
+ aElem.setAttribute("href",url);
+ return aElem.hostname;
+}
+
+/**
+ *
+ */
+hlpr.getBugNo = function(url) {
+ // FIXME Why not to parse URL?
+// let bugNoTitle = this.doc.querySelector("#title > p").textContent.trim();
+// console.log("bugNoTitle = " + bugNoTitle);
+// this.bugNo = this.getBugNo(this.doc.location.toString());
+// https://bugzilla.redhat.com/show_bug.cgi?id=583826
+ let re = new RegExp(".*id=([0-9]+).*$");
+ let bugNo = null;
+ let reResult = re.exec(url);
+ if (reResult[1]) {
+ bugNo = reResult[1];
+ console.log("this.bugNo = " + bugNo);
+ }
+ return bugNo;
+};
+
+/**
* Load text from URL
*
* @param URL String
@@ -595,6 +641,97 @@ Color.prototype.lightColor = function() {
};
// ====================================================================================
+// Logger
+
+function Logger(store, abbsMap) {
+ this.EmptyLogsColor = new Color(0, 255, 0);
+ this.FullLogsColor = new Color(0, 40, 103);
+
+ this.store = store;
+ this.abbsMap = abbsMap;
+};
+
+// FIXME we should store whole URL, not just ID (to cooperate with other bugzillas)
+// General rule: there is nothing special about bugzilla.redhat.com, so for example
+// constantData.bugzillalabelNames should be made non-RH-centric
+// and getBugzillaName should work everywhere same (even on bugzilla.mozilla.org,
+// if that makes sense?)
+Logger.prototype.addLogRecord = function(that) {
+ let rec = {};
+ rec.date = new Date();
+ rec.url = that.doc.location.toString();
+ rec.title = that.title;
+ let comment = jetpack.tabs.focused.contentWindow.prompt(
+ "Enter comments for this comment").trim();
+ if (comment.length > 0) {
+ rec.comment = comment;
+ let recKey = hlpr.getISODate(rec.date) + "+" + hlpr.getHost(rec.url)
+ + "+" + that.bugNo;
+ let clearLogAElem = that.doc.getElementById("clearLogs");
+ clearLogAElem.style.color = this.FullLogsColor;
+ clearLogAElem.style.fontWeight = "bolder";
+ if (this.store[recKey]) {
+ this.store[recKey].comment += "<br/>\n" + comment;
+ } else {
+ this.store[recKey] = rec;
+ }
+ jetpack.storage.simple.sync();
+ return rec;
+ } else if (comment === null) {
+ return null;
+ }
+};
+
+Logger.prototype.getBugzillaAbbr = function(url) {
+ // for https://bugzilla.redhat.com/show_bug.cgi?id=579123 get RH
+ // for https://bugzilla.mozilla.org/show_bug.cgi?id=579123 get MoFo
+ var abbr = this.abbsMap[host];
+ console.log("abbr = " + abbr);
+ return abbr;
+}
+
+Logger.prototype.timeSheetRecordsPrinter = function(body, records) {
+ let that = this;
+ // sort the records into temporary array
+ let tmpArr = [];
+
+ for ( let i in records) {
+ if (records.hasOwnProperty(i)) {
+ tmpArr.push( [ i, records[i] ]);
+ }
+ }
+ tmpArr.sort(function(a, b) {
+ return a[0] > b[0] ? 1 : -1;
+ });
+
+ let currentDay = "";
+ // now print the array
+ tmpArr.forEach(function(rec) {
+ let x = rec[1];
+ let dayStr = hlpr.getISODate(x.date);
+ let BZName = that.getBugzillaAbbr(x.url);
+ let bugNo = hlpr.getBugNo(x.url);
+ if (dayStr != currentDay) {
+ currentDay = dayStr;
+ body.innerHTML += "<hr/><p><strong>" + currentDay
+ + "</strong></p>";
+ }
+ body.innerHTML += "<p><em><a href='"
+ + x.url
+ + "'>Bug "
+ + BZName + "/" + bugNo + ": "
+ + x.title
+ + "</a>"
+ + " </em>\n<br/>" + x.comment + "</p>";
+ });
+};
+
+Logger.prototype.generateTimeSheet = function(body) {
+ let doc = body.ownerDocument;
+ this.timeSheetRecordsPrinter(body, this.store);
+};
+
+// ====================================================================================
// BZPage's methods
function BZPage(doc) {
@@ -602,10 +739,7 @@ function BZPage(doc) {
this.SalmonPink = new Color(255, 224, 176); // RGB 255, 224, 176; HSL 36, 2,
// 85
this.ReporterColor = new Color(255, 255, 166); // RGB 255, 255, 166; HSL 60, 2,
- // 83
- this.EmptyLogsColor = new Color(0, 255, 0);
- this.FullLogsColor = new Color(0, 40, 103);
-
+ // 83
this.RE = {
Comment: new RegExp("^\\s*#"), // unsused
BlankLine: new RegExp("^\\s*$"), // unused
@@ -620,13 +754,13 @@ function BZPage(doc) {
};
-
// initialize dynamic properties
this.doc = doc;
this.packages = this.getInstalledPackages();
if ("commentStrings" in config.gJSONData) {
this.commentStrings = config.gJSONData.commentStrings;
}
+
if ("constantData" in config.gJSONData) {
this.constantData = config.gJSONData.constantData;
}
@@ -637,10 +771,11 @@ function BZPage(doc) {
if ("submitsLogging" in config.gJSONData.configData &&
config.gJSONData.configData.submitsLogging) {
- this.setUpLoggingButtons();
+ this.log = config.logger;
+ this.setUpLogging();
}
-
- this.bugNo = this.getBugNo(this.doc.location.toString());
+
+ this.bugNo = hlpr.getBugNo(this.doc.location.toString());
this.reporter = this.getReporter();
this.product = this.getOptionValue("product");
this.component = this.getOptionValue("component");
@@ -956,22 +1091,6 @@ BZPage.prototype.generateButtons = function() {
}
};
-BZPage.prototype.getBugNo = function(url) {
- // FIXME Why not to parse URL?
-// let bugNoTitle = this.doc.querySelector("#title > p").textContent.trim();
-// console.log("bugNoTitle = " + bugNoTitle);
-// this.bugNo = this.getBugNo(this.doc.location.toString());
-// https://bugzilla.redhat.com/show_bug.cgi?id=583826
- let re = new RegExp(".*id=([0-9]+).*$");
- let bugNo = null;
- let reResult = re.exec(url);
- if (reResult[1]) {
- bugNo = reResult[1];
- console.log("this.bugNo = " + bugNo);
- }
- return bugNo;
-};
-
/**
* Get the current email of the reporter of the bug.
*
@@ -1067,21 +1186,6 @@ BZPage.prototype.clickMouse = function(targetID) {
};
/**
- * format date to be in ISO format (just day part)
- *
- * @param date
- * @return string with the formatted date
- */
-BZPage.prototype.getISODate = function (dateStr) {
- function pad(n) {
- return n < 10 ? '0' + n : n;
- }
- let date = new Date(dateStr);
- return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-'
- + pad(date.getDate());
-};
-
-/**
* select element of the array where regexp in the first element matches second
* parameter of this function
*
@@ -1283,8 +1387,8 @@ BZPage.prototype.getPassword = function() {
/**
*
*/
-BZPage.prototype.setUpLoggingButtons = function() {
- console.log("LOgging setUpLoggingButtons");
+BZPage.prototype.setUpLogging = function() {
+ console.log("Logging setUpLogging");
// For adding additional buttons to the top toolbar
let additionalButtons = this.doc.querySelector("#bugzilla-body *.related_actions");
let that = this;
@@ -1292,7 +1396,7 @@ BZPage.prototype.setUpLoggingButtons = function() {
// logging all submits for timesheet
this.doc.forms.namedItem("changeform").addEventListener("submit",
function(evt) {
- if (that.addLogRecord() === null) {
+ if (that.log.addLogRecord(that) == null) {
// FIXME doesn't work ... still submitting'
evt.stopPropagation();
evt.preventDefault();
@@ -1318,23 +1422,23 @@ BZPage.prototype.setUpLoggingButtons = function() {
additionalButtons.appendChild(clearLogsUI);
let clearLogAElem = this.doc.getElementById("clearLogs");
clearLogAElem.addEventListener("click", function() {
- myStorage.logs = {};
+ that.log.store = {};
jetpack.storage.simple.sync();
- this.style.color = that.EmptyLogsColor;
- clearLogAElem.style.fontWeight = "normal";
- console.log("mystorage.logs wiped out!");
+ this.style.color = that.log.EmptyLogsColor;
+ this.style.fontWeight = "normal";
+ console.log("this.store wiped out!");
}, false);
- if (!myStorage.logs) {
- console.log("No myStorage.logs defined!");
- myStorage.logs = {};
+ if (!this.store) {
+ console.log("No this.store defined!");
+ this.store = {};
}
- if (myStorage.logs) {
- clearLogAElem.style.color = this.FullLogsColor;
+ if (this.log.store.length > 0) {
+ clearLogAElem.style.color = this.log.FullLogsColor;
clearLogAElem.style.fontWeight = "bolder";
} else {
- clearLogAElem.style.color = this.EmptyLogsColor;
+ clearLogAElem.style.color = this.log.EmptyLogsColor;
clearLogAElem.style.fontWeight = "normal";
}
};
@@ -1409,10 +1513,12 @@ RHBugzillaPage = function(doc) {
// Prepare for query buttons
// FIXME getting null for commentArea sometimes
let commentArea = doc.getElementById("comment_status_commit");
- let brElementPlacer = commentArea.getElementsByTagName("br")[0];
- brElementPlacer.setAttribute("id","brElementPlacer_location");
- brElementPlacer.parentNode.insertBefore(doc.createElement("br"),
- brElementPlacer);
+ if (commentArea) {
+ let brElementPlacer = commentArea.getElementsByTagName("br")[0];
+ brElementPlacer.setAttribute("id","brElementPlacer_location");
+ brElementPlacer.parentNode.insertBefore(doc.createElement("br"),
+ brElementPlacer);
+ }
// inheritance ... call superobject's constructor
BZPage.call(this,doc);
@@ -1482,10 +1588,6 @@ RHBugzillaPage = function(doc) {
this.fillInChipMagic();
}
}
-
- if (logSubmits) {
- this.setUpLoggingButtons();
- }
} // END OF RHBugzillaPage CONSTRUCTOR
RHBugzillaPage.prototype = hlpr.heir(BZPage);
@@ -2504,84 +2606,9 @@ RHBugzillaPage.prototype.parseBacktrace = function(ret) {
return outStr;
};
-// FIXME we should store whole URL, not just ID (to cooperate with other bugzillas)
-// General rule: there is nothing special about bugzilla.redhat.com, so for example
-// constantData.bugzillalabelNames should be made non-RH-centric
-// and getBugzillaName should work everywhere same (even on bugzilla.mozilla.org,
-// if that makes sense?)
-RHBugzillaPage.prototype.addLogRecord = function() {
- let rec = {};
- rec.date = new Date();
- rec.url = this.doc.location.toString();
- rec.title = this.title;
- let comment = jetpack.tabs.focused.contentWindow.prompt(
- "Enter comments for this comment").trim();
- if (comment.length > 0) {
- rec.comment = comment;
- let recKey = this.getISODate(rec.date) + "+" + rec.bugId;
- let clearLogAElem = this.doc.getElementById("clearLogs");
- clearLogAElem.style.color = this.FullLogsColor;
- clearLogAElem.style.fontWeight = "bolder";
- if (myStorage.logs[recKey]) {
- myStorage.logs[recKey].comment += "<br/>\n" + comment;
- } else {
- myStorage.logs[recKey] = rec;
- }
- jetpack.storage.simple.sync();
- } else if (comment === null) {
- return null;
- }
-};
-
-RHBugzillaPage.prototype.timeSheetRecordsPrinter = function(body, records) {
- let that = this;
- // sort the records into temporary array
- let tmpArr = [];
-
- for ( let i in records) {
- if (records.hasOwnProperty(i)) {
- tmpArr.push( [ i, records[i] ]);
- }
- }
- tmpArr.sort(function(a, b) {
- return a[0] > b[0] ? 1 : -1;
- });
-
- let currentDay = "";
- // now print the array
- tmpArr
- .forEach(function(rec) {
- let x = rec[1];
- let dayStr = that.getISODate(x.date);
- if (dayStr != currentDay) {
- currentDay = dayStr;
- body.innerHTML += "<hr/><p><strong>" + currentDay
- + "</strong></p>";
- }
- body.innerHTML += "<p><em><a href='https://bugzilla.redhat.com/show_bug.cgi?id="
- + x.bugId
- + "'>Bug "
- + x.title
- + "</a>"
- + " </em>\n<br/>" + x.comment + "</p>";
- });
-};
-
-RHBugzillaPage.prototype.generateTimeSheet = function(body) {
- let doc = body.ownerDocument;
- this.timeSheetRecordsPrinter(body, myStorage.logs);
-};
// /////////////////////////////////////////////////////////////////////////////
-let callback = function(doc) {
- if (config.gJSONData.configData.objectStyle = "RH") {
- let curPage = new RHBugzillaPage(doc);
- } else if (config.gJSONData.configData.objectStyle = "MoFo") {
- let curPage = new MozillaBugzilla(doc);
- }
-};
-
let config = {};
config.matches = [
"https://bugzilla.redhat.com/show_bug.cgi",
@@ -2603,5 +2630,17 @@ hlpr.loadJSON(jetpack.storage.settings.JSONURL, function(parsedData) {
config.PCI_ID_Array = response;
});
}
+
+ config.logger = new Logger(myStorage.logs,
+ config.gJSONData.constantData.bugzillalabelAbbreviations);
+
+ let callback = function(doc) {
+ if (config.gJSONData.configData.objectStyle = "RH") {
+ let curPage = new RHBugzillaPage(doc);
+ } else if (config.gJSONData.configData.objectStyle = "MoFo") {
+ let curPage = new MozillaBugzilla(doc);
+ }
+ };
+
+ jetpack.pageMods.add(callback, config);
}, this);
-jetpack.pageMods.add(callback, config);