stab-crashes/common_landings.js

217 строки
5.4 KiB
JavaScript

let onLoad = new Promise(function (resolve, reject) {
window.onload = resolve;
});
function dropdownDateToDaysDiff(val) {
if (val === "one day") {
return 1;
} else if (val === "two days") {
return 2;
} else if (val === "three days") {
return 3;
} else if (val === "a week") {
return 7;
}
throw new Exception("Unknown value " + val);
}
function dropdownBuildToVal(val) {
if (val === "one build") {
return 1;
} else if (val === "two builds") {
return 2;
} else if (val === "three builds") {
return 3;
}
throw new Exception("Unknown value " + val);
}
function betaBuildToTag(val) {
return "FIREFOX_" + val.replace(".", "_") + "_RELEASE";
}
function subtractFromBetaBuild(version, val) {
let major = version.substring(0, version.indexOf("b"));
let betaBuild = version.substring(version.indexOf("b") + 1);
return major + "b" + (Number(betaBuild) - val);
}
function checkIsBuildID(val) {
let isBuildID = true;
try {
let res = parseBuildID(val);
if (
isNaN(res.year) ||
isNaN(res.month) ||
isNaN(res.day) ||
isNaN(res.hour) ||
isNaN(res.minute) ||
isNaN(res.second) ||
res.year < 2000 ||
res.month < 0 ||
res.month > 12 ||
res.day < 0 ||
res.day > 31 ||
res.hour < 0 ||
res.hour > 24
) {
isBuildID = false;
}
} catch (ex) {
isBuildID = false;
}
return isBuildID;
}
function getPushlogLink(channel) {
let base;
if (channel === "nightly") {
base = "https://hg.mozilla.org/mozilla-central";
}
let firstAffected = document.getElementById(channel + "_first_affected")
.value;
if (firstAffected) {
let isBuildID = checkIsBuildID(firstAffected);
let startDateElem = document.getElementById(channel + "_days");
let startDate = dropdownDateToDaysDiff(
startDateElem.options[startDateElem.selectedIndex].value
);
let pushlogLinkElem = document.getElementById(channel + "_pushloglink");
return new Promise(function (resolve, reject) {
if (!isBuildID) {
resolve(firstAffected);
} else {
fromBuildIDtoChangeset(firstAffected, channel).then((changesetURL) =>
resolve(getRevFromChangeset(changesetURL, channel))
);
}
}).then((changeset) =>
getChangesetDate(changeset, channel).then((date) => {
date.setDate(date.getDate() - startDate);
let year = date.getFullYear();
let month = toTwoDigits(date.getMonth() + 1);
let day = toTwoDigits(date.getDate());
let pushlogLink =
base +
"/pushloghtml?startdate=" +
year +
"-" +
month +
"-" +
day +
"&tochange=" +
changeset;
pushlogLinkElem.textContent = pushlogLinkElem.href = pushlogLink;
return pushlogLink;
})
);
}
return null;
}
function getCommonLandings() {
let pushlog_link_promises = [];
// Nightly
let nightlyPushlogLink = getPushlogLink("nightly");
if (nightlyPushlogLink) {
pushlog_link_promises.push(nightlyPushlogLink);
}
// Beta
let betaFirstAffected = document.getElementById("beta_first_affected").value;
if (betaFirstAffected) {
let betaStartBuildElem = document.getElementById("beta_builds");
let betaStartBuild = subtractFromBetaBuild(
betaFirstAffected,
dropdownBuildToVal(
betaStartBuildElem.options[betaStartBuildElem.selectedIndex].value
)
);
let betaPushlogLink =
"https://hg.mozilla.org/releases/mozilla-beta/pushloghtml?fromchange=" +
betaBuildToTag(betaStartBuild) +
"&tochange=" +
betaBuildToTag(betaFirstAffected);
let betaPushlogLinkElem = document.getElementById("beta_pushloglink");
betaPushlogLinkElem.textContent = betaPushlogLinkElem.href = betaPushlogLink;
pushlog_link_promises.push(Promise.resolve(betaPushlogLink));
}
return Promise.all(
pushlog_link_promises.map((link_promise) =>
link_promise.then((link) =>
fetch(link)
.then((response) => response.text())
.then((html) => {
let bugs = [];
let result;
let re = /Bug ([0-9]+)/gi;
while ((result = re.exec(html)) !== null) {
bugs.push(result[1]);
}
return bugs;
})
)
)
)
.then((arrays) => {
if (arrays.length === 0) {
return [];
}
return arrays[0].filter((elem) => {
let is_everywhere = true;
for (let array of arrays.slice(1)) {
is_everywhere &= array.includes(elem);
}
return is_everywhere;
});
})
.then((bugs) => new Set(bugs));
}
onLoad.then(function () {
document.getElementById("getCommonLandings").onclick = function () {
// Clean old results.
let results = document.getElementById("results");
while (results.firstChild) {
results.removeChild(results.firstChild);
}
results.textContent = "";
getCommonLandings().then((bugs) => {
if (bugs.size === 0) {
results.textContent = "None";
return;
}
let a = document.createElement("a");
a.textContent = "List of common landings on Bugzilla";
a.href = "https://bugzilla.mozilla.org/buglist.cgi?bug_id=";
a.id = "buglist";
results.appendChild(a);
for (let bug of bugs) {
let a = document.getElementById("buglist");
a.href += bug + ",";
}
});
};
});