11import { Api , giteaApi , HttpResponse , Repository as GiteaRepository } from 'gitea-js' ;
22import { GiteaConnectionConfig } from '@sourcebot/schemas/v3/gitea.type' ;
3- import { getTokenFromConfig , measure } from './utils.js' ;
3+ import { getTokenFromConfig , measure , fetchWithRetry } from './utils.js' ;
44import fetch from 'cross-fetch' ;
55import { createLogger } from './logger.js' ;
66import micromatch from 'micromatch' ;
77import { PrismaClient } from '@sourcebot/db' ;
8-
8+ import { FALLBACK_GITEA_TOKEN } from './environment.js' ;
99const logger = createLogger ( 'Gitea' ) ;
1010
1111export const getGiteaReposFromConfig = async ( config : GiteaConnectionConfig , orgId : number , db : PrismaClient ) => {
12- // TODO: pass in DB here to fetch secret properly
1312 const token = config . token ? await getTokenFromConfig ( config . token , orgId , db ) : undefined ;
1413
1514 const api = giteaApi ( config . url ?? 'https://gitea.com' , {
16- token,
15+ token : token ?? FALLBACK_GITEA_TOKEN ,
1716 customFetch : fetch ,
1817 } ) ;
1918
2019 let allRepos : GiteaRepository [ ] = [ ] ;
2120
2221 if ( config . orgs ) {
23- const _repos = await getReposForOrgs ( config . orgs , api ) ;
22+ const _repos = await fetchWithRetry (
23+ ( ) => getReposForOrgs ( config . orgs ! , api ) ,
24+ `orgs ${ config . orgs . join ( ', ' ) } ` ,
25+ logger
26+ ) ;
2427 allRepos = allRepos . concat ( _repos ) ;
2528 }
2629
2730 if ( config . repos ) {
28- const _repos = await getRepos ( config . repos , api ) ;
31+ const _repos = await fetchWithRetry (
32+ ( ) => getRepos ( config . repos ! , api ) ,
33+ `repos ${ config . repos . join ( ', ' ) } ` ,
34+ logger
35+ ) ;
2936 allRepos = allRepos . concat ( _repos ) ;
3037 }
3138
3239 if ( config . users ) {
33- const _repos = await getReposOwnedByUsers ( config . users , api ) ;
40+ const _repos = await fetchWithRetry (
41+ ( ) => getReposOwnedByUsers ( config . users ! , api ) ,
42+ `users ${ config . users . join ( ', ' ) } ` ,
43+ logger
44+ ) ;
3445 allRepos = allRepos . concat ( _repos ) ;
3546 }
3647
@@ -50,7 +61,11 @@ export const getGiteaReposFromConfig = async (config: GiteaConnectionConfig, org
5061 allRepos = await Promise . all (
5162 allRepos . map ( async ( repo ) => {
5263 const [ owner , name ] = repo . full_name ! . split ( '/' ) ;
53- let branches = ( await getBranchesForRepo ( owner , name , api ) ) . map ( branch => branch . name ! ) ;
64+ let branches = ( await fetchWithRetry (
65+ ( ) => getBranchesForRepo ( owner , name , api ) ,
66+ `branches for ${ owner } /${ name } ` ,
67+ logger
68+ ) ) . map ( branch => branch . name ! ) ;
5469 branches = micromatch . match ( branches , branchGlobs ) ;
5570
5671 return {
@@ -66,7 +81,11 @@ export const getGiteaReposFromConfig = async (config: GiteaConnectionConfig, org
6681 allRepos = await Promise . all (
6782 allRepos . map ( async ( allRepos ) => {
6883 const [ owner , name ] = allRepos . name ! . split ( '/' ) ;
69- let tags = ( await getTagsForRepo ( owner , name , api ) ) . map ( tag => tag . name ! ) ;
84+ let tags = ( await fetchWithRetry (
85+ ( ) => getTagsForRepo ( owner , name , api ) ,
86+ `tags for ${ owner } /${ name } ` ,
87+ logger
88+ ) ) . map ( tag => tag . name ! ) ;
7089 tags = micromatch . match ( tags , tagGlobs ) ;
7190
7291 return {
@@ -146,7 +165,7 @@ const getTagsForRepo = async <T>(owner: string, repo: string, api: Api<T>) => {
146165 return tags ;
147166 } catch ( e ) {
148167 logger . error ( `Failed to fetch tags for repo ${ owner } /${ repo } .` , e ) ;
149- return [ ] ;
168+ throw e ;
150169 }
151170}
152171
@@ -162,7 +181,7 @@ const getBranchesForRepo = async <T>(owner: string, repo: string, api: Api<T>) =
162181 return branches ;
163182 } catch ( e ) {
164183 logger . error ( `Failed to fetch branches for repo ${ owner } /${ repo } .` , e ) ;
165- return [ ] ;
184+ throw e ;
166185 }
167186}
168187
@@ -181,7 +200,7 @@ const getReposOwnedByUsers = async <T>(users: string[], api: Api<T>) => {
181200 return data ;
182201 } catch ( e ) {
183202 logger . error ( `Failed to fetch repos for user ${ user } .` , e ) ;
184- return [ ] ;
203+ throw e ;
185204 }
186205 } ) ) ) . flat ( ) ;
187206
@@ -204,7 +223,7 @@ const getReposForOrgs = async <T>(orgs: string[], api: Api<T>) => {
204223 return data ;
205224 } catch ( e ) {
206225 logger . error ( `Failed to fetch repos for org ${ org } .` , e ) ;
207- return [ ] ;
226+ throw e ;
208227 }
209228 } ) ) ) . flat ( ) ;
210229}
@@ -224,7 +243,7 @@ const getRepos = async <T>(repos: string[], api: Api<T>) => {
224243 return [ response . data ] ;
225244 } catch ( e ) {
226245 logger . error ( `Failed to fetch repository info for ${ repo } .` , e ) ;
227- return [ ] ;
246+ throw e ;
228247 }
229248 } ) ) ) . flat ( ) ;
230249}
0 commit comments