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.

102 lines
2.7 KiB

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