@@ -1115,8 +1115,46 @@ func runToCqueryResult(context *Context, pattern string, includeTransitions bool
11151115 }
11161116}
11171117
1118+ // maxInlineQueryPatternLength is the longest query pattern passed to bazel as
1119+ // a command-line argument. Longer patterns (e.g. scoped seeded-mode universes
1120+ // carrying many explicit labels) are written to a file and passed via
1121+ // --query_file to avoid OS argv limits.
1122+ const maxInlineQueryPatternLength = 65536
1123+
1124+ // queryPatternArgs returns the bazel query arguments encoding pattern, either
1125+ // inline or via a --query_file, along with a cleanup function.
1126+ func queryPatternArgs (pattern string ) ([]string , func (), error ) {
1127+ if len (pattern ) <= maxInlineQueryPatternLength {
1128+ return []string {pattern }, func () {}, nil
1129+ }
1130+ queryFile , err := os .CreateTemp ("" , "target-determinator-query-pattern-*.txt" )
1131+ if err != nil {
1132+ return nil , func () {}, fmt .Errorf ("failed to create query pattern file: %w" , err )
1133+ }
1134+ cleanup := func () { os .Remove (queryFile .Name ()) }
1135+ if _ , err := queryFile .WriteString (pattern ); err != nil {
1136+ queryFile .Close ()
1137+ cleanup ()
1138+ return nil , func () {}, fmt .Errorf ("failed to write query pattern file: %w" , err )
1139+ }
1140+ if err := queryFile .Close (); err != nil {
1141+ cleanup ()
1142+ return nil , func () {}, fmt .Errorf ("failed to close query pattern file: %w" , err )
1143+ }
1144+ return []string {"--query_file=" + queryFile .Name ()}, cleanup , nil
1145+ }
1146+
1147+ // truncateForLog shortens very long query patterns for log lines.
1148+ func truncateForLog (pattern string ) string {
1149+ const maxLogged = 2048
1150+ if len (pattern ) <= maxLogged {
1151+ return pattern
1152+ }
1153+ return pattern [:maxLogged ] + fmt .Sprintf ("... (%d bytes total)" , len (pattern ))
1154+ }
1155+
11181156func runToQueryResult (context * Context , pattern string ) ([]* analysis.ConfiguredTarget , error ) {
1119- log .Printf ("Running query on %s" , pattern )
1157+ log .Printf ("Running query on %s" , truncateForLog ( pattern ) )
11201158
11211159 queryOutputFile , err := os .CreateTemp ("" , "target-determinator-query-*.proto" )
11221160 if err != nil {
@@ -1128,17 +1166,23 @@ func runToQueryResult(context *Context, pattern string) ([]*analysis.ConfiguredT
11281166 return nil , fmt .Errorf ("failed to close temporary file for query output: %w" , err )
11291167 }
11301168
1169+ patternArgs , patternCleanup , err := queryPatternArgs (pattern )
1170+ defer patternCleanup ()
1171+ if err != nil {
1172+ return nil , err
1173+ }
1174+
11311175 var stderr bytes.Buffer
11321176 // Unlike cquery (which only gained streamed_proto and output_file in Bazel 8.2),
11331177 // bazel query has supported both since well before any Bazel version this tool targets.
11341178 returnVal , err := context .BazelCmd .Execute (
11351179 BazelCmdConfig {Dir : context .WorkspacePath , Stderr : & stderr },
11361180 []string {"--output_base" , context .BazelOutputBase },
1137- "query" , "--output=streamed_proto" , "--order_output=no" ,
1138- "--output_file=" + queryOutput , pattern )
1181+ "query" , append ([] string { "--output=streamed_proto" , "--order_output=no" ,
1182+ "--output_file=" + queryOutput }, patternArgs ... ) ... )
11391183
11401184 if returnVal != 0 || err != nil {
1141- return nil , fmt .Errorf ("failed to run query on %s: %w. Stderr:\n %v" , pattern , err , stderr .String ())
1185+ return nil , fmt .Errorf ("failed to run query on %s: %w. Stderr:\n %v" , truncateForLog ( pattern ) , err , stderr .String ())
11421186 }
11431187
11441188 queryOutputFile , err = os .Open (queryOutput )
@@ -1167,17 +1211,23 @@ func runToQueryResult(context *Context, pattern string) ([]*analysis.ConfiguredT
11671211}
11681212
11691213func runToQueryLabels (context * Context , pattern string , normalizer * Normalizer ) ([]label.Label , error ) {
1170- log .Printf ("Running query (labels) on %s" , pattern )
1214+ log .Printf ("Running query (labels) on %s" , truncateForLog ( pattern ) )
11711215 var stdout bytes.Buffer
11721216 var stderr bytes.Buffer
11731217
1218+ patternArgs , patternCleanup , err := queryPatternArgs (pattern )
1219+ defer patternCleanup ()
1220+ if err != nil {
1221+ return nil , err
1222+ }
1223+
11741224 returnVal , err := context .BazelCmd .Execute (
11751225 BazelCmdConfig {Dir : context .WorkspacePath , Stdout : & stdout , Stderr : & stderr },
11761226 []string {"--output_base" , context .BazelOutputBase },
1177- "query" , "--output=label" , "--order_output=no" , pattern )
1227+ "query" , append ([] string { "--output=label" , "--order_output=no" }, patternArgs ... ) ... )
11781228
11791229 if returnVal != 0 || err != nil {
1180- return nil , fmt .Errorf ("failed to run query on %s: %w. Stderr:\n %v" , pattern , err , stderr .String ())
1230+ return nil , fmt .Errorf ("failed to run query on %s: %w. Stderr:\n %v" , truncateForLog ( pattern ) , err , stderr .String ())
11811231 }
11821232
11831233 var labels []label.Label
0 commit comments