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