@@ -113,17 +113,28 @@ async function main() {
113113 } )
114114
115115 if ( ! applySecretFlags || toFlag . length === 0 ) return
116+ // The import resubmits each value, so re-read right before each batch and skip any variable
117+ // rotated since the plan: flagging must never write back an older value.
118+ const skipped : string [ ] = [ ]
116119 for ( const batch of chunkArray ( toFlag , IMPORT_BATCH_SIZE ) ) {
120+ const { variables : latest } = await request < { variables : Record < string , string > } > ( envvarsUrl )
121+ const unrotated = batch . filter ( ( v ) => latest [ v . name ] === v . value )
122+ skipped . push ( ...batch . filter ( ( v ) => latest [ v . name ] !== v . value ) . map ( ( v ) => v . name ) )
123+ if ( unrotated . length === 0 ) continue
117124 await request ( `${ envvarsUrl } /${ environment } /import` , {
118- variables : Object . fromEntries ( batch . map ( ( v ) => [ v . name , current [ v . name ] ] ) ) ,
125+ variables : Object . fromEntries ( unrotated . map ( ( v ) => [ v . name , v . value ] ) ) ,
119126 override : true ,
120127 isSecret : true ,
121128 } )
122129 }
123130 const stillPlain = await listPlainNames ( )
124- const unflagged = names ( toFlag . filter ( ( v ) => stillPlain . has ( v . name ) ) )
131+ const unflagged = names ( toFlag . filter ( ( v ) => stillPlain . has ( v . name ) && ! skipped . includes ( v . name ) ) )
125132 if ( unflagged . length > 0 ) throw new Error ( `Still plain after flagging: ${ unflagged . join ( ', ' ) } ` )
126- logger . info ( 'Marked unchanged variables as secrets' , { environment, flagged : toFlag . length } )
133+ logger . info ( 'Marked unchanged variables as secrets' , {
134+ environment,
135+ flagged : toFlag . length - skipped . length ,
136+ skippedAsRotated : skipped . sort ( ) ,
137+ } )
127138}
128139
129140main ( ) . catch ( ( error ) => {
0 commit comments