refactor: uses getOpenPrs to get PRs

This commit is contained in:
Randell Dawson
2018-11-08 02:49:16 -08:00
parent 4da65f1946
commit 8acddacca1
2 changed files with 90 additions and 68 deletions

View File

@ -1,75 +1,88 @@
require('dotenv').config(); require('dotenv').config();
const { owner, repo, fccBaseUrl, prBaseUrl } = require('./constants'); const { owner, repo, fccBaseUrl, prBaseUrl } = require('./constants');
const fs = require('fs'); const fs = require('fs');
const formatDate = require('date-fns/format');
const { saveToFile, openJSONFile } = require('./fileFunctions');
const { octokitConfig, octokitAuth } = require('./octokitConfig'); const { octokitConfig, octokitAuth } = require('./octokitConfig');
const octokit = require('@octokit/rest')(octokitConfig); const octokit = require('@octokit/rest')(octokitConfig);
const { paginate } = require('./paginate'); const { getOpenPrs, getPrRange } = require('./getOpenPrs');
const { saveToFile, writeToFile } = './fileFunctions';
const fetch = require('node-fetch'); const fetch = require('node-fetch');
const { getStatuses } = require('./getStatuses'); const { getStatuses } = require('./getStatuses');
octokit.authenticate(octokitAuth); octokit.authenticate(octokitAuth);
const findFailures = async (errorsToFind, maxPrs) => { //const { PrProcessingLog } = require('./prProcessingLog');
const methodProps = { //const log = new PrProcessingLog();
owner, repo,
state: 'open', base: 'master', sort: 'created',
direction: 'asc', page: 1, per_page: 100
};
if (maxPRs) {
maxPages = Math.ceil(maxPrs / 100); // limits
}
const allOpenPRs = await paginate(octokit.pullRequests.getAll, methodProps, octokit, maxPages); const prPropsToGet = ['number', 'head'];
const failedPRs = allOpenPRs.reduce(async (prevPromise, { number: pr, head: { sha: ref }) => { const errorsToFind = require('./failuresToFind.json');
const failed = await prevPromise;
const statuses = await getStatuses(octokit.repos.getStatuses, {owner, repo, ref}); (async () => {
if (statuses.length) { const { firstPR, lastPR } = await getPrRange();
const { state, target_url } = statuses[0]; // first element contain most recent status const { openPRs } = await getOpenPrs(firstPR, lastPR, prPropsToGet);
const hasProblem = state === 'failure' || state === 'error';
if (hasProblem) { if (openPRs.length) {
let buildNum = Number(target_url.match(/\/builds\/(\d+)\?/i)[1]); console.log(`# of PRs Retrieved: ${openPRs.length}`);
buildNum++; // full build log file is 1 # higher than buildNum (same as job number) console.log(`PR Range: ${firstPR} - ${lastPR}`);
const travisLogUrl = `https://api.travis-ci.org/v3/job/${buildNum}/log.txt`; const now = formatDate(new Date(), 'YYYY-MM-DDTHHmmss');
errorsToFind.forEach(async ({ errorDesc, errorRegex }) => { const fileName = `data/openprs_statuses_urls_${firstPR}-${lastPR}_${now}.json`;
const response = await fetch(travisLogUrl) saveToFile(fileName, JSON.stringify(openPRs));
const logText = await response.text(); console.log(`Data saved in file: ${fileName}`);
if (errorRegex.test(logText)) {
failed.push({ //log.start();
errorDesc, console.log('Starting error finding process...');
pr, let count = 0;
buildLog: buildNum const maxCount = openPRs.length;
}) const failed = [];
let interval = setInterval(async () => {
if (count < maxCount ) {
let { number, head: { sha: ref } } = openPRs[count];
const statuses = await getStatuses(octokit.repos.getStatuses, {owner, repo, ref});
//log.add(number)
if (statuses.length) {
const { state, target_url } = statuses[0]; // first element contain most recent status
const hasProblem = state === 'failure' || state === 'error';
if (hasProblem) {
let buildNum = Number(target_url.match(/\/builds\/(\d+)\?/i)[1]);
buildNum++; // full build log file is 1 # higher than buildNum (same as job number)
const travisLogUrl = `https://api.travis-ci.org/v3/job/${buildNum}/log.txt`;
console.log(number + '\'s errors:');
errorsToFind.forEach(async ({ error: errorDesc, regex }) => {
const response = await fetch(travisLogUrl)
const logText = await response.text();
regex = RegExp(regex);
if (regex.test(logText)) {
const error = {
errorDesc,
number,
buildLog: travisLogUrl
}
failed.push(error)
console.log(' ' + errorDesc);
}
console.log()
});
} }
}); }
} }
} else {
return failed; clearInterval(interval);
}, Promise.resolve([])); interval = null;
//log.export();
return failedPRs; }
}; if (count % 25 === 0) {
//log.export()
/* Main Program */ }
const [ n, f, inputFile, outputFile, maxPRs ] = process.argv; count++;
const inputFileMsg = 'Please specify an input file containing errors to find.\n'; }, 1000);
const outputFileMsg = 'Please specify an output file to save the results of the search.\n'; }
const maxPRMsg = 'Please specify an integer from 1-4500 (inclusive) for the max # of PR to search.'; })()
let errors = ''; .then(() => {
if (!inputFile) { errors += inputFileMsg } //log.finish();
if (!outputFile) { errors += outputFileMsg } console.log('Successfully finding all specified errors.');
if (!maxPRs || parseInt(maxPRs) < 1 || parseInt(maxPRs) > 4500) { })
errors += maxPRMsg; .catch(err => {
} //log.finish();
console.log(err)
if (errors) { return console.log(errors) } })
fs.readFile(inputFile, 'utf8', (err, errorsToFind) => {
if (err) { throw err }
findFailures(errorsToFind, maxPRs)
.then((failedPRs) => {
saveToFile(outputFile, JSON.stringify(failedPRs));
console.log(`# PRs matching specified error: ${failedPRs.length}`);
})
});

View File

@ -1,14 +1,23 @@
const prOpenClose = async () => { require('dotenv').config();
const result = await octokit.pullRequests.update({ owner, repo , number, state: 'closed', base }) const { owner, repo, fccBaseUrl, prBaseUrl } = require('./constants');
const { octokitConfig, octokitAuth } = require('./octokitConfig');
const octokit = require('@octokit/rest')(octokitConfig);
octokit.authenticate(octokitAuth);
const prOpenClose = async (number) => {
const result = await octokit.pullRequests.update({ owner, repo , number, state: 'closed', base: 'master' })
.then(() => { .then(() => {
return octokit.pullRequests.update({ owner, repo , number, state: 'open', base }) return octokit.pullRequests.update({ owner, repo , number, state: 'open', base: 'master' })
}) })
.then(() => { .then(() => {
log.update(true) console.log('success')
//log.update(true)
}) })
.catch(() => { .catch((err) => {
log.update(false) console.log('catch')
console.log(err)
//log.update(false)
}) })
}; };
exports.changePrState = changePrState; exports.prOpenClose = prOpenClose;