#!/bin/bash # Define source paths SOURCE_PATH="./mozilla-central" PATCHES_DIR="$SOURCE_PATH/Spitfire" SOURCE_REPO="https://hg.mozilla.org/mozilla-central" PATCHES_REPO="https://weforgecode.xyz/Spitfire/Browser.git" SOURCE_PATH=$(realpath "$SOURCE_PATH") || { echo "Failed to resolve SOURCE_PATH. Exiting."; exit 1; } PATCHES_DIR=$(realpath "$PATCHES_DIR") || { echo "Failed to resolve PATCHES_DIR. Exiting."; exit 1; } # Array to store errors errors=() # Function to download Mozilla source if not present download_source() { if [ ! -d "$SOURCE_PATH" ]; then echo "Mozilla source not found. Cloning from repository..." hg clone "$SOURCE_REPO" "$SOURCE_PATH" || errors+=("Failed to clone Mozilla repository.") else echo "Mozilla source already exists." fi } # Function to discard uncommitted changes discard_changes() { echo "Discarding uncommitted changes..." hg revert --all --no-backup -R "$SOURCE_PATH" || errors+=("Failed to revert changes in Mozilla repository.") } # Function to clean build clean_build() { echo "Cleaning build..." cd "$SOURCE_PATH" || { errors+=("Failed to navigate to source directory."); return; } hg revert --all --no-backup || errors+=("Failed to revert changes in Mozilla repository.") ./mach clobber || errors+=("Failed to clean build.") } # Function to update Mozilla repository update_repo() { echo "Updating Mozilla repository..." cd "$SOURCE_PATH" || { errors+=("Failed to navigate to source directory."); return; } hg pull -u || errors+=("Failed to update Mozilla repository.") } # Function to update patches update_patches() { echo "Updating patches..." if [ -d "$PATCHES_DIR" ]; then echo "Patches directory already exists. Cleaning and pulling updates..." cd "$PATCHES_DIR" || { errors+=("Failed to navigate to patches directory."); return; } git clean -xdf || errors+=("Failed to clean patches directory.") git stash push --include-untracked || echo "No local changes to save." git fetch || errors+=("Failed to fetch updates from patches repository.") if git show-ref --verify --quiet refs/heads/main; then git rebase origin/main || errors+=("Failed to rebase updates from main branch.") elif git show-ref --verify --quiet refs/heads/master; then git rebase origin/master || errors+=("Failed to rebase updates from master branch.") else errors+=("No valid branch (main or master) found in patches repository.") return fi # Check if there are any stashes before popping if git stash list | grep -q 'stash@{0}'; then git stash pop || errors+=("Failed to apply and drop stashed changes.") else echo "No stash entries found, skipping pop." fi else echo "Patches directory does not exist. Cloning repository..." git clone "$PATCHES_REPO" "$PATCHES_DIR" || errors+=("Failed to clone patches repository.") fi echo "Copying files from patches directory to Firefox source directory..." rsync -av --exclude='.git' "$PATCHES_DIR/" "$SOURCE_PATH/" || errors+=("Failed to copy files.") } # Function to configure Spitfire configure() { echo "Configuring Spitfire..." cd "$SOURCE_PATH" || { errors+=("Failed to navigate to source directory."); return; } ./mach configure || errors+=("Configuration failed.") } # Function to build Spitfire build() { echo "Building Spitfire..." cd "$SOURCE_PATH" || { errors+=("Failed to navigate to source directory."); return; } ./mach build || errors+=("Build failed.") } # Function to run the project after build run_project() { echo "Running the project..." cd "$SOURCE_PATH" || { errors+=("Failed to navigate to browser directory."); return; } ./mach run || errors+=("Failed to run the project.") } # Function to print usage instructions print_help() { echo "Usage: ./builder.sh [options]" echo "Options:" echo " -a, --all : Perform all steps (build, clean, update)" echo " -b, --build : Build Spitfire" echo " -c, --clean : Clean build" echo " -u, --update : Update Mozilla repository" echo " -p, --patches : Update patches" echo " -r, --run : Run the project after build using mach run in the browser directory" echo " -h, --help : Display this help message" exit 0 } # Parse command line arguments while [[ $# -gt 0 ]]; do key="$1" case $key in -a|--all) all=true ;; -b|--build) build=true ;; -c|--clean) clean=true ;; -u|--update) update=true ;; -p|--patches) patches=true ;; -r|--run) run=true ;; -h|--help) print_help ;; *) echo "Invalid option: $key" print_help ;; esac shift done # Main script execution based on flags if [ "$all" = true ]; then download_source discard_changes clean_build update_repo update_patches configure build if [ "$run" = true ]; then run_project fi echo "Spitfire build completed successfully." elif [ "$build" = true ]; then configure build if [ "$run" = true ]; then run_project fi echo "Spitfire build completed successfully." elif [ "$clean" = true ]; then clean_build echo "Cleaned Firefox build." elif [ "$update" = true ]; then download_source update_repo echo "Mozilla repository updated." elif [ "$patches" = true ]; then download_source update_patches echo "Patches updated." elif [ "$run" = true ]; then run_project else print_help fi # Print all collected errors at the end if [ ${#errors[@]} -ne 0 ]; then echo "The following errors occurred during execution:" for error in "${errors[@]}"; do echo "- $error" done fi exit 0