125 lines
3.9 KiB
JavaScript
125 lines
3.9 KiB
JavaScript
"use strict";
|
|
|
|
/* global module */
|
|
|
|
|
|
function getRateLimit(thunk) {
|
|
|
|
var url = "https://api.github.com/rate_limit";
|
|
try {
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function() {
|
|
if (request.readyState === request.DONE) {
|
|
var data = JSON.parse(request.responseText);
|
|
thunk(data);
|
|
}
|
|
};
|
|
request.onerror = function () {
|
|
print("pr-utils.js -- getPRDetails failed: " + request.statusText);
|
|
};
|
|
request.ontimeout = function () {
|
|
print("pr-utils.js -- getPRDetails timed-out: " + request.statusText);
|
|
};
|
|
request.setRequestHeader("Accept", "application/vnd.github.antiope-preview+json");
|
|
request.setRequestHeader("User-Agent", "High-Fidelity-PR-Watcher");
|
|
request.open("GET", url, true);
|
|
request.timeout = 20000;
|
|
request.send();
|
|
} catch (err) {
|
|
print("pr-utils.js -- error loading " + url);
|
|
}
|
|
}
|
|
|
|
|
|
function cachingGithubAPIRequest(url, dataCache, thunk) {
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function() {
|
|
if (request.readyState === request.DONE) {
|
|
if (request.status === 200) {
|
|
var etag = request.getResponseHeader("ETag");
|
|
dataCache[url] = { etag: etag, data: request.responseText }; // save in cache
|
|
thunk(JSON.parse(request.responseText));
|
|
} else if (request.status == 304) {
|
|
thunk(JSON.parse(dataCache[url].data)); // get from cache
|
|
} else {
|
|
print("pr-utils.js -- cachingGithubAPIRequest failed: " +
|
|
request.status + " " + request.statusText + ", " + url);
|
|
}
|
|
}
|
|
};
|
|
|
|
request.setRequestHeader("Accept", "application/vnd.github.antiope-preview+json");
|
|
request.setRequestHeader("User-Agent", "High-Fidelity-PR-Watcher");
|
|
|
|
if (dataCache[url]) {
|
|
var prevEtag = dataCache[url].etag;
|
|
request.setRequestHeader("If-None-Match", prevEtag);
|
|
}
|
|
|
|
request.onerror = function () {
|
|
print("pr-utils.js -- cachingGithubAPIRequest failed: " + request.statusText);
|
|
thunk(null);
|
|
};
|
|
request.ontimeout = function () {
|
|
print("pr-utils.js -- cachingGithubAPIRequest timed-out: " + request.statusText);
|
|
thunk(null);
|
|
};
|
|
request.open("GET", url);
|
|
request.timeout = 20000;
|
|
request.send();
|
|
}
|
|
|
|
|
|
function newestStatusPerContext(statusesResponse) {
|
|
// only keep the newest status for a given context
|
|
var checks = {};
|
|
for (var i = 0; i < statusesResponse.length; i++) {
|
|
var status = statusesResponse[i];
|
|
if (checks[status.context]) {
|
|
if (status.id > checks[status.context].id) {
|
|
checks[status.context] = status;
|
|
}
|
|
} else {
|
|
checks[status.context] = status;
|
|
}
|
|
}
|
|
|
|
var finalChecks = [];
|
|
for (var context in checks) {
|
|
if (checks.hasOwnProperty(context)) {
|
|
finalChecks.push(checks[context]);
|
|
}
|
|
}
|
|
|
|
return finalChecks;
|
|
}
|
|
|
|
|
|
function getLabelNames(detailsResponse) {
|
|
var labelNames = [];
|
|
detailsResponse.labels.forEach(function (label) {
|
|
labelNames.push(label.name);
|
|
});
|
|
return labelNames;
|
|
}
|
|
|
|
|
|
function getPRDetails(prNumber, dataCache, thunk) {
|
|
|
|
// getRateLimit();
|
|
|
|
var url = "https://api.github.com/repos/highfidelity/hifi/pulls/" + prNumber;
|
|
cachingGithubAPIRequest(url, dataCache, function (detailsResponse) {
|
|
detailsResponse.labelNames = getLabelNames(detailsResponse);
|
|
cachingGithubAPIRequest(detailsResponse.statuses_url, dataCache, function (statusesResponse) {
|
|
detailsResponse.statuses = newestStatusPerContext(statusesResponse);
|
|
thunk(detailsResponse);
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
getRateLimit: getRateLimit,
|
|
getPRDetails: getPRDetails
|
|
};
|