jdx/mise · error

archive does not contain registry entries

Error message

archive does not contain registry entries

What it means

mise builds its tool registry from archives that must contain at least one registry source file. After extracting candidate files into the sources map, mise requires it to be non-empty; an archive with no registry entries provides nothing to parse and is rejected with this error.

Solutions

  1. Verify you are using the correct registry archive and that it contains the expected registry entry files at the expected paths
  2. Check for upstream renames of the registry file layout and update the extraction glob/pattern accordingly
  3. Re-download the archive — a truncated or partial download may have yielded zero entries
  4. If the archive is genuinely empty, obtain a valid release from the upstream source

Example fix

// before (empty/mismatched archive)
mise registry-load --archive ./docs.tar.gz
// after
mise registry-load --archive ./registry-full.tar.gz  # contains registry/*.toml entries
Defensive patterns

Strategy: validation

Validate before calling

const entries = await listArchiveFilesMatching(archivePath, registryEntryPattern);
if (entries.length === 0) throw new Error('archive has no registry entries; wrong archive or layout changed?');

Try / catch

try { await loadRegistryArchive(path); } catch (e) {
  if (String(e).includes('does not contain registry entries')) {
    console.error(`No registry entries found in ${path}; verify the archive and expected layout.`);
    return null;
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling the registry-loading path (e.g. during mise's registry refresh / build tooling) with an archive whose files do not match the expected registry entry patterns, or an archive that contains only non-entry files (READMEs, dotfiles, nested non-matching paths).

Common situations: Pointing mise at the wrong archive (an empty or unrelated tarball); an upstream restructuring that moved/renamed registry files so the extractor no longer finds them; a truncated archive that extracted nothing.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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

Appendix: source

Thrown at src/registry.rs:360

        }
        let file_path = PathBuf::from(components[1]);
        if file_path
            .extension()
            .is_none_or(|extension| extension != "toml")
        {
            continue;
        }
        let short = file_path
            .file_stem()
            .and_then(|stem| stem.to_str())
            .ok_or_else(|| eyre::eyre!("invalid registry filename: {}", path.display()))?
            .to_string();
        let mut source = String::new();
        entry.read_to_string(&mut source)?;
        sources.insert(short, source);
    }

    ensure!(
        !sources.is_empty(),
        "archive does not contain registry entries"
    );
    registry_from_sources(sources)
}

fn track_registry_archive_entry(
    index: usize,
    entry_size: u64,
    archive_size: &mut u64,
) -> Result<()> {
    ensure!(
        index < MAX_REGISTRY_ARCHIVE_ENTRIES,
        "registry archive contains too many entries"
    );
    ensure!(
        entry_size <= MAX_REGISTRY_ARCHIVE_ENTRY_SIZE,
        "registry archive entry is too large"

View on GitHub (pinned to 533346cc37)