You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.8 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. const {Octokit} = require('@octokit/rest');
  2. const request = require('superagent');
  3. const {default: PQueue} = require('p-queue');
  4. async function getGithubRepositories(username, token) {
  5. const octokit = new Octokit({
  6. auth: token || null,
  7. });
  8. return octokit.paginate('GET /users/:username/repos', { username: username })
  9. .then(repositories => toRepositoryList(repositories));
  10. }
  11. function toRepositoryList(repositories) {
  12. return repositories.map(repository => {
  13. return { name: repository.name, url: repository.clone_url }
  14. });
  15. }
  16. async function getGiteaUser(gitea) {
  17. return request.get(gitea.url
  18. + '/api/v1/user')
  19. .query(`access_token=${gitea.token}`)
  20. .then(response => {
  21. return { id: response.body.id, name: response.body.username }
  22. });
  23. }
  24. function isAlreadyMirroredOnGitea(repository, gitea, giteaUser) {
  25. const requestUrl = `${gitea.url}/api/v1/repos/${giteaUser.name}/${repository}`;
  26. return request.get(
  27. requestUrl)
  28. .query(`access_token=${gitea.token}`)
  29. .then(() => true)
  30. .catch(() => false);
  31. }
  32. function mirrorOnGitea(repository, gitea, giteaUser) {
  33. request.post(`${gitea.url}/api/v1/repos/migrate`)
  34. .query(`access_token=${gitea.token}`)
  35. .send({
  36. clone_addr: repository.url,
  37. mirror: true,
  38. repo_name: repository.name,
  39. uid: giteaUser.id,
  40. })
  41. .then(() => {
  42. console.log('Did it!');
  43. })
  44. .catch(err => {
  45. console.log('Failed', err);
  46. });
  47. }
  48. async function mirror(repository, gitea, giteaUser) {
  49. if (await isAlreadyMirroredOnGitea(repository.name,
  50. gitea,
  51. giteaUser)) {
  52. console.log('Repository is already mirrored; doing nothing: ', repository.name);
  53. return;
  54. }
  55. console.log('Mirroring repository to gitea: ', repository.name);
  56. await mirrorOnGitea(repository, gitea, giteaUser);
  57. }
  58. async function main() {
  59. const githubUsername = process.env.GITHUB_USERNAME;
  60. if (!githubUsername) {
  61. console.error('No GITHUB_USERNAME specified, please specify! Exiting..');
  62. return;
  63. }
  64. const githubToken = process.env.GITHUB_TOKEN;
  65. const giteaUrl = process.env.GITEA_URL;
  66. if (!giteaUrl) {
  67. console.error('No GITEA_URL specified, please specify! Exiting..');
  68. return;
  69. }
  70. const giteaToken = process.env.GITEA_TOKEN;
  71. if (!giteaToken) {
  72. console.error('No GITEA_TOKEN specified, please specify! Exiting..');
  73. return;
  74. }
  75. const githubRepositories = await getGithubRepositories(githubUsername, githubToken);
  76. console.log(`Found ${githubRepositories.length} repositories on github`);
  77. const gitea = {
  78. url: giteaUrl,
  79. token: giteaToken,
  80. };
  81. const giteaUser = await getGiteaUser(gitea);
  82. const queue = new PQueue({ concurrency: 4 });
  83. await queue.addAll(githubRepositories.map(repository => {
  84. return async () => {
  85. await mirror(repository, gitea, giteaUser);
  86. };
  87. }));
  88. }
  89. main();