jdx/mise · error

: API metadata has no tap_git_head

Error message

{}: API metadata has no tap_git_head

What it means

mise pins the tap's git HEAD recorded in the API snapshot when evaluating the formula's Ruby source for a source build. A missing `tap_git_head` means it cannot pin and verify the formula definition, so the build is rejected up front.

Solutions

  1. Update/refresh Homebrew API metadata and retry
  2. Use a bottle-backed version/platform so source build is skipped
  3. Install via brew directly; mise cannot verify this formula's source provenance
  4. If a third-party tap lacks this metadata, surface it to the tap maintainers or mise

Example fix

null
Defensive patterns

Strategy: validation

Validate before calling

curl -s https://formulae.brew.sh/api/formula/<name>.json | jq -e '.tap_git_head' >/dev/null && echo ok || echo 'missing tap_git_head'

Try / catch

catch 'API metadata has no tap_git_head' => refresh metadata and retry; if it is a third-party tap gap, install via brew or request the tap publish head info

Prevention

When it happens

Trigger: `check_buildable` sees `formula.tap_git_head.is_none()` while the formula has no bottle for the host and is being prepared for a source build.

Common situations: API snapshot missing tap head info (partial metadata or unusual taps); third-party taps that do not expose git head in the API; stale cached metadata.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/f1d7b270e96649b5. Report an issue: GitHub.

Appendix: source

Thrown at src/system/packages/brew/source.rs:84

    };
    if let Some(using) = &src.using {
        bail!(
            "{}: source uses the {using:?} download strategy, which mise cannot build from \
             (and no bottle exists for this machine)",
            formula.name,
        );
    }
    if src.checksum.is_none() {
        bail!("{}: source archive has no sha256 in the API", formula.name);
    }
    // the formula .rb must be pinned to the API snapshot's commit and
    // verifiable — evaluating a newer/unverified formula against older
    // source metadata would build the wrong thing
    if formula.ruby_source_path.is_none() {
        bail!("{}: API metadata has no ruby_source_path", formula.name);
    }
    if formula.tap_git_head.is_none() {
        bail!("{}: API metadata has no tap_git_head", formula.name);
    }
    if formula
        .ruby_source_checksum
        .as_ref()
        .and_then(|c| c.sha256.as_deref())
        .is_none()
    {
        bail!("{}: API metadata has no formula checksum", formula.name);
    }
    Ok(())
}

/// Build a formula from source into its keg and link it.
pub(super) async fn build(
    rf: &ResolvedFormula,
    closure: &[ResolvedFormula],
    pr: &dyn SingleReport,
) -> Result<()> {

View on GitHub (pinned to 533346cc37)