Hmbown/CodeWhale · error · ValidationError

Cargo metadata contains duplicate workspace package names

Error message

Cargo metadata contains duplicate workspace package names

What it means

Two or more workspace packages share the same name. The validator indexes packages by name to build the release inventory and record positions, and duplicate names would also collide as crates.io package names. This is only reachable with genuinely duplicated workspace packages or a fixture that repeats an entry.

Source

Thrown at scripts/release/validate-crate-publish-order.py:96

    return [packages_by_id[member] for member in members]


def validate_order(
    packages: list[dict[str, Any]], ordered_crates: list[str]
) -> tuple[str, dict[str, bool]]:
    duplicate_crates = sorted(
        {name for name in ordered_crates if ordered_crates.count(name) > 1}
    )
    if duplicate_crates:
        raise ValidationError(
            "publish package list contains duplicates: " + ", ".join(duplicate_crates)
        )

    names = [package.get("name") for package in packages]
    if any(not isinstance(name, str) or not name for name in names):
        raise ValidationError("workspace package is missing a name")
    if len(set(names)) != len(names):
        raise ValidationError("Cargo metadata contains duplicate workspace package names")

    versions = sorted({package.get("version") for package in packages})
    if len(versions) != 1 or not isinstance(versions[0], str) or not versions[0]:
        rendered = ", ".join(str(version) for version in versions)
        raise ValidationError(f"workspace packages have mixed versions: {rendered}")

    workspace_by_name = {package["name"]: package for package in packages}
    release_names = sorted(
        name for name in workspace_by_name if name.startswith("codewhale-")
    )
    ordered_set = set(ordered_crates)
    missing = sorted(set(release_names) - ordered_set)
    extra = sorted(ordered_set - set(release_names))
    if missing or extra:
        messages = []
        if missing:
            messages.append("publish package list is missing workspace crates: " + " ".join(missing))
        if extra:

View on GitHub (pinned to 8880682c63)

Solutions

  1. Find and rename the duplicate: rg '^name = ' --glob 'Cargo.toml' | sort | uniq -d
  2. Or remove/exclude one of the identically named members from the workspace
  3. Regenerate metadata and re-run the validator

Example fix

# crates/new-thing/Cargo.toml: before (copied from codewhale-protocol)
[package]
name = "codewhale-protocol"

# after
[package]
name = "codewhale-new-thing"
Defensive patterns

Strategy: validation

Validate before calling

names = [p["name"] for p in packages]
if len(set(names)) != len(names):
    from collections import Counter
    dupes = sorted(c for c, n in Counter(names).items() if n > 1)
    raise SystemExit(f"duplicate workspace package names: {dupes}")

Prevention

When it happens

Trigger: Two workspace members whose Cargo.toml [package] name fields are identical (e.g. a copied crate directory that was not renamed); a metadata fixture that accidentally includes the same package twice.

Common situations: Cloning a crate as a starting point and forgetting to rename package.name; vendored duplicates; fixture copy-paste.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/a64b7796390e437c. Report an issue: GitHub.