217 строки
5.4 KiB
JavaScript
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 + ",";
|
|
}
|
|
});
|
|
};
|
|
});
|