gh2gogs.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. 'use strict';
  2. const fs = require('fs'),
  3. rp = require('request-promise-native');
  4. const sourceDir = process.argv[2],
  5. sourceRepo = process.argv[3],
  6. destUrl = process.argv[4],
  7. destRepo = process.argv[5];
  8. process.chdir(sourceDir);
  9. let Users = [], IssuesAndPRs = [];
  10. fs.readdirSync('.').forEach(filename => {
  11. if (/^issues_\d*\.json$/.test(filename)) readIssues(filename);
  12. else if (/^pull_requests_\d*\.json$/.test(filename)) readIssues(filename);
  13. if (/^users_\d*\.json$/.test(filename)) readUsers(filename);
  14. });
  15. function readIssues (filename) {
  16. IssuesAndPRs.push.apply(IssuesAndPRs, JSON.parse(fs.readFileSync(filename, 'utf8')));
  17. }
  18. function readUsers (filename) {
  19. Users.push.apply(Users, JSON.parse(fs.readFileSync(filename, 'utf8')));
  20. }
  21. IssuesAndPRs = IssuesAndPRs
  22. .filter(each => each.repository.slice(-sourceRepo.length) === sourceRepo)
  23. .sort((a, b) => +a.url.split('/').pop() - +b.url.split('/').pop());
  24. function createIssue (issue) {
  25. const user = userByUrl(issue.user),
  26. username = user && user.name || `${user ? user.login : "???"}@github`;
  27. return rp
  28. .post(`${destUrl}/api/v1/repos/${destRepo}/issues`, {
  29. json: true,
  30. resolveWithFullResponse: true,
  31. body: {
  32. title: issue.title,
  33. 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}`,
  34. closed: !!issue.closed_at,
  35. labels: [] //issue.labels.map(each => each.split('/').pop())
  36. }
  37. })
  38. .catch(err => {
  39. console.error(err);
  40. })
  41. .then(res => {
  42. console.log(issue.title);
  43. if (res) console.log(res.statusCode);
  44. });
  45. }
  46. function processIssue (issues) {
  47. const issue = issues.shift();
  48. if (!issue) return Promise.resolve();
  49. return Promise.resolve()
  50. .then(() => createIssue(issue))
  51. .then(() => processIssue(issues));
  52. }
  53. processIssue(IssuesAndPRs.slice())
  54. .then(() => {
  55. console.log(`${IssuesAndPRs.length} issues processed.`);
  56. setTimeout(() => null, 600);
  57. });
  58. function userByUrl (url) {
  59. return Users.filter(each => each.url === url)[0];
  60. }