diff --git a/src/lib/gitea.ts b/src/lib/gitea.ts index 416a225..f7a1a92 100644 --- a/src/lib/gitea.ts +++ b/src/lib/gitea.ts @@ -1435,20 +1435,54 @@ export async function mirrorGitHubReleasesToGitea({ } ).catch(() => null); + const releaseNote = release.body || ""; + if (existingReleasesResponse) { - console.log(`[Releases] Release ${release.tag_name} already exists, skipping`); - skippedCount++; + // Update existing release if the changelog/body differs + const existingRelease = existingReleasesResponse.data; + const existingNote = existingRelease.body || ""; + + if (existingNote !== releaseNote || existingRelease.name !== (release.name || release.tag_name)) { + console.log(`[Releases] Updating existing release ${release.tag_name} with new changelog/title`); + + await httpPut( + `${config.giteaConfig.url}/api/v1/repos/${repoOwner}/${repository.name}/releases/${existingRelease.id}`, + { + tag_name: release.tag_name, + target: release.target_commitish, + title: release.name || release.tag_name, + body: releaseNote, + draft: release.draft, + prerelease: release.prerelease, + }, + { + Authorization: `token ${decryptedConfig.giteaConfig.token}`, + } + ); + + if (releaseNote) { + console.log(`[Releases] Updated changelog for ${release.tag_name} (${releaseNote.length} characters)`); + } + mirroredCount++; + } else { + console.log(`[Releases] Release ${release.tag_name} already up-to-date, skipping`); + skippedCount++; + } continue; } - // Create the release + // Create new release with changelog/body content + if (releaseNote) { + console.log(`[Releases] Including changelog for ${release.tag_name} (${releaseNote.length} characters)`); + } + const createReleaseResponse = await httpPost( `${config.giteaConfig.url}/api/v1/repos/${repoOwner}/${repository.name}/releases`, { tag_name: release.tag_name, target: release.target_commitish, title: release.name || release.tag_name, - note: release.body || "", + body: releaseNote, draft: release.draft, prerelease: release.prerelease, }, @@ -1507,13 +1541,14 @@ export async function mirrorGitHubReleasesToGitea({ } mirroredCount++; - console.log(`[Releases] Successfully mirrored release: ${release.tag_name}`); + const noteInfo = releaseNote ? ` with ${releaseNote.length} character changelog` : " without changelog"; + console.log(`[Releases] Successfully mirrored release: ${release.tag_name}${noteInfo}`); } catch (error) { console.error(`[Releases] Failed to mirror release ${release.tag_name}: ${error instanceof Error ? error.message : String(error)}`); } } - console.log(`✅ Mirrored ${mirroredCount} new releases to Gitea (${skippedCount} already existed)`); + console.log(`✅ Mirrored/Updated ${mirroredCount} releases to Gitea (${skippedCount} already up-to-date)`); } export async function mirrorGitRepoPullRequestsToGitea({ diff --git a/src/lib/scheduler-service.ts b/src/lib/scheduler-service.ts index 563a54e..2d5ff18 100644 --- a/src/lib/scheduler-service.ts +++ b/src/lib/scheduler-service.ts @@ -41,6 +41,12 @@ async function runScheduledSync(config: any): Promise { console.log(`[Scheduler] Running scheduled sync for user ${userId}`); try { + // Check if tokens are configured before proceeding + if (!config.githubConfig?.token || !config.giteaConfig?.token) { + console.log(`[Scheduler] Skipping sync for user ${userId}: GitHub or Gitea tokens not configured`); + return; + } + // Update lastRun timestamp const currentTime = new Date(); const scheduleConfig = config.scheduleConfig || {}; @@ -307,25 +313,41 @@ async function schedulerLoop(): Promise { config.scheduleConfig?.enabled === true ); - if (enabledConfigs.length === 0) { - console.log(`[Scheduler] No configurations with scheduling enabled (found ${activeConfigs.length} active configs)`); + // Further filter configs that have valid tokens + const validConfigs = enabledConfigs.filter(config => { + const hasGitHubToken = !!config.githubConfig?.token; + const hasGiteaToken = !!config.giteaConfig?.token; - // Show details about why configs are not enabled - activeConfigs.forEach(config => { - const scheduleEnabled = config.scheduleConfig?.enabled; - const mirrorInterval = config.giteaConfig?.mirrorInterval; - console.log(`[Scheduler] User ${config.userId}: scheduleEnabled=${scheduleEnabled}, mirrorInterval=${mirrorInterval}`); - }); + if (!hasGitHubToken || !hasGiteaToken) { + console.log(`[Scheduler] User ${config.userId}: Scheduling enabled but tokens missing (GitHub: ${hasGitHubToken}, Gitea: ${hasGiteaToken})`); + return false; + } + return true; + }); + + if (validConfigs.length === 0) { + if (enabledConfigs.length > 0) { + console.log(`[Scheduler] ${enabledConfigs.length} config(s) have scheduling enabled but lack required tokens`); + } else { + console.log(`[Scheduler] No configurations with scheduling enabled (found ${activeConfigs.length} active configs)`); + + // Show details about why configs are not enabled + activeConfigs.forEach(config => { + const scheduleEnabled = config.scheduleConfig?.enabled; + const mirrorInterval = config.giteaConfig?.mirrorInterval; + console.log(`[Scheduler] User ${config.userId}: scheduleEnabled=${scheduleEnabled}, mirrorInterval=${mirrorInterval}`); + }); + } return; } - console.log(`[Scheduler] Processing ${enabledConfigs.length} configurations with scheduling enabled (out of ${activeConfigs.length} total active configs)`); + console.log(`[Scheduler] Processing ${validConfigs.length} valid configurations (out of ${enabledConfigs.length} with scheduling enabled)`); // Check each configuration to see if it's time to run const currentTime = new Date(); - for (const config of enabledConfigs) { + for (const config of validConfigs) { const scheduleConfig = config.scheduleConfig || {}; // Check if it's time to run based on nextRun