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();