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