Skip to content

Commit cd94b06

Browse files
ci: add cargo publish job on release
1 parent 0299e00 commit cd94b06

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

.github/workflows/release.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,9 @@ jobs:
7777
GIT_AUTHOR_EMAIL: ${{ vars.BOT_GIT_AUTHOR_EMAIL }}
7878
GIT_COMMITTER_NAME: ${{ vars.BOT_GIT_COMMITTER_NAME }}
7979
GIT_COMMITTER_EMAIL: ${{ vars.BOT_GIT_COMMITTER_EMAIL }}
80+
81+
- name: Publish crates to crates.io
82+
env:
83+
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
84+
run: |
85+
./scripts/cargo-publish.sh

scripts/cargo-publish.sh

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/bin/bash -e
2+
3+
crate_name() {
4+
local cargo_toml=$1
5+
grep '^name =' "$cargo_toml" | awk -F '=' '{print $2}' | tr -d '[:space:]"'
6+
}
7+
8+
crate_dependencies() {
9+
local cargo_toml=$1
10+
11+
# Extract dependency names and dev dependency names from Cargo.toml
12+
awk '
13+
BEGIN { in_dependencies = 0; }
14+
/^\[dependencies\]$/ { in_dependencies = 1; next }
15+
/^\[dev-dependencies\]$/ { in_dependencies = 1; next }
16+
/^\[/ { in_dependencies = 0 }
17+
in_dependencies && /^[a-zA-Z0-9_-]+/ { gsub(/\.workspace/, "", $1); gsub(/[[:space:]]/, "", $1); dependencies[$1] }
18+
END {
19+
for (dependency in dependencies) print dependency;
20+
}
21+
' "$cargo_toml" | sort | uniq | tr '\n' ' '
22+
}
23+
24+
crate_dependency_graph=()
25+
26+
topological_sort_crates() {
27+
local sorted_nodes=()
28+
29+
sort_crate_node() {
30+
local node=$1
31+
local edges=$2
32+
33+
for edge in $edges; do
34+
if [[ ! "${sorted_nodes[*]}" =~ $edge ]]; then
35+
for crate_dependencies_pair in "${crate_dependency_graph[@]}"; do
36+
if [[ "${crate_dependencies_pair%%:*}" == "$edge" ]]; then
37+
sort_crate_node "$edge" "${crate_dependencies_pair#*:}"
38+
break
39+
fi
40+
done
41+
fi
42+
done
43+
44+
sorted_nodes+=("$node")
45+
}
46+
47+
for node_graph in "${crate_dependency_graph[@]}"; do
48+
local node=${node_graph%%:*}
49+
local edges=${node_graph#*:}
50+
51+
if [[ ! "${sorted_nodes[*]}" =~ $node ]]; then
52+
sort_crate_node "$node" "$edges"
53+
fi
54+
done
55+
56+
echo "${sorted_nodes[@]}"
57+
}
58+
59+
# Populate crate_dependency_graph
60+
while IFS= read -r cargo_toml; do
61+
crate_dependency_graph+=("$(crate_name "$cargo_toml"):$(crate_dependencies "$cargo_toml")")
62+
done < <(find . -type d -name target -prune -o \( -name Cargo.toml -type f ! -path './Cargo.toml' \) -print)
63+
64+
internal_crates_list=()
65+
filtered_crate_dependency_graph=()
66+
67+
# Populate internal_crates_list
68+
for crate_dependencies_pair in "${crate_dependency_graph[@]}"; do
69+
crate_name=${crate_dependencies_pair%%:*}
70+
internal_crates_list+=("$crate_name")
71+
done
72+
73+
# Remove external dependencies
74+
for crate_dependencies_pair in "${crate_dependency_graph[@]}"; do
75+
crate_name=${crate_dependencies_pair%%:*}
76+
read -r -a crate_dependencies <<< "${crate_dependencies_pair#*:}"
77+
crate_internal_dependencies=()
78+
79+
80+
for dependency in "${crate_dependencies[@]}"; do
81+
if [[ "${internal_crates_list[*]}" =~ $dependency ]]; then
82+
crate_internal_dependencies+=("$dependency")
83+
fi
84+
done
85+
86+
filtered_crate_dependency_graph+=("$crate_name:${crate_internal_dependencies[*]}")
87+
done
88+
89+
crate_dependency_graph=("${filtered_crate_dependency_graph[@]}")
90+
91+
for crate in $(topological_sort_crates); do
92+
cargo publish -p $crate
93+
done

0 commit comments

Comments
 (0)