util/publish: update to correctly handle dependencies between utils
#!/bin/sh
-set -e
-
ARG=""
if test "$1" != "--do-it"; then
ARG="--dry-run --allow-dirty"
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}
+
+set -e
for dir in src/uucore/ src/uucore_procs/ src/uu/stdbuf/src/libstdbuf/; do
(
cd "$dir"
@@ -15,10 +44,9 @@ for dir in src/uucore/ src/uucore_procs/ src/uu/stdbuf/src/libstdbuf/; do
sleep 2s
done
-PROGS=$(ls -1d src/uu/*/)
-for p in $PROGS; do
+for p in $TOTAL_ORDER; do
(
- cd "$p"
+ cd "src/uu/$p"
#shellcheck disable=SC2086
cargo publish $ARG
)
