gitea-sync/src/core.ts

59 lines
1.9 KiB
TypeScript
Raw Normal View History

2023-04-05 20:48:25 +02:00
import { listAllRepositories as giteaRepos, mirror, MirrorOptions, updateRepository } from './api/gitea.js'
2023-03-09 02:09:52 +01:00
import { listAllRepositories as githubRepos } from './api/github.js'
import { Config } from './config.js'
import { logger } from './logger.js'
let running = false
2024-01-27 01:26:37 +01:00
const l = logger.child({ context: 'runner' })
2023-03-09 02:09:52 +01:00
export async function sync() {
if (running) {
2024-01-27 01:26:37 +01:00
l.info('already running, skipping')
2023-03-09 02:09:52 +01:00
return
}
try {
2024-01-27 01:26:37 +01:00
l.info('starting sync')
2023-03-09 02:09:52 +01:00
const syncedRepos = await giteaRepos()
const toSync = await githubRepos()
2024-01-27 01:26:37 +01:00
l.debug('loaded repos', { remote: toSync.length, local: syncedRepos.length })
2023-03-09 02:09:52 +01:00
for (const repo of toSync) {
2024-01-27 01:26:37 +01:00
const lr = l.child({ repo: repo.name })
2023-03-09 02:09:52 +01:00
const sameName = syncedRepos.find((r) => r.name === repo.name || r.original_url === repo.clone_url)
if (sameName) {
if (sameName.original_url === repo.clone_url) {
2023-04-05 20:48:25 +02:00
if (sameName.private === repo.private) logger.info('Already synced, skipping', { name: repo.name })
else {
2024-01-27 01:26:37 +01:00
lr.info('visibility changed, updating')
2023-04-05 20:48:25 +02:00
const [owner, repository] = sameName.full_name.split('/')
await updateRepository(owner, repository, { private: repo.private })
}
2023-03-09 02:09:52 +01:00
} else {
2024-01-27 01:26:37 +01:00
lr.error('repo with same name but different url', {
2023-03-09 02:09:52 +01:00
url: repo.clone_url,
original_url: sameName.original_url,
})
}
continue
}
const options: MirrorOptions = {
repo_name: repo.name,
clone_addr: repo.clone_url,
private: repo.private,
auth_token: Config.github.token,
}
2024-01-27 01:26:37 +01:00
lr.info('mirroring repository', options)
2023-03-09 02:09:52 +01:00
await mirror(options)
2024-01-27 01:26:37 +01:00
lr.info('mirrored repository')
2023-03-09 02:09:52 +01:00
}
2024-01-27 01:26:37 +01:00
l.info('Finished sync')
2023-04-05 20:48:25 +02:00
} catch (error) {
2024-01-27 01:26:37 +01:00
l.debug(error)
l.error('Failed to sync', { error: error instanceof Error ? error.message : 'Unknown error' })
2023-03-09 02:09:52 +01:00
} finally {
running = false
}
}