'use strict'; const fs = require('fs'), rp = require('request-promise-native'); const sourceDir = process.argv[2], sourceRepo = process.argv[3], destUrl = process.argv[4], destRepo = process.argv[5], actions = process.argv[6]; process.chdir(sourceDir); let Users = [], IssuesAndPRs = []; fs.readdirSync('.').forEach(filename => { if (/^issues_\d*\.json$/.test(filename)) readIssues(filename); else if (/^pull_requests_\d*\.json$/.test(filename)) readIssues(filename); if (/^users_\d*\.json$/.test(filename)) readUsers(filename); }); function readIssues (filename) { IssuesAndPRs.push.apply(IssuesAndPRs, JSON.parse(fs.readFileSync(filename, 'utf8'))); } function readUsers (filename) { Users.push.apply(Users, JSON.parse(fs.readFileSync(filename, 'utf8'))); } IssuesAndPRs = IssuesAndPRs .filter(each => each.repository.slice(-sourceRepo.length) === sourceRepo) .sort((a, b) => +a.url.split('/').pop() - +b.url.split('/').pop()); function createIssue (issue) { const user = userByUrl(issue.user), username = user && user.name || `${user ? user.login : "???"}@github`; return rp .post(`${destUrl}/api/v1/repos/${destRepo}/issues`, { json: true, resolveWithFullResponse: true, body: { title: issue.title, body: `Originally at ${issue.created_at} by ${username}${issue.closed_at ? ` closed at ${issue.closed_at}` : ""}${issue.type === "pull_request" ? " (pull request)" : ""}\r\n\r\n${issue.body}`, // closed: !!issue.closed_at, labels: [] //issue.labels.map(each => each.split('/').pop()) } }) .catch(err => { console.error(err); }) .then(res => { console.log(issue.title); if (res) console.log(res.statusCode); }); } function setCloseIssue (issue) { const index = issue.url.split('/').pop(); if (issue.closed_at) return rp .patch(`${destUrl}/api/v1/repos/${destRepo}/issues/${index}`, { json: true, resolveWithFullResponse: true, body: { state: "closed" } }) .catch(err => { console.error(err); }) .then(res => { console.log(issue.title); if (res) console.log(res.statusCode); }); } function processIssue (issues) { const issue = issues.shift(); if (!issue) return Promise.resolve(); return Promise.resolve() .then(() => /\bcreate\b/.test(actions) && createIssue(issue)) .then(() => /\bsetclose\b/.test(actions) && setCloseIssue(issue)) .then(() => processIssue(issues)); } processIssue(IssuesAndPRs.slice()) .then(() => { console.log(`${IssuesAndPRs.length} issues processed.`); setTimeout(() => null, 600); }); function userByUrl (url) { return Users.filter(each => each.url === url)[0]; }