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