-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfix_module_order.sh
More file actions
executable file
·155 lines (125 loc) · 4.27 KB
/
fix_module_order.sh
File metadata and controls
executable file
·155 lines (125 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/env bash
# Script to fix module loading order based on dependencies
echo "=== Fixing SENTINEL Module Load Order ==="
echo
export SENTINEL_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)"
MODULES_DIR="${SENTINEL_ROOT}/bash_modules.d"
MODULES_FILE="${SENTINEL_ROOT}/.bash_modules"
# Create a dependency graph
declare -A MODULE_DEPS
declare -A MODULE_EXISTS
# Read all modules and their dependencies
for module_file in "$MODULES_DIR"/*.module "$MODULES_DIR"/*.sh; do
[[ ! -f "$module_file" ]] && continue
module_name=$(basename "$module_file" | sed 's/\.\(module\|sh\)$//')
# Skip non-module files
[[ "$module_name" == "migrate_config" || "$module_name" == "install-autocomplete" ]] && continue
MODULE_EXISTS["$module_name"]=1
# Get dependencies
if grep -q "SENTINEL_MODULE_DEPENDENCIES=" "$module_file"; then
deps=$(grep "SENTINEL_MODULE_DEPENDENCIES=" "$module_file" | head -n1 | sed 's/.*="\(.*\)".*/\1/')
MODULE_DEPS["$module_name"]="$deps"
else
MODULE_DEPS["$module_name"]=""
fi
done
# Function to perform topological sort
topological_sort() {
local -A in_degree
local -A adj_list
local -a queue
local -a result
# Initialize in-degree for all modules
for module in "${!MODULE_EXISTS[@]}"; do
in_degree["$module"]=0
adj_list["$module"]=""
done
# Build adjacency list and calculate in-degrees
for module in "${!MODULE_DEPS[@]}"; do
for dep in ${MODULE_DEPS["$module"]}; do
if [[ -n "${MODULE_EXISTS[$dep]}" ]]; then
adj_list["$dep"]+="$module "
((in_degree["$module"]++))
fi
done
done
# Find all modules with no dependencies
for module in "${!in_degree[@]}"; do
if [[ ${in_degree["$module"]} -eq 0 ]]; then
queue+=("$module")
fi
done
# Process the queue
while [[ ${#queue[@]} -gt 0 ]]; do
# Dequeue
local current="${queue[0]}"
queue=("${queue[@]:1}")
result+=("$current")
# Process all modules that depend on current
for dependent in ${adj_list["$current"]}; do
((in_degree["$dependent"]--))
if [[ ${in_degree["$dependent"]} -eq 0 ]]; then
queue+=("$dependent")
fi
done
done
# Output the sorted order
printf '%s\n' "${result[@]}"
}
# Get the correct order
echo "Calculating optimal module load order..."
SORTED_MODULES=$(topological_sort)
# Read current module list from .bash_modules
declare -a CURRENT_MODULES
declare -A MODULE_IN_LIST
if [[ -f "$MODULES_FILE" ]]; then
while IFS= read -r line; do
# Skip comments and empty lines
[[ -z "$line" || "$line" =~ ^# ]] && continue
MODULE_IN_LIST["$line"]=1
done < "$MODULES_FILE"
fi
# Create new module list with correct order
NEW_MODULES_FILE="${MODULES_FILE}.new"
cat > "$NEW_MODULES_FILE" << 'EOF'
# Always first (enforced by loader)
blesh_installer
EOF
# Add modules in dependency order
echo "# Core modules in dependency order" >> "$NEW_MODULES_FILE"
# First add modules without dependencies
for module in $SORTED_MODULES; do
if [[ "${MODULE_IN_LIST[$module]}" == "1" && -z "${MODULE_DEPS[$module]}" ]]; then
echo "$module" >> "$NEW_MODULES_FILE"
unset MODULE_IN_LIST["$module"]
fi
done
echo "" >> "$NEW_MODULES_FILE"
echo "# Modules with dependencies" >> "$NEW_MODULES_FILE"
# Then add modules with dependencies in sorted order
for module in $SORTED_MODULES; do
if [[ "${MODULE_IN_LIST[$module]}" == "1" ]]; then
echo "$module" >> "$NEW_MODULES_FILE"
fi
done
echo "" >> "$NEW_MODULES_FILE"
echo "# Add other modules below this line" >> "$NEW_MODULES_FILE"
# Show the changes
echo
echo "Current vs New module order:"
echo "==========================="
if command -v diff &>/dev/null; then
diff -u "$MODULES_FILE" "$NEW_MODULES_FILE" || true
fi
echo
read -p "Apply the new module order? (y/n): " apply
if [[ "$apply" == "y" ]]; then
# Backup current file
cp "$MODULES_FILE" "${MODULES_FILE}.bak"
# Apply new order
mv "$NEW_MODULES_FILE" "$MODULES_FILE"
echo "Module order updated! Backup saved to ${MODULES_FILE}.bak"
else
rm "$NEW_MODULES_FILE"
echo "Changes discarded."
fi