@@ -98,7 +98,9 @@ export async function pythonSeeds(root: string): Promise<FeatureSeed[]> {
9898 const memberSeeds = await pythonProjectSeeds ( join ( root , member ) , {
9999 testCommandOverride : uvWorkspaceMemberTestCommand ( member ) ,
100100 } ) ;
101- seeds . push ( ...memberSeeds . map ( ( seed ) => workspaceMemberSeed ( seed , member ) ) ) ;
101+ for ( const seed of memberSeeds ) {
102+ seeds . push ( await workspaceMemberSeed ( root , seed , member ) ) ;
103+ }
102104 }
103105 return seeds ;
104106}
@@ -256,7 +258,10 @@ function pruneRootSeedUvMemberPaths(
256258 ( seed . source !== "python-source-group" && seed . source !== "python-test-suite" ) ||
257259 seed . ownedFiles === undefined
258260 ) {
259- return null ;
261+ if ( seedOwnedOrEntryTouchesUvMember ( seed , members ) ) {
262+ return null ;
263+ }
264+ return pruneSeedUvMemberReferences ( seed , members ) ;
260265 }
261266 const ownedFiles = seed . ownedFiles . filter ( ( file ) => ! pathTouchesUvMember ( file . path , members ) ) ;
262267 if ( ownedFiles . length === 0 ) {
@@ -301,6 +306,31 @@ function pruneRootSeedUvMemberPaths(
301306 return pruned ;
302307}
303308
309+ function seedOwnedOrEntryTouchesUvMember ( seed : FeatureSeed , members : readonly string [ ] ) : boolean {
310+ return (
311+ pathTouchesUvMember ( seed . entryPath , members ) ||
312+ ( seed . ownedFiles ?. some ( ( file ) => pathTouchesUvMember ( file . path , members ) ) ?? false )
313+ ) ;
314+ }
315+
316+ function pruneSeedUvMemberReferences ( seed : FeatureSeed , members : readonly string [ ] ) : FeatureSeed {
317+ const pruned : FeatureSeed = { ...seed } ;
318+ if ( seed . contextFiles !== undefined ) {
319+ pruned . contextFiles = seed . contextFiles . filter (
320+ ( file ) => ! pathTouchesUvMember ( file . path , members ) ,
321+ ) ;
322+ }
323+ if ( seed . tests !== undefined ) {
324+ pruned . tests = seed . tests . filter ( ( test ) => ! pathTouchesUvMember ( test . path , members ) ) ;
325+ }
326+ if ( seed . testPrefixes !== undefined ) {
327+ pruned . testPrefixes = seed . testPrefixes . filter (
328+ ( prefix ) => ! pathTouchesUvMember ( prefix , members ) ,
329+ ) ;
330+ }
331+ return pruned ;
332+ }
333+
304334function pathTouchesUvMember ( path : string , members : readonly string [ ] ) : boolean {
305335 return members . some ( ( member ) => pathMatchesPrefix ( path , member ) ) ;
306336}
@@ -315,11 +345,28 @@ function seedRepoPaths(seed: FeatureSeed): string[] {
315345 ] ) ;
316346}
317347
318- function workspaceMemberSeed ( seed : FeatureSeed , member : string ) : FeatureSeed {
348+ async function workspaceMemberSeed (
349+ workspaceRoot : string ,
350+ seed : FeatureSeed ,
351+ member : string ,
352+ ) : Promise < FeatureSeed > {
319353 const prefixPath = ( path : string ) : string => `${ member } /${ path } ` ;
320354 const genericSource = seed . source === "python-source-group" ;
321355 const genericTestSuite = seed . source === "python-test-suite" ;
322356 const entryPath = prefixPath ( seed . entryPath ) ;
357+ const contextFiles =
358+ seed . contextFiles === undefined
359+ ? undefined
360+ : seed . contextFiles . map ( ( file ) => ( {
361+ ...file ,
362+ path : prefixPath ( file . path ) ,
363+ } ) ) ;
364+ const workspaceRuntimeContext = await pythonRuntimeContextFiles (
365+ workspaceRoot ,
366+ seed . ownedFiles === undefined
367+ ? [ entryPath ]
368+ : seed . ownedFiles . map ( ( file ) => prefixPath ( file . path ) ) ,
369+ ) ;
323370 return {
324371 ...seed ,
325372 title : genericSource
@@ -337,21 +384,27 @@ function workspaceMemberSeed(seed: FeatureSeed, member: string): FeatureSeed {
337384 ...( seed . ownedFiles === undefined
338385 ? { }
339386 : { ownedFiles : seed . ownedFiles . map ( ( file ) => ( { ...file , path : prefixPath ( file . path ) } ) ) } ) ,
340- ...( seed . contextFiles === undefined
341- ? { }
342- : {
343- contextFiles : seed . contextFiles . map ( ( file ) => ( {
344- ...file ,
345- path : prefixPath ( file . path ) ,
346- } ) ) ,
347- } ) ,
387+ contextFiles : uniqueSeedFileRefs ( [ ...( contextFiles ?? [ ] ) , ...workspaceRuntimeContext ] ) ,
348388 ...( seed . tests === undefined
349389 ? { }
350390 : { tests : seed . tests . map ( ( test ) => ( { ...test , path : prefixPath ( test . path ) } ) ) } ) ,
351391 ...( seed . testPrefixes === undefined ? { } : { testPrefixes : seed . testPrefixes . map ( prefixPath ) } ) ,
352392 } ;
353393}
354394
395+ function uniqueSeedFileRefs ( refs : SeedFileRef [ ] ) : SeedFileRef [ ] {
396+ const seen = new Set < string > ( ) ;
397+ const output : SeedFileRef [ ] = [ ] ;
398+ for ( const ref of refs ) {
399+ if ( seen . has ( ref . path ) ) {
400+ continue ;
401+ }
402+ seen . add ( ref . path ) ;
403+ output . push ( ref ) ;
404+ }
405+ return output ;
406+ }
407+
355408function workspaceMemberSummary ( seed : FeatureSeed , member : string ) : string {
356409 if ( seed . source === "python-source-group" ) {
357410 return prefixedPythonSourceSummary ( seed , member ) ;
0 commit comments