From 7f0e1213b545af6475b7123e6c2f7363eecd8648 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 17 Feb 2024 22:43:42 +0100 Subject: [PATCH] add the publish script --- util/publish.sh | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100755 util/publish.sh diff --git a/util/publish.sh b/util/publish.sh new file mode 100755 index 0000000..b422630 --- /dev/null +++ b/util/publish.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# spell-checker:ignore uuhelp +ARG="" +if test "$1" != "--do-it"; then + ARG="--dry-run --allow-dirty" +fi + +# Function to check if the crate is already published +is_already_published() { + local crate_name=$1 + local crate_version=$2 + + # Use the crates.io API to get the latest version of the crate + local latest_published_version + latest_published_version=$(curl -s https://crates.io/api/v1/crates/$crate_name | jq -r '.crate.max_version') + + if [ "$latest_published_version" = "$crate_version" ]; then + return 0 + else + return 1 + fi +} + +# Figure out any dependencies between the util via Cargo.toml +# We store this as edges in a graph with each line: +# [dependent] [dependency] +# We use ROOT as a the node that should come before all other nodes. +PROGS=$(ls -1d src/uu/*/) +PARTIAL_ORDER="" +for p in $PROGS; do + DEPENDENCIES=$(grep -oE "^uu_[a-z0-9]+" ${p}Cargo.toml) + + # Turn "src/uu/util/" into "util" + p=${p#src/uu/} + p=${p%/} + + PARTIAL_ORDER+="$p ROOT\n" + while read d; do + if [ $d ]; then + # Remove "uu_" prefix + d=${d#uu_} + + PARTIAL_ORDER+="$p $d\n" + fi + done <<<"$DEPENDENCIES" +done + +# Apply tsort to get the order in which to publish the crates +TOTAL_ORDER=$(echo -e $PARTIAL_ORDER | tsort | tac) + +# Remove the ROOT node from the start +TOTAL_ORDER=${TOTAL_ORDER#ROOT} + +CRATE_VERSION=$(grep '^version' Cargo.toml | head -n1 | cut -d '"' -f2) + +set -e + +for p in $TOTAL_ORDER; do + ( + cd "src/uu/$p" + CRATE_NAME=$(grep '^name =' "Cargo.toml" | head -n1 | cut -d '"' -f2) + #shellcheck disable=SC2086 + if ! is_already_published "$CRATE_NAME" "$CRATE_VERSION"; then + cargo publish $ARG + else + echo "Skip: $CRATE_NAME $CRATE_VERSION already published" + fi + ) +done + +#shellcheck disable=SC2086 +cargo publish $ARG