diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5424f9fc..46290ded 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -586,19 +586,30 @@ jobs: "$@" } - for crate in \ - agent-tui-common \ - agent-tui-domain \ - agent-tui-usecases \ - agent-tui-adapters \ - agent-tui-infra \ - agent-tui-app \ + crates=( + agent-tui-common + agent-tui-domain + agent-tui-usecases + agent-tui-adapters + agent-tui-infra + agent-tui-app agent-tui - do + ) + + preexisting_crates=() + for crate in "${crates[@]}"; do if crate_published "$crate"; then - echo "$crate@$VERSION already published." - continue + preexisting_crates+=("$crate@$VERSION") fi + done + + if [ "${#preexisting_crates[@]}" -gt 0 ]; then + printf '::error::Refusing to publish because these crate versions already exist on crates.io: %s\n' "${preexisting_crates[*]}" + echo "Verify ownership and contents manually, then publish a new version instead of trusting preexisting internal crates." + exit 1 + fi + + for crate in "${crates[@]}"; do retry cargo publish -p "$crate" --allow-dirty done diff --git a/cli/crates/xtask/src/main_tests.rs b/cli/crates/xtask/src/main_tests.rs index f87c24f9..b2d827a4 100644 --- a/cli/crates/xtask/src/main_tests.rs +++ b/cli/crates/xtask/src/main_tests.rs @@ -655,6 +655,8 @@ fn release_workflow_publishes_and_smokes_crates_io_and_source_install() -> Resul for needle in [ "publish-crates:", "release-channels verify-crates-io-publish-plan", + "preexisting_crates=()", + "Refusing to publish because these crate versions already exist on crates.io", "cargo publish -p \"$crate\" --allow-dirty", "--channel crates-io", "--channel source-install",