From 1b54f8fa48c4be383a3d61c303053189c858fa65 Mon Sep 17 00:00:00 2001 From: JasterV <49537445+JasterV@users.noreply.github.com> Date: Sat, 7 Mar 2026 01:47:00 +0100 Subject: [PATCH] [rust-magic-release] fix: publish crates in topological order --- rust/magic-release.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/rust/magic-release.sh b/rust/magic-release.sh index c7f07eb..8265d42 100755 --- a/rust/magic-release.sh +++ b/rust/magic-release.sh @@ -7,17 +7,29 @@ CRATES_TOKEN="${PLUGIN_CRATES_IO_TOKEN}" REPO_FULL_NAME="${CI_REPO}" API_URL="https://codeberg.org/api/v1/repos/${REPO_FULL_NAME}" -# --- Get Workspace Packages in Topological Order --- -PACKAGES=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages | .[] | select(.publish != []) | "\(.name) \(.version) \(.manifest_path)"') +# Get workspace members in topological order (dependencies first) +# We use 'tac' because 'cargo tree' puts the "roots" at the top. +# Reversing it ensures "leaves" (dependencies) are published first. +ORDERED_CRATES=$(cargo tree --workspace --depth 0 --prefix none --format "{p}" | awk '{print $1}' | tac) + +# Get all package metadata in one go +# Use jq to re-sort the metadata to match the ORDERED_NAMES +PACKAGES=$(cargo metadata --format-version 1 --no-deps | jq -r --arg names "$ORDERED_CRATES" ' + ($names | split("\n")) as $order + | [.packages[] | select(.publish != [])] as $pkgs + | $order[] as $name + | $pkgs[] | select(.name == $name) + | "\(.name) \(.version) \(.manifest_path)" +') if [ -z "$PACKAGES" ]; then - echo "No publishable packages found in workspace." + echo "No publishable packages found." exit 0 fi echo "Starting release process..." -# --- 3. Process each package --- +# --- Process each package --- echo "$PACKAGES" | while read -r PKG_NAME PKG_VERSION MANIFEST_PATH; do TAG_NAME="${PKG_NAME}-v${PKG_VERSION}"