@@ -2170,6 +2170,14 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => {
21702170 . sources [ 0 ] ! ;
21712171 assert . equal ( rootSource . baseRef , emptyTree ) ;
21722172 assert . include ( rootSource . diff , "+# test" ) ;
2173+ const rootMetadata = ( yield * driver . getReviewDiffPreview ( {
2174+ cwd : upstream ,
2175+ commitSha : root ,
2176+ metadataOnly : true ,
2177+ } ) ) . sources [ 0 ] ! ;
2178+ assert . deepStrictEqual ( rootMetadata . files , rootSource . files ) ;
2179+ assert . isTrue ( rootMetadata . patchesDeferred ) ;
2180+ assert . isEmpty ( rootMetadata . diff ) ;
21732181
21742182 yield * writeTextFile ( upstream , "README.md" , "# boundary\n" ) ;
21752183 yield * git ( upstream , [ "commit" , "-am" , "boundary" ] ) ;
@@ -2396,6 +2404,78 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => {
23962404 } ) ,
23972405 ) ;
23982406
2407+ it . effect (
2408+ "returns an incomplete selected tracked preview while untracked discovery is held" ,
2409+ ( ) =>
2410+ Effect . gen ( function * ( ) {
2411+ const cwd = yield * makeTmpDir ( ) ;
2412+ yield * initRepoWithCommit ( cwd ) ;
2413+ yield * writeTextFile ( cwd , "README.md" , "changed\n" ) ;
2414+ yield * writeTextFile ( cwd , "new.txt" , "untracked\n" ) ;
2415+ const started = yield * Deferred . make < void > ( ) ;
2416+ const release = yield * Deferred . make < void > ( ) ;
2417+ let untrackedReads = 0 ;
2418+ const delegate = yield * ChildProcessSpawner . ChildProcessSpawner ;
2419+ const spawner = ChildProcessSpawner . make ( ( command ) =>
2420+ Effect . gen ( function * ( ) {
2421+ if ( ChildProcess . isStandardCommand ( command ) && command . args . includes ( "--others" ) ) {
2422+ assert . equal (
2423+ ++ untrackedReads ,
2424+ 1 ,
2425+ "tracked preview must not enumerate untracked files" ,
2426+ ) ;
2427+ yield * Deferred . succeed ( started , undefined ) ;
2428+ yield * Deferred . await ( release ) ;
2429+ }
2430+ return yield * delegate . spawn ( command ) ;
2431+ } ) ,
2432+ ) ;
2433+ const driver = yield * makeGitVcsDriverCore ( ) . pipe (
2434+ Effect . provideService ( ChildProcessSpawner . ChildProcessSpawner , spawner ) ,
2435+ Effect . provide ( layerServerConfig ) ,
2436+ ) ;
2437+ const full = yield * driver
2438+ . getReviewDiffPreview ( { cwd, sourceKind : "working-tree" } )
2439+ . pipe ( Effect . forkChild ) ;
2440+ yield * Deferred . await ( started ) ;
2441+ yield * Effect . gen ( function * ( ) {
2442+ const preview = yield * driver . getReviewDiffPreview ( {
2443+ cwd,
2444+ sourceKind : "working-tree" ,
2445+ trackedOnly : true ,
2446+ } ) ;
2447+ assert . isTrue ( preview . incomplete ) ;
2448+ assert . deepStrictEqual (
2449+ preview . sources . map ( ( source ) => source . kind ) ,
2450+ [ "working-tree" ] ,
2451+ ) ;
2452+ assert . include ( preview . sources [ 0 ] ! . diff , "+changed" ) ;
2453+ assert . notInclude ( preview . sources [ 0 ] ! . diff , "untracked" ) ;
2454+ const metadata = yield * driver . getReviewDiffPreview ( {
2455+ cwd,
2456+ sourceKind : "working-tree" ,
2457+ trackedOnly : true ,
2458+ metadataOnly : true ,
2459+ } ) ;
2460+ assert . isTrue ( metadata . incomplete ) ;
2461+ assert . deepStrictEqual ( metadata . sources [ 0 ] ! . files , preview . sources [ 0 ] ! . files ) ;
2462+ assert . isTrue ( metadata . sources [ 0 ] ! . patchesDeferred ) ;
2463+ assert . isEmpty ( metadata . sources [ 0 ] ! . diff ) ;
2464+ } ) . pipe ( Effect . ensuring ( Deferred . succeed ( release , undefined ) ) ) ;
2465+ const complete = yield * Fiber . join ( full ) ;
2466+ assert . isUndefined ( complete . incomplete ) ;
2467+ assert . include ( complete . sources [ 0 ] ! . diff , "+untracked" ) ;
2468+ yield * writeTextFile ( cwd , "README.md" , "edited again\n" ) ;
2469+ const refreshed = yield * driver . getReviewDiffPreview ( {
2470+ cwd,
2471+ baseRef : "missing-base" ,
2472+ sourceKind : "working-tree" ,
2473+ trackedOnly : true ,
2474+ } ) ;
2475+ assert . include ( refreshed . sources [ 0 ] ! . diff , "+edited again" ) ;
2476+ } ) ,
2477+ ) ;
2478+
23992479 it . effect ( "propagates patch failures instead of reporting an empty complete diff" , ( ) =>
24002480 Effect . gen ( function * ( ) {
24012481 const cwd = yield * makeTmpDir ( ) ;
@@ -2416,6 +2496,16 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => {
24162496 if ( Result . isFailure ( result ) ) {
24172497 assert . equal ( result . failure . operation , "GitVcsDriver.getReviewDiffPreview.patch" ) ;
24182498 }
2499+ const metadata = yield * driver . getReviewDiffPreview ( {
2500+ cwd,
2501+ sourceKind : "working-tree" ,
2502+ metadataOnly : true ,
2503+ } ) ;
2504+ assert . isTrue ( metadata . sources [ 0 ] ! . patchesDeferred ) ;
2505+ assert . isEmpty ( metadata . sources [ 0 ] ! . diff ) ;
2506+ assert . deepStrictEqual ( metadata . sources [ 0 ] ! . files , [
2507+ { path : "README.md" , previousPath : null , additions : 1 , deletions : 1 } ,
2508+ ] ) ;
24192509 } ) ,
24202510 ) ;
24212511
@@ -2597,9 +2687,17 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => {
25972687 ) ;
25982688 yield * writeTextFile ( cwd , "README.md" , "# tracked change\n" ) ;
25992689
2600- const preview = yield * driver . getReviewDiffPreview ( { cwd, ignoreWhitespace : false } ) ;
2690+ const preview = yield * driver . getReviewDiffPreview ( {
2691+ cwd,
2692+ ignoreWhitespace : false ,
2693+ metadataOnly : true ,
2694+ } ) ;
26012695 const diff = preview . sources . find ( ( source ) => source . kind === "working-tree" ) ?. diff ?? "" ;
26022696
2697+ const source = preview . sources . find ( ( source ) => source . kind === "working-tree" ) ! ;
2698+ assert . isUndefined ( source . patchesDeferred ) ;
2699+ assert . isUndefined ( source . files ) ;
2700+ assert . isTrue ( source . truncated ) ;
26032701 assert . include ( diff , "-# test" ) ;
26042702 assert . include ( diff , "+# tracked change" ) ;
26052703 } ) ,
@@ -2734,6 +2832,22 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => {
27342832 assert . isTrue ( dirty . truncated ) ;
27352833 assert . notInclude ( branch . diff , "z-last.txt" ) ;
27362834 for ( const source of [ branch , dirty ] ) {
2835+ const selected = yield * driver . getReviewDiffPreview ( {
2836+ cwd,
2837+ baseRef : initialBranch ,
2838+ sourceKind : source . kind === "working-tree" ? "working-tree" : "branch-range" ,
2839+ } ) ;
2840+ assert . deepStrictEqual ( selected . sources , [ source ] ) ;
2841+ const metadata = ( yield * driver . getReviewDiffPreview ( {
2842+ cwd,
2843+ baseRef : initialBranch ,
2844+ sourceKind : source . kind === "working-tree" ? "working-tree" : "branch-range" ,
2845+ metadataOnly : true ,
2846+ } ) ) . sources [ 0 ] ! ;
2847+ assert . deepStrictEqual ( metadata . files , source . files ) ;
2848+ assert . isTrue ( metadata . patchesDeferred ) ;
2849+ assert . isFalse ( metadata . truncated ) ;
2850+ assert . isEmpty ( metadata . diff ) ;
27372851 for ( const file of source . files ?? [ ] ) {
27382852 const individual = yield * driver . getReviewDiffPreview ( {
27392853 cwd,
0 commit comments