mirror of
https://github.com/multipleof4/gitea-github-cron.git
synced 2026-10-08 21:35:21 +00:00
Sync GitHub organization avatars to Gitea
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
const syncOrgAvatar = require('./sync-org-avatar');
|
||||||
const { GH_PAT, GITEA_TOKEN, GITEA_URL } = process.env;
|
const { GH_PAT, GITEA_TOKEN, GITEA_URL } = process.env;
|
||||||
const G_API = `https://${GITEA_URL.replace(/^https?:\/\//, '')}/api/v1`;
|
const G_API = `https://${GITEA_URL.replace(/^https?:\/\//, '')}/api/v1`;
|
||||||
const headers = {
|
const headers = {
|
||||||
@@ -41,6 +42,7 @@ const getPages = async (url) => {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
let allRepos = [...ghUserRepos];
|
let allRepos = [...ghUserRepos];
|
||||||
|
let avatarFailures = 0;
|
||||||
|
|
||||||
for (const org of ghOrgs) {
|
for (const org of ghOrgs) {
|
||||||
console.log(`Checking Org: ${org.login}`);
|
console.log(`Checking Org: ${org.login}`);
|
||||||
@@ -54,6 +56,13 @@ const getPages = async (url) => {
|
|||||||
await req(`${G_API}/orgs/${org.login}`, headers.GT, 'PATCH', { visibility: 'public' });
|
await req(`${G_API}/orgs/${org.login}`, headers.GT, 'PATCH', { visibility: 'public' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (await syncOrgAvatar(org, G_API, headers.GT)) console.log(`Updated Org Avatar: ${org.login}`);
|
||||||
|
} catch (e) {
|
||||||
|
avatarFailures++;
|
||||||
|
console.error(`Failed to sync avatar for ${org.login}:`, e.message);
|
||||||
|
}
|
||||||
|
|
||||||
const orgRepos = await getPages(`https://api.github.com/orgs/${org.login}/repos?type=all`);
|
const orgRepos = await getPages(`https://api.github.com/orgs/${org.login}/repos?type=all`);
|
||||||
allRepos.push(...orgRepos);
|
allRepos.push(...orgRepos);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -96,6 +105,10 @@ const getPages = async (url) => {
|
|||||||
console.error(`Failed to mirror ${r.owner.login}/${r.name}:`, e.message);
|
console.error(`Failed to mirror ${r.owner.login}/${r.name}:`, e.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (avatarFailures) {
|
||||||
|
console.error(`Failed to sync ${avatarFailures} organization avatar(s).`);
|
||||||
|
process.exitCode = 1;
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Fatal Error:', err);
|
console.error('Fatal Error:', err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
const syncOrgAvatar = async (org, giteaApi, headers) => {
|
||||||
|
if (!org.avatar_url) return false;
|
||||||
|
|
||||||
|
const avatar = await fetch(org.avatar_url, { signal: AbortSignal.timeout(30_000) });
|
||||||
|
if (!avatar.ok) throw new Error(`GitHub avatar download failed: ${avatar.status}`);
|
||||||
|
|
||||||
|
const image = Buffer.from(await avatar.arrayBuffer());
|
||||||
|
if (!image.length) throw new Error('GitHub avatar is empty');
|
||||||
|
|
||||||
|
const upload = await fetch(`${giteaApi}/orgs/${encodeURIComponent(org.login)}/avatar`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers,
|
||||||
|
body: JSON.stringify({ image: image.toString('base64') }),
|
||||||
|
signal: AbortSignal.timeout(30_000)
|
||||||
|
});
|
||||||
|
if (!upload.ok) throw new Error(`Gitea avatar upload failed: ${upload.status} ${await upload.text()}`);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = syncOrgAvatar;
|
||||||
Reference in New Issue
Block a user