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