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