|
@@ -47,10 +47,13 @@ if [[ ! -d "$SOURCES_DIR/Invercargill-Json" ]]; then
|
|
|
}
|
|
}
|
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
-# Copy USM source
|
|
|
|
|
|
|
+# Copy USM source (USM's meson.build is in src/, not project root)
|
|
|
echo "Copying USM source..."
|
|
echo "Copying USM source..."
|
|
|
mkdir -p "$SOURCES_DIR/usm"
|
|
mkdir -p "$SOURCES_DIR/usm"
|
|
|
-cp -r "$USM_SOURCE_DIR" "$SOURCES_DIR/usm/src"
|
|
|
|
|
|
|
+# USM_SOURCE_DIR points to the src/ directory which contains meson.build
|
|
|
|
|
+# Copy the entire src directory contents to usm/
|
|
|
|
|
+cp -r "$USM_SOURCE_DIR"/* "$SOURCES_DIR/usm/" 2>/dev/null || true
|
|
|
|
|
+# Copy additional root level files for reference
|
|
|
cp "$USM_SOURCE_DIR/../MANIFEST.usm" "$SOURCES_DIR/usm/" 2>/dev/null || true
|
|
cp "$USM_SOURCE_DIR/../MANIFEST.usm" "$SOURCES_DIR/usm/" 2>/dev/null || true
|
|
|
cp "$USM_SOURCE_DIR/../usm.config" "$SOURCES_DIR/usm/" 2>/dev/null || true
|
|
cp "$USM_SOURCE_DIR/../usm.config" "$SOURCES_DIR/usm/" 2>/dev/null || true
|
|
|
|
|
|
|
@@ -69,107 +72,56 @@ set -e
|
|
|
|
|
|
|
|
SCRIPT_HEADER
|
|
SCRIPT_HEADER
|
|
|
|
|
|
|
|
-# Step 3: Combine all shell scripts
|
|
|
|
|
-# We need to rename the PM functions to avoid conflicts
|
|
|
|
|
|
|
+# Step 3: Auto-detect package manager implementations
|
|
|
|
|
+PM_IMPLEMENTATIONS=()
|
|
|
|
|
+for pm_file in "$SCRIPT_DIR"/pm_*.sh; do
|
|
|
|
|
+ if [[ -f "$pm_file" ]]; then
|
|
|
|
|
+ # Extract PM name from filename (pm_apt.sh -> apt)
|
|
|
|
|
+ pm_name=$(basename "$pm_file" .sh | sed 's/^pm_//')
|
|
|
|
|
+ # Skip pm_base.sh - it's the interface, not an implementation
|
|
|
|
|
+ if [[ "$pm_name" != "base" ]]; then
|
|
|
|
|
+ PM_IMPLEMENTATIONS+=("$pm_name")
|
|
|
|
|
+ fi
|
|
|
|
|
+ fi
|
|
|
|
|
+done
|
|
|
|
|
+
|
|
|
|
|
+echo " Detected package managers: ${PM_IMPLEMENTATIONS[*]}"
|
|
|
|
|
+
|
|
|
|
|
+# Step 4: Combine all shell scripts
|
|
|
COMBINED_FILE="$WORK_DIR/combined.sh"
|
|
COMBINED_FILE="$WORK_DIR/combined.sh"
|
|
|
|
|
|
|
|
-# Function to process a bash script (minify and adapt)
|
|
|
|
|
|
|
+# Build the PM implementations array initialization
|
|
|
|
|
+PM_ARRAY_FILE="$WORK_DIR/pm_array.sh"
|
|
|
|
|
+cat > "$PM_ARRAY_FILE" << PM_ARRAY
|
|
|
|
|
+# Auto-detected package manager implementations
|
|
|
|
|
+PM_IMPLEMENTATIONS=(${PM_IMPLEMENTATIONS[*]})
|
|
|
|
|
+
|
|
|
|
|
+PM_ARRAY
|
|
|
|
|
+
|
|
|
|
|
+# Function to process a script file
|
|
|
process_script() {
|
|
process_script() {
|
|
|
local file="$1"
|
|
local file="$1"
|
|
|
local section="$2"
|
|
local section="$2"
|
|
|
|
|
|
|
|
echo "# === $section ==="
|
|
echo "# === $section ==="
|
|
|
-
|
|
|
|
|
- # For PM files, we need to prefix the functions
|
|
|
|
|
- case "$section" in
|
|
|
|
|
- "Package Manager APT")
|
|
|
|
|
- # Rename functions with apt_ prefix
|
|
|
|
|
- sed -e 's/^pm_is_installed()/pm_apt_is_installed()/' \
|
|
|
|
|
- -e 's/^pm_get_package_name()/pm_apt_get_package_name()/' \
|
|
|
|
|
- -e 's/^pm_update()/pm_apt_update()/' \
|
|
|
|
|
- -e 's/^pm_install()/pm_apt_install()/' \
|
|
|
|
|
- -e 's/^get_missing_deps()/get_missing_deps_apt()/' \
|
|
|
|
|
- "$file"
|
|
|
|
|
- ;;
|
|
|
|
|
- "Package Manager DNF")
|
|
|
|
|
- # Rename functions with dnf_ prefix
|
|
|
|
|
- sed -e 's/^pm_is_installed()/pm_dnf_is_installed()/' \
|
|
|
|
|
- -e 's/^pm_get_package_name()/pm_dnf_get_package_name()/' \
|
|
|
|
|
- -e 's/^pm_update()/pm_dnf_update()/' \
|
|
|
|
|
- -e 's/^pm_install()/pm_dnf_install()/' \
|
|
|
|
|
- -e 's/^get_missing_deps()/get_missing_deps_dnf()/' \
|
|
|
|
|
- "$file"
|
|
|
|
|
- ;;
|
|
|
|
|
- *)
|
|
|
|
|
- cat "$file"
|
|
|
|
|
- ;;
|
|
|
|
|
- esac
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-# Create the dispatcher functions
|
|
|
|
|
-DISPATCHER_FILE="$WORK_DIR/dispatcher.sh"
|
|
|
|
|
-
|
|
|
|
|
-cat > "$DISPATCHER_FILE" << 'DISPATCHER'
|
|
|
|
|
-
|
|
|
|
|
-# === Package Manager Dispatcher ===
|
|
|
|
|
-# These functions dispatch to the appropriate PM implementation
|
|
|
|
|
-
|
|
|
|
|
-pm_is_installed() {
|
|
|
|
|
- case "$PM_TYPE" in
|
|
|
|
|
- apt) pm_apt_is_installed "$@" ;;
|
|
|
|
|
- dnf) pm_dnf_is_installed "$@" ;;
|
|
|
|
|
- esac
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-pm_get_package_name() {
|
|
|
|
|
- case "$PM_TYPE" in
|
|
|
|
|
- apt) pm_apt_get_package_name "$@" ;;
|
|
|
|
|
- dnf) pm_dnf_get_package_name "$@" ;;
|
|
|
|
|
- esac
|
|
|
|
|
|
|
+ cat "$file"
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pm_update() {
|
|
|
|
|
- case "$PM_TYPE" in
|
|
|
|
|
- apt) pm_apt_update "$@" ;;
|
|
|
|
|
- dnf) pm_dnf_update "$@" ;;
|
|
|
|
|
- esac
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-pm_install() {
|
|
|
|
|
- case "$PM_TYPE" in
|
|
|
|
|
- apt) pm_apt_install "$@" ;;
|
|
|
|
|
- dnf) pm_dnf_install "$@" ;;
|
|
|
|
|
- esac
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-get_missing_deps() {
|
|
|
|
|
- case "$PM_TYPE" in
|
|
|
|
|
- apt) get_missing_deps_apt "$@" ;;
|
|
|
|
|
- dnf) get_missing_deps_dnf "$@" ;;
|
|
|
|
|
- esac
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-DISPATCHER
|
|
|
|
|
-
|
|
|
|
|
-# Combine scripts in order - IMPORTANT:
|
|
|
|
|
-# 1. PM implementations (apt, dnf) come first with prefixed names
|
|
|
|
|
-# 2. Dispatcher comes next to provide the generic interface
|
|
|
|
|
-# 3. pm_base.sh uses the generic interface (get_missing_deps, etc.)
|
|
|
|
|
-# 4. main.sh and others come last
|
|
|
|
|
|
|
+# Combine scripts in order
|
|
|
{
|
|
{
|
|
|
process_script "$SCRIPT_DIR/utils.sh" "Utils"
|
|
process_script "$SCRIPT_DIR/utils.sh" "Utils"
|
|
|
echo ""
|
|
echo ""
|
|
|
process_script "$SCRIPT_DIR/ui.sh" "UI"
|
|
process_script "$SCRIPT_DIR/ui.sh" "UI"
|
|
|
echo ""
|
|
echo ""
|
|
|
- # PM implementations first (with prefixed function names)
|
|
|
|
|
- process_script "$SCRIPT_DIR/pm_apt.sh" "Package Manager APT"
|
|
|
|
|
- echo ""
|
|
|
|
|
- process_script "$SCRIPT_DIR/pm_dnf.sh" "Package Manager DNF"
|
|
|
|
|
- echo ""
|
|
|
|
|
- # Dispatcher provides the generic interface using PM_TYPE
|
|
|
|
|
- cat "$DISPATCHER_FILE"
|
|
|
|
|
|
|
+ # Include PM implementations first
|
|
|
|
|
+ for pm_name in "${PM_IMPLEMENTATIONS[@]}"; do
|
|
|
|
|
+ process_script "$SCRIPT_DIR/pm_${pm_name}.sh" "Package Manager ${pm_name}"
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ done
|
|
|
|
|
+ # Include PM array initialization
|
|
|
|
|
+ cat "$PM_ARRAY_FILE"
|
|
|
echo ""
|
|
echo ""
|
|
|
- # Now pm_base.sh can use the generic interface
|
|
|
|
|
|
|
+ # Include pm_base which uses the array
|
|
|
process_script "$SCRIPT_DIR/pm_base.sh" "Package Manager Base"
|
|
process_script "$SCRIPT_DIR/pm_base.sh" "Package Manager Base"
|
|
|
echo ""
|
|
echo ""
|
|
|
process_script "$SCRIPT_DIR/build_config.sh" "Build Config"
|
|
process_script "$SCRIPT_DIR/build_config.sh" "Build Config"
|
|
@@ -184,14 +136,14 @@ DISPATCHER
|
|
|
# Replace version placeholder in combined file
|
|
# Replace version placeholder in combined file
|
|
|
sed -i "s/@VERSION@/$VERSION/g" "$COMBINED_FILE"
|
|
sed -i "s/@VERSION@/$VERSION/g" "$COMBINED_FILE"
|
|
|
|
|
|
|
|
-# Step 4: Create the payload
|
|
|
|
|
|
|
+# Step 5: Create the payload
|
|
|
echo "Creating compressed payload..."
|
|
echo "Creating compressed payload..."
|
|
|
PAYLOAD_FILE="$WORK_DIR/payload.tar.xz"
|
|
PAYLOAD_FILE="$WORK_DIR/payload.tar.xz"
|
|
|
|
|
|
|
|
# Use highest compression for smaller file size
|
|
# Use highest compression for smaller file size
|
|
|
tar -C "$SOURCES_DIR" -cf - . | xz -9 -T0 > "$PAYLOAD_FILE"
|
|
tar -C "$SOURCES_DIR" -cf - . | xz -9 -T0 > "$PAYLOAD_FILE"
|
|
|
|
|
|
|
|
-# Step 5: Assemble final installer
|
|
|
|
|
|
|
+# Step 6: Assemble final installer
|
|
|
echo "Assembling final installer..."
|
|
echo "Assembling final installer..."
|
|
|
{
|
|
{
|
|
|
cat "$HEADER_FILE"
|
|
cat "$HEADER_FILE"
|