@@ -355,56 +355,52 @@ function writeBytes(filePath, bytes) {
355355 fs . writeFileSync ( filePath , bytes ) ;
356356}
357357
358- function discardTemporaryWorktreeChanges ( ) {
359- const status = git ( [ "status" , "--porcelain" ] , { capture : true } ) . stdout . trim ( ) ;
360- if ( ! status ) {
361- return ;
362- }
363-
364- const marker = `api-md-workflow-temp-${ Date . now ( ) } ` ;
365- git ( [ "stash" , "push" , "--include-untracked" , "-m" , marker ] ) ;
366-
367- const topEntry = git ( [ "stash" , "list" , "-n" , "1" , "--format=%gd %s" ] , {
368- capture : true ,
369- } ) . stdout . trim ( ) ;
370-
371- if ( ! topEntry . includes ( marker ) ) {
372- throw new Error ( "ERROR: failed to identify temporary stash entry while cleaning generated files." ) ;
373- }
374-
375- git ( [ "stash" , "drop" , "stash@{0}" ] ) ;
376- }
377-
378- function generateApiBytesForPackage ( {
358+ function generateApiBytesForRef ( {
379359 adapter,
380360 repoRoot,
381361 packageName,
382362 packageDir,
383363 runtimeExecutable,
364+ ref,
384365 refLabel,
385366 logger,
386367} ) {
387- adapter . generateApiForPackage ( {
388- repoRoot,
389- packageName,
390- runtimeExecutable,
391- logger,
392- refLabel,
393- } ) ;
368+ const packageRelative = packageRelDir ( packageDir ) ;
369+ logInfo ( `Overlaying package source from ${ refLabel } (${ ref } )` ) ;
394370
395- const outputPath = apiMdPath ( packageDir ) ;
396- if ( ! fs . existsSync ( outputPath ) ) {
397- throw new Error ( `ERROR: did not produce ${ outputPath } ` ) ;
398- }
371+ // Overlay just the package directory from the target ref onto the working tree
372+ git ( [ "checkout" , ref , "--" , packageRelative ] ) ;
399373
400- const result = { apiMd : fs . readFileSync ( outputPath ) , metadata : null } ;
374+ try {
375+ const version = adapter . readVersion ( packageDir ) ;
401376
402- const metaPath = metadataPath ( packageDir ) ;
403- if ( fs . existsSync ( metaPath ) ) {
404- result . metadata = fs . readFileSync ( metaPath ) ;
405- }
377+ adapter . generateApiForPackage ( {
378+ repoRoot,
379+ packageName,
380+ runtimeExecutable,
381+ logger,
382+ refLabel,
383+ } ) ;
406384
407- return result ;
385+ const outputPath = apiMdPath ( packageDir ) ;
386+ if ( ! fs . existsSync ( outputPath ) ) {
387+ throw new Error ( `ERROR: did not produce ${ outputPath } ` ) ;
388+ }
389+
390+ const result = { apiMd : fs . readFileSync ( outputPath ) , metadata : null , version } ;
391+
392+ const metaPath = metadataPath ( packageDir ) ;
393+ if ( fs . existsSync ( metaPath ) ) {
394+ result . metadata = fs . readFileSync ( metaPath ) ;
395+ }
396+
397+ return result ;
398+ } finally {
399+ // Restore the package directory to the current branch state
400+ git ( [ "checkout" , "HEAD" , "--" , packageRelative ] ) ;
401+ // Clean any untracked files that the generation may have left behind
402+ run ( "git" , [ "clean" , "-fd" , "--" , packageRelative ] , { check : false } ) ;
403+ }
408404}
409405
410406function main ( ) {
@@ -433,32 +429,30 @@ function main() {
433429 let baseResult = null ;
434430 if ( args . base ) {
435431 logInfo ( `\n=== Capturing baseline API.md from tag ${ args . base } ===` ) ;
436- git ( [ "checkout" , "--detach" , args . base ] ) ;
437- baseResult = generateApiBytesForPackage ( {
432+ baseResult = generateApiBytesForRef ( {
438433 adapter,
439434 repoRoot : REPO_ROOT ,
440435 packageName : args . packageName ,
441436 packageDir,
442437 runtimeExecutable : args . runtimeExecutable ,
443- refLabel : currentBranchOrSha ( ) ,
438+ ref : args . base ,
439+ refLabel : args . base ,
444440 logger,
445441 } ) ;
446- discardTemporaryWorktreeChanges ( ) ;
447442 }
448443
449444 logInfo ( `\n=== Capturing target API.md from ${ targetRef } ===` ) ;
450- git ( [ "checkout" , "--detach" , targetRef ] ) ;
451- const targetVersion = adapter . readVersion ( packageDir ) ;
452- const targetResult = generateApiBytesForPackage ( {
445+ const targetResult = generateApiBytesForRef ( {
453446 adapter,
454447 repoRoot : REPO_ROOT ,
455448 packageName : args . packageName ,
456449 packageDir,
457450 runtimeExecutable : args . runtimeExecutable ,
458- refLabel : currentBranchOrSha ( ) ,
451+ ref : targetRef ,
452+ refLabel : targetRef ,
459453 logger,
460454 } ) ;
461- discardTemporaryWorktreeChanges ( ) ;
455+ const targetVersion = targetResult . version ;
462456
463457 const baseBranch = `base_${ args . packageName } _${ baseVersion } ` ;
464458 const reviewBranch = `review_${ args . packageName } _${ targetVersion } ` ;
0 commit comments