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