@@ -21,6 +21,13 @@ import type { LookupUpdateConfig, UpdateResult } from './lookup/types';
21
21
22
22
type LookupResult = Result < PackageDependency , Error > ;
23
23
24
+ interface LookupTaskResult {
25
+ packageFile : PackageFile ;
26
+ result : LookupResult ;
27
+ }
28
+
29
+ type LookupTask = Promise < LookupTaskResult > ;
30
+
24
31
async function lookup (
25
32
packageFileConfig : RenovateConfig & PackageFile ,
26
33
indep : PackageDependency ,
@@ -106,63 +113,86 @@ async function lookup(
106
113
} ) ;
107
114
}
108
115
109
- async function fetchManagerPackagerFileUpdates (
116
+ function createLookupTasks (
110
117
config : RenovateConfig ,
111
- managerConfig : RenovateConfig ,
112
- pFile : PackageFile ,
113
- ) : Promise < void > {
114
- const { packageFile } = pFile ;
115
- const packageFileConfig = mergeChildConfig ( managerConfig , pFile ) ;
116
- if ( pFile . extractedConstraints ) {
117
- packageFileConfig . constraints = {
118
- ...pFile . extractedConstraints ,
119
- ...config . constraints ,
120
- } ;
118
+ managerPackageFiles : Record < string , PackageFile [ ] > ,
119
+ ) : LookupTask [ ] {
120
+ const lookupTasks : LookupTask [ ] = [ ] ;
121
+
122
+ for ( const [ manager , packageFiles ] of Object . entries ( managerPackageFiles ) ) {
123
+ const managerConfig = getManagerConfig ( config , manager ) ;
124
+
125
+ for ( const packageFile of packageFiles ) {
126
+ const packageFileConfig = mergeChildConfig ( managerConfig , packageFile ) ;
127
+ if ( packageFile . extractedConstraints ) {
128
+ packageFileConfig . constraints = {
129
+ ...packageFile . extractedConstraints ,
130
+ ...config . constraints ,
131
+ } ;
132
+ }
133
+
134
+ for ( const dep of packageFile . deps ) {
135
+ lookupTasks . push (
136
+ lookup ( packageFileConfig , dep ) . then ( ( result ) => ( {
137
+ packageFile,
138
+ result,
139
+ } ) ) ,
140
+ ) ;
141
+ }
142
+ }
121
143
}
122
- const { manager } = packageFileConfig ;
123
- const queue = pFile . deps . map (
124
- ( dep ) => async ( ) : Promise < PackageDependency > => {
125
- const updates = await lookup ( packageFileConfig , dep ) ;
126
- return updates . unwrapOrThrow ( ) ;
127
- } ,
128
- ) ;
129
- logger . trace (
130
- { manager, packageFile, queueLength : queue . length } ,
131
- 'fetchManagerPackagerFileUpdates starting with concurrency' ,
132
- ) ;
133
144
134
- pFile . deps = await p . all ( queue ) ;
135
- logger . trace ( { packageFile } , 'fetchManagerPackagerFileUpdates finished' ) ;
136
- }
137
-
138
- async function fetchManagerUpdates (
139
- config : RenovateConfig ,
140
- packageFiles : Record < string , PackageFile [ ] > ,
141
- manager : string ,
142
- ) : Promise < void > {
143
- const managerConfig = getManagerConfig ( config , manager ) ;
144
- const queue = packageFiles [ manager ] . map (
145
- ( pFile ) => ( ) : Promise < void > =>
146
- fetchManagerPackagerFileUpdates ( config , managerConfig , pFile ) ,
147
- ) ;
148
- logger . trace (
149
- { manager, queueLength : queue . length } ,
150
- 'fetchManagerUpdates starting' ,
151
- ) ;
152
- await p . all ( queue ) ;
153
- logger . trace ( { manager } , 'fetchManagerUpdates finished' ) ;
145
+ return lookupTasks ;
154
146
}
155
147
156
148
export async function fetchUpdates (
157
149
config : RenovateConfig ,
158
- packageFiles : Record < string , PackageFile [ ] > ,
150
+ managerPackageFiles : Record < string , PackageFile [ ] > ,
159
151
) : Promise < void > {
160
- const managers = Object . keys ( packageFiles ) ;
161
- const allManagerJobs = managers . map ( ( manager ) =>
162
- fetchManagerUpdates ( config , packageFiles , manager ) ,
152
+ logger . debug (
153
+ { baseBranch : config . baseBranch } ,
154
+ 'Starting package releases lookups' ,
163
155
) ;
164
- await Promise . all ( allManagerJobs ) ;
165
- PackageFiles . add ( config . baseBranch ! , { ...packageFiles } ) ;
156
+
157
+ const allTasks = createLookupTasks ( config , managerPackageFiles ) ;
158
+
159
+ const fetchResults = await Promise . all ( allTasks ) ;
160
+
161
+ const errors : Error [ ] = [ ] ;
162
+
163
+ type PackageDeps = WeakMap < PackageFile , PackageDependency [ ] > ;
164
+ const packageDeps : PackageDeps = new WeakMap ( ) ;
165
+
166
+ // Separate good results from errors
167
+ for ( const { packageFile, result } of fetchResults ) {
168
+ const { val : dep , err } = result . unwrap ( ) ;
169
+ if ( dep ) {
170
+ let deps = packageDeps . get ( packageFile ) ;
171
+ if ( ! deps ) {
172
+ deps = [ ] ;
173
+ packageDeps . set ( packageFile , deps ) ;
174
+ }
175
+ deps . push ( dep ) ;
176
+ } else {
177
+ errors . push ( err ) ;
178
+ }
179
+ }
180
+
181
+ if ( errors . length ) {
182
+ p . handleMultipleErrors ( errors ) ;
183
+ }
184
+
185
+ // Assign fetched deps back to packageFiles
186
+ for ( const packageFiles of Object . values ( managerPackageFiles ) ) {
187
+ for ( const packageFile of packageFiles ) {
188
+ const packageFileDeps = packageDeps . get ( packageFile ) ;
189
+ if ( packageFileDeps ) {
190
+ packageFile . deps = packageFileDeps ;
191
+ }
192
+ }
193
+ }
194
+
195
+ PackageFiles . add ( config . baseBranch ! , { ...managerPackageFiles } ) ;
166
196
logger . debug (
167
197
{ baseBranch : config . baseBranch } ,
168
198
'Package releases lookups complete' ,
0 commit comments