@@ -21,6 +21,10 @@ export type PreparedPackageManagerInfo = Awaited<ReturnType<Engine[`ensurePackag
21
21
export function getLastKnownGoodFile ( flag = `r` ) {
22
22
return fs . promises . open ( path . join ( folderUtils . getCorepackHomeFolder ( ) , `lastKnownGood.json` ) , flag ) ;
23
23
}
24
+ async function createLastKnownGoodFile ( ) {
25
+ await fs . promises . mkdir ( folderUtils . getCorepackHomeFolder ( ) , { recursive : true } ) ;
26
+ return getLastKnownGoodFile ( `w` ) ;
27
+ }
24
28
25
29
export async function getJSONFileContent ( fh : FileHandle ) {
26
30
let lastKnownGood : unknown ;
@@ -139,17 +143,13 @@ export class Engine {
139
143
if ( typeof definition === `undefined` )
140
144
throw new UsageError ( `This package manager (${ packageManager } ) isn't supported by this corepack build` ) ;
141
145
142
- let emptyFile = false ;
143
- const lastKnownGoodFile = await getLastKnownGoodFile ( `r+` ) . catch ( err => {
144
- if ( ( err as NodeError ) ?. code === `ENOENT` ) {
145
- emptyFile = true ;
146
- return getLastKnownGoodFile ( `w` ) ;
146
+ let lastKnownGoodFile = await getLastKnownGoodFile ( `r+` ) . catch ( err => {
147
+ if ( ( err as NodeError ) ?. code !== `ENOENT` ) {
148
+ throw err ;
147
149
}
148
-
149
- throw err ;
150
150
} ) ;
151
151
try {
152
- const lastKnownGood = emptyFile || await getJSONFileContent ( lastKnownGoodFile ) ;
152
+ const lastKnownGood = lastKnownGoodFile == null || await getJSONFileContent ( lastKnownGoodFile ! ) ;
153
153
const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent ( lastKnownGood , packageManager ) ;
154
154
if ( lastKnownGoodForThisPackageManager )
155
155
return lastKnownGoodForThisPackageManager ;
@@ -159,14 +159,20 @@ export class Engine {
159
159
160
160
const reference = await corepackUtils . fetchLatestStableVersion ( definition . fetchLatestFrom ) ;
161
161
162
- await activatePackageManagerFromFileHandle ( lastKnownGoodFile , lastKnownGood , {
163
- name : packageManager ,
164
- reference,
165
- } ) ;
162
+ try {
163
+ lastKnownGoodFile ??= await createLastKnownGoodFile ( ) ;
164
+ await activatePackageManagerFromFileHandle ( lastKnownGoodFile , lastKnownGood , {
165
+ name : packageManager ,
166
+ reference,
167
+ } ) ;
168
+ } catch {
169
+ // If for some reason, we cannot update the last known good file, we
170
+ // ignore the error.
171
+ }
166
172
167
173
return reference ;
168
174
} finally {
169
- await lastKnownGoodFile . close ( ) ;
175
+ await lastKnownGoodFile ? .close ( ) ;
170
176
}
171
177
}
172
178
0 commit comments