@@ -363,9 +363,9 @@ def _discover_config_specs(
363363 if not entries :
364364 continue
365365
366- src_paths = [src for _ , _ , src in entries ]
367- dest_paths = [dest for dest , _ , _ in entries ]
368- modes = [mode for _ , mode , _ in entries if mode ]
366+ src_paths = [src for _ , _ , src , _ in entries ]
367+ dest_paths = [dest for dest , _ , _ , _ in entries ]
368+ modes = [mode for _ , mode , _ , _ in entries if mode ]
369369
370370 # Derive source_prefix
371371 common_src = os .path .commonpath (src_paths ) if src_paths else ""
@@ -411,9 +411,13 @@ def _discover_config_specs(
411411 # Auto-classify deploy method
412412 method = _classify_config_method (common_src , target_label )
413413
414- # Build files list
415- files = sorted (
416- [{"src" : src , "dest" : dest , "mode" : fmode } for dest , fmode , src in entries ],
414+ # Build files list — mark generated files (is_source=False) so the
415+ # deployer knows to resolve them from bazel-bin instead of the repo.
416+ files : list [dict [str , Any ]] = sorted (
417+ [
418+ {"src" : src , "dest" : dest , "mode" : fmode , "generated" : not is_source }
419+ for dest , fmode , src , is_source in entries
420+ ],
417421 key = lambda f : f ["src" ],
418422 )
419423
@@ -539,17 +543,18 @@ def format(target):
539543 label = "//%s:%s" % (target.label.package, target.label.name)
540544 lines = []
541545 for dest, src in pfi.dest_src_map.items():
542- lines.append("%s\\ t%s\\ t%s\\ t%s" % (
546+ lines.append("%s\\ t%s\\ t%s\\ t%s\\ t%s " % (
543547 label,
544548 dest,
545549 mode,
546550 src.short_path,
551+ src.is_source,
547552 ))
548553 return "\\ n".join(lines)
549554"""
550555
551- # Type alias: label -> [(dest_path, mode_str, src_short_path)]
552- PackagingTargetIndex = dict [str , list [tuple [str , str , str ]]]
556+ # Type alias: label -> [(dest_path, mode_str, src_short_path, is_source )]
557+ PackagingTargetIndex = dict [str , list [tuple [str , str , str , bool ]]]
553558
554559
555560def _cquery_packaging_targets (
@@ -603,17 +608,17 @@ def _cquery_packaging_targets(
603608 f"{ result .stderr .strip ()} "
604609 )
605610
606- # Parse output lines: LABEL\tDEST\tMODE\tSRC_SHORT_PATH
611+ # Parse output lines: LABEL\tDEST\tMODE\tSRC_SHORT_PATH\tIS_SOURCE
607612 grouped : PackagingTargetIndex = {}
608613 for line in result .stdout .strip ().splitlines ():
609614 line = line .strip ()
610615 if not line or "\t " not in line :
611616 continue
612617 parts = line .split ("\t " )
613- if len (parts ) != 4 :
618+ if len (parts ) != 5 :
614619 continue
615- label , dest , mode , src_path = parts
616- grouped .setdefault (label , []).append ((dest , mode , src_path ))
620+ label , dest , mode , src_path , is_source_str = parts
621+ grouped .setdefault (label , []).append ((dest , mode , src_path , is_source_str == "True" ))
617622
618623 return grouped
619624
@@ -735,9 +740,9 @@ def _enrich_config_specs(
735740 unresolved .append (spec )
736741 continue
737742
738- src_paths = [src for _ , _ , src in entries ]
739- dest_paths = [dest for dest , _ , _ in entries ]
740- modes = [mode for _ , mode , _ in entries if mode ]
743+ src_paths = [src for _ , _ , src , _ in entries ]
744+ dest_paths = [dest for dest , _ , _ , _ in entries ]
745+ modes = [mode for _ , mode , _ , _ in entries if mode ]
741746
742747 # Derive source_prefix (if not explicitly set)
743748 if not spec .get ("source_prefix" ):
@@ -759,8 +764,12 @@ def _enrich_config_specs(
759764 spec ["mode" ] = int (modes [0 ], 8 )
760765
761766 # Populate files list from PackageFilesInfo
767+ enriched_files : list [dict [str , Any ]] = [
768+ {"src" : src , "dest" : dest , "mode" : mode , "generated" : not is_source }
769+ for dest , mode , src , is_source in entries
770+ ]
762771 spec ["files" ] = sorted (
763- [{ "src" : src , "dest" : dest , "mode" : mode } for dest , mode , src in entries ] ,
772+ enriched_files ,
764773 key = lambda f : f ["src" ],
765774 )
766775
@@ -858,11 +867,11 @@ def _enrich_install_specs(
858867 )
859868 continue
860869
861- modes = [mode for _ , mode , _ in entries if mode ]
870+ modes = [mode for _ , mode , _ , _ in entries if mode ]
862871
863872 if len (entries ) == 1 :
864873 # Single-file deploy: dest IS the full site_dest path
865- dest_path , _ , src_path = entries [0 ]
874+ dest_path , _ , src_path , _ = entries [0 ]
866875 if not spec .get ("site_dest" ):
867876 spec ["site_dest" ] = dest_path
868877 if not spec .get ("output_basename" ):
@@ -871,7 +880,7 @@ def _enrich_install_specs(
871880 # Multi-file target: find matching entry by output_basename
872881 output_basename = spec .get ("output_basename" , "" )
873882 if output_basename :
874- for dest , _ , src in entries :
883+ for dest , _ , src , _ in entries :
875884 if (
876885 os .path .basename (dest ) == output_basename
877886 or os .path .basename (src ) == output_basename
@@ -881,7 +890,7 @@ def _enrich_install_specs(
881890 break
882891 elif not spec .get ("site_dest" ):
883892 # No output_basename hint: compute common dest prefix
884- common = os .path .commonpath ([d for d , _ , _ in entries ])
893+ common = os .path .commonpath ([d for d , _ , _ , _ in entries ])
885894 if not common .endswith ("/" ):
886895 common += "/"
887896 spec ["site_dest" ] = common
0 commit comments