bazelbuild/bazel · error · OptionsParsingException

Not a valid %s: '%s' (should be auto or a boolean)

Error message

Not a valid %s: '%s' (should be auto or a boolean)

What it means

Thrown by the TriState converter (Converters line 174) when the input is neither "auto" nor one of the accepted boolean spellings (true/1/yes/t/y, false/0/no/f/n, case-insensitive). TriState options distinguish "explicitly on", "explicitly off", and "not set / automatic", so arbitrary strings are rejected at parse time.

Source

Thrown at src/main/java/com/google/devtools/common/options/Converters.java:174

      super(TriState.class, "tri-state (auto, yes, no) option value");
    }

    @Override
    public TriState convert(@Nullable String input) throws OptionsParsingException {
      if (input == null) {
        return TriState.AUTO;
      }
      input = Ascii.toLowerCase(input);
      if (input.equals("auto")) {
        return TriState.AUTO;
      }
      if (ENABLED_REPS.contains(input)) {
        return TriState.YES;
      }
      if (DISABLED_REPS.contains(input)) {
        return TriState.NO;
      }
      throw new OptionsParsingException(
          "Not a valid %s: '%s' (should be auto or a boolean)".formatted(typeName, input));
    }

    @Override
    public String getTypeDescription() {
      return "a tri-state (auto, yes, no)";
    }
  }

  /**
   * Standard "converter" for Void. Should not actually be invoked. For instance, expansion flags
   * are usually Void-typed and do not invoke the converter.
   */
  public static class VoidConverter extends Converter.Contextless<Void> {
    @Override
    public Void convert(String input) throws OptionsParsingException {
      if (input == null || input.equals("null")) {
        return null; // expected input, return is unused so null is fine.

View on GitHub (pinned to e6e199d060)

Solutions

  1. Use auto to let the flag decide automatically, or one of the boolean spellings (e.g. yes/no) for an explicit choice.
  2. To unset a TriState flag, simply omit it from the command line or use auto.
  3. Update stale scripts that still write on/off.

Example fix

# before
bazel build --my_tristate=on //...
# after
bazel build --my_tristate=yes //...
Defensive patterns

Strategy: validation

Validate before calling

boolean isParsableTriState(String s) {
  if (s == null) return false;
  String v = s.toLowerCase(Locale.ROOT);
  return v.equals("auto")
      || Set.of("true","1","yes","t","y","false","0","no","f","n").contains(v);
}

Type guard

boolean isTriStateFlagValue(String s) {
  return s != null && s.matches("(?i)(auto|true|false|1|0|yes|no|t|f|y|n)");
}

Prevention

When it happens

Trigger: Passing --my_tristate=maybe, --my_tristate=unset, or --my_tristate="" to a TriState-typed option; also passing on/off which this converter does not accept.

Common situations: Users assuming on/off works because other tools accept it; trying to "reset" a flag by giving an empty value instead of auto; script defaults that fall back to an invalid token.

Related errors


AI-assisted analysis of bazelbuild/bazel@e6e199d060 (2026-08-14). Data as JSON: /api/errors/69eb8103ff7fbb52. Report an issue: GitHub.