{"record":{"id":"a64b7796390e437c","repo":"Hmbown/CodeWhale","slug":"cargo-metadata-contains-duplicate-workspace-package-names","errorCode":null,"errorMessage":"Cargo metadata contains duplicate workspace package names","messagePattern":"Cargo metadata contains duplicate workspace package names","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"scripts/release/validate-crate-publish-order.py","lineNumber":96,"sourceCode":"    return [packages_by_id[member] for member in members]\n\n\ndef validate_order(\n    packages: list[dict[str, Any]], ordered_crates: list[str]\n) -> tuple[str, dict[str, bool]]:\n    duplicate_crates = sorted(\n        {name for name in ordered_crates if ordered_crates.count(name) > 1}\n    )\n    if duplicate_crates:\n        raise ValidationError(\n            \"publish package list contains duplicates: \" + \", \".join(duplicate_crates)\n        )\n\n    names = [package.get(\"name\") for package in packages]\n    if any(not isinstance(name, str) or not name for name in names):\n        raise ValidationError(\"workspace package is missing a name\")\n    if len(set(names)) != len(names):\n        raise ValidationError(\"Cargo metadata contains duplicate workspace package names\")\n\n    versions = sorted({package.get(\"version\") for package in packages})\n    if len(versions) != 1 or not isinstance(versions[0], str) or not versions[0]:\n        rendered = \", \".join(str(version) for version in versions)\n        raise ValidationError(f\"workspace packages have mixed versions: {rendered}\")\n\n    workspace_by_name = {package[\"name\"]: package for package in packages}\n    release_names = sorted(\n        name for name in workspace_by_name if name.startswith(\"codewhale-\")\n    )\n    ordered_set = set(ordered_crates)\n    missing = sorted(set(release_names) - ordered_set)\n    extra = sorted(ordered_set - set(release_names))\n    if missing or extra:\n        messages = []\n        if missing:\n            messages.append(\"publish package list is missing workspace crates: \" + \" \".join(missing))\n        if extra:","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/scripts/release/validate-crate-publish-order.py#L78-L114","documentation":"validate-crate-publish-order.py validates `cargo metadata` output before computing the crate publish order. Every workspace package in the metadata must be uniquely named; duplicates would make the name-keyed workspace_by_name map ambiguous and corrupt dependency-graph construction. It throws when the list of package names contains any repeat.","triggerScenarios":"Running the validator on Cargo metadata where two workspace members resolve to the same package name — e.g. a crate listed twice in workspace.members, a vendored/duplicate package entry, or a renamed crate whose old name still exists somewhere in the graph.","commonSituations":"Copy-pasting a workspace member entry without removing the old one; adding a directory that contains a Cargo.toml with the same package name as an existing crate; accidental duplicate `path` dependencies pulling the same crate in twice.","solutions":["Run `cargo metadata --format-version 1` and grep package names for duplicates (e.g. pipe through jq '.packages[].name' | sort | uniq -d).","Check workspace.members / workspace.exclude in the root Cargo.toml for a duplicated path.","Rename the duplicate package in its Cargo.toml or remove the redundant member entry.","Re-run `cargo metadata` to confirm the duplicate is gone before re-running the validator."],"exampleFix":"// before (root Cargo.toml)\nmembers = [\"crates/tui\", \"crates/tui\"]\n// after\nmembers = [\"crates/tui\"]","handlingStrategy":"validation","validationCode":"import json, sys\nmeta = json.loads(subprocess.check_output(['cargo','metadata','--format-version','1']))\nnames = [p['name'] for p in meta['packages']]\ndups = {n for n in names if names.count(n) > 1}\nif dups: sys.exit(f'duplicate workspace packages: {dups}')","typeGuard":null,"tryCatchPattern":"try:\n    validate_order(...)\nexcept ValidationError as e:\n    print(f'workspace duplicate packages: {e}', file=sys.stderr); sys.exit(1)","preventionTips":["Keep workspace.members unique and generated where possible","Grep new Cargo.toml package names against existing ones before committing","Run the validator locally before pushing release changes"],"tags":["cargo","workspace","validation","release"],"backgroundTag":"schema-validation-failed","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}