You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

104 lines
2.8 KiB

const {Octokit} = require('@octokit/rest');
const request = require('superagent');
const {default: PQueue} = require('p-queue');
async function getGithubRepositories(username, token) {
const octokit = new Octokit({
auth: token || null,
});
return octokit.paginate('GET /users/:username/repos', { username: username })
.then(repositories => toRepositoryList(repositories));
}
function toRepositoryList(repositories) {
return repositories.map(repository => {
return { name: repository.name, url: repository.clone_url }
});
}
async function getGiteaUser(gitea) {
return request.get(gitea.url
+ '/api/v1/user')
.query(`access_token=${gitea.token}`)
.then(response => {
return { id: response.body.id, name: response.body.username }
});
}
function isAlreadyMirroredOnGitea(repository, gitea, giteaUser) {
const requestUrl = `${gitea.url}/api/v1/repos/${giteaUser.name}/${repository}`;
return request.get(
requestUrl)
.query(`access_token=${gitea.token}`)
.then(() => true)
.catch(() => false);
}
function mirrorOnGitea(repository, gitea, giteaUser) {
request.post(`${gitea.url}/api/v1/repos/migrate`)
.query(`access_token=${gitea.token}`)
.send({
clone_addr: repository.url,
mirror: true,
repo_name: repository.name,
uid: giteaUser.id,
})
.then(() => {
console.log('Did it!');
})
.catch(err => {
console.log('Failed', err);
});
}
async function mirror(repository, gitea, giteaUser) {
if (await isAlreadyMirroredOnGitea(repository.name,
gitea,
giteaUser)) {
console.log('Repository is already mirrored; doing nothing: ', repository.name);
return;
}
console.log('Mirroring repository to gitea: ', repository.name);
await mirrorOnGitea(repository, gitea, giteaUser);
}
async function main() {
const githubUsername = process.env.GITHUB_USERNAME;
if (!githubUsername) {
console.error('No GITHUB_USERNAME specified, please specify! Exiting..');
return;
}
const githubToken = process.env.GITHUB_TOKEN;
const giteaUrl = process.env.GITEA_URL;
if (!giteaUrl) {
console.error('No GITEA_URL specified, please specify! Exiting..');
return;
}
const giteaToken = process.env.GITEA_TOKEN;
if (!giteaToken) {
console.error('No GITEA_TOKEN specified, please specify! Exiting..');
return;
}
const githubRepositories = await getGithubRepositories(githubUsername, githubToken);
console.log(`Found ${githubRepositories.length} repositories on github`);
const gitea = {
url: giteaUrl,
token: giteaToken,
};
const giteaUser = await getGiteaUser(gitea);
const queue = new PQueue({ concurrency: 4 });
await queue.addAll(githubRepositories.map(repository => {
return async () => {
await mirror(repository, gitea, giteaUser);
};
}));
}
main();