gh2gogs.js 2.9 KB

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