stable-diffusion-aws-extension/pre-flight.sh

243 lines
9.4 KiB
Bash
Executable File

#!/bin/bash
# Usage: ./pre-flight_check.sh -p to do the pre-flight check for WebUI -s to auto sync the repo and plugin to compatible commit id
INITIAL_SUPPORT_COMMIT_ROOT=bda2ecdbf58fd33b4ad3036ed5cc13eef02747ae
INITIAL_SUPPORT_COMMIT_CONTROLNET=e67e017731aad05796b9615dc6eadce911298ea1
INITIAL_SUPPORT_COMMIT_DREAMBOOTH=c2a5617c587b812b5a408143ddfb18fc49234edf
INITIAL_SUPPORT_COMMIT_REMBG=3d9eedbbf0d585207f97d5b21e42f32c0042df70
INITIAL_SUPPORT_COMMIT_SAM=c555c6d9c4e1d14b018e4d2a92acd47765536585
INITIAL_SUPPORT_COMMIT_TILEDVAE=f9f8073e64f4e682838f255215039ba7884553bf
# built the initial support commit list from option or default value if not provided
INITIAL_SUPPORT_COMMIT_LIST=(
"${initial_support_commit_controlnet:-7c674f83}"
"${initial_support_commit_dreambooth:-926ae204}"
)
# Fixed repo URLs list
REPO_URL_LIST=(
"https://github.com/Mikubill/sd-webui-controlnet.git"
"https://github.com/d8ahazard/sd_dreambooth_extension.git"
"https://github.com/AUTOMATIC1111/stable-diffusion-webui-rembg.git"
"https://github.com/continue-revolution/sd-webui-segment-anything.git"
"https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111.git"
)
REPO_FOLDER_LIST=(
"sd-webui-controlnet"
"sd_dreambooth_extension"
"stable-diffusion-webui-rembg"
"sd-webui-segment-anything"
"multidiffusion-upscaler-for-automatic1111"
)
show_help() {
echo "Usage: $(basename "$0") [options]
-h/--help: to show this help;\n
-p/--pre-flight: to check version compatibility;\n
-s/--version-sync: to sync the repo and plugin to compatible commit id;\n
-f/--force: to force skip the folder check when sync the version";
}
# Function to get supported commit list
get_supported_commit_list() {
repo_url="$1"
initial_support_commit="$2"
latest_commit="$3"
# echo "the repo url is $repo_url and the initial support commit is $initial_support_commit and the latest commit is $latest_commit and current folder is $(pwd)"
# list all the commit ids start from the initial support commit to the latest commit
commit_ids=$(git rev-list --topo-order $initial_support_commit^..$latest_commit)
echo "$commit_ids"
}
# Function to get current commit id of existing repo
get_latest_commit_id() {
repo_url="$1"
git ls-remote "$repo_url" HEAD | cut -f1
}
pre_flight_check() {
echo -e "Start pre-flight check for WebUI..."
# check if root folder support
LATEST_ROOT_COMMIT=$(get_latest_commit_id "https://github.com/AUTOMATIC1111/stable-diffusion-webui.git")
# echo -e "Latest commit id for WebUI: \n$LATEST_ROOT_COMMIT"
SUPPORTED_ROOT_COMMITS=$(cd ../../ && get_supported_commit_list "https://github.com/AUTOMATIC1111/stable-diffusion-webui.git" "$INITIAL_SUPPORT_COMMIT_ROOT" "$LATEST_ROOT_COMMIT")
# echo -e "Supported commit ids for WebUI: \n$SUPPORTED_ROOT_COMMITS"
# get current commit id for repo
CUR_ROOT_COMMIT=$(cd ../../ && git rev-parse HEAD)
echo -e "Current commit id for WebUI: $CUR_ROOT_COMMIT"
if [ -n "$LATEST_ROOT_COMMIT" ]; then
if ! echo "$SUPPORTED_ROOT_COMMITS" | grep -q "$CUR_ROOT_COMMIT"; then
# warn with red color
echo "Warning: WebUI's latest commit is not in the minimum supported commit list."
echo -e "\033[31mPreflight check for WebUI is failed.\033[0m"
echo -e "==========================================================================="
echo
else
echo "WebUI's latest commit is in the minimum supported commit list."
echo -e "\033[34mPreflight check for WebUI is successful.\033[0m"
echo -e "==========================================================================="
echo
fi
fi
# Get the parent directory of the script
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
PARENT_DIR=$(dirname "$SCRIPT_DIR")
# Set the repo paths based on the parent directory
for repo_folder in "${REPO_FOLDER_LIST[@]}"; do
# set index to increment
index=$((index+1))
# check if the repo folder exists
if [ -d "${PARENT_DIR}/${repo_folder}/.git" ]; then
echo -e "Repo ${repo_folder} exists in the parent directory of the script."
# cd to the repo folder
cd "${PARENT_DIR}/${repo_folder}"
# get the current commit id for the repo
LATEST_COMMIT=$(get_latest_commit_id "${REPO_URL_LIST[$index-1]}")
# echo -e "Latest commit id for Repo ${repo_folder}: \n$LATEST_COMMIT"
# use such index to set the repo url
SUPPORTED_COMMITS=$(get_supported_commit_list "${REPO_URL_LIST[$index-1]}" "${INITIAL_SUPPORT_COMMIT_LIST[$index-1]}" "$LATEST_COMMIT")
# echo -e "Supported commit ids for Repo ${repo_folder} are \n$SUPPORTED_COMMITS"
CUR_COMMIT=$(git rev-parse HEAD)
# check if the latest commit id is in the scope of the supported commit list, warn the user if not, and hint success if yes
if [ -n "$LATEST_COMMIT" ]; then
if ! echo "$SUPPORTED_COMMITS" | grep -q "$CUR_COMMIT"; then
# warn with red color
echo "Warning: Repo ${repo_folder}'s latest commit is not in the minimum supported commit list."
echo -e "\033[31mPreflight check for Repo ${repo_folder} is failed.\033[0m"
echo -e "==========================================================================="
echo
else
echo "Repo ${repo_folder}'s latest commit is in the minimum supported commit list."
echo -e "\033[34mPreflight check for Repo ${repo_folder} is successful.\033[0m"
echo -e "==========================================================================="
echo
fi
fi
# back to the parent directory
cd "$PARENT_DIR"
fi
done
}
version_sync() {
echo -e "Start version sync for WebUI, make sure the extension folder is empty..."
# check if the extension folder is empty and force option is not included
if [ "$(ls -A ../../extensions)" ] && [ "$1" != "-f" ] && [ "$1" != "--force" ]; then
echo "The extension folder is not empty, continue to sync the version will overwrite the existing files."
# confirm to proceed
read -p "Do you want to proceed? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Exiting..."
exit 1
fi
fi
cd ../../
# Reset to specific commit
git checkout master
git pull
git reset --hard ${INITIAL_SUPPORT_COMMIT_ROOT}
# Go to "extensions" directory
cd extensions
# Clone stable-diffusion-aws-extension if not exist
if [ ! -d "stable-diffusion-aws-extension" ]; then
git clone https://github.com/awslabs/stable-diffusion-aws-extension.git
fi
# Checkout aigc branch
cd stable-diffusion-aws-extension
cd ..
# Clone sd-webui-controlnet if not exist
if [ ! -d "sd-webui-controlnet" ]; then
git clone https://github.com/Mikubill/sd-webui-controlnet.git
fi
# Go to sd-webui-controlnet directory and reset to specific commit
cd sd-webui-controlnet
git checkout main
git pull
git reset --hard ${INITIAL_SUPPORT_COMMIT_CONTROLNET}
cd ..
# Clone sd_dreambooth_extension if not exist
if [ ! -d "sd_dreambooth_extension" ]; then
git clone https://github.com/d8ahazard/sd_dreambooth_extension.git
fi
# Go to sd_dreambooth_extension directory and reset to specific commit
cd sd_dreambooth_extension
git checkout main
git pull
git reset --hard ${INITIAL_SUPPORT_COMMIT_DREAMBOOTH}
cd ..
# Clone stable-diffusion-webui-rembg
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui-rembg.git
# Go to stable-diffusion-webui-rembg directory and reset to specific commit
cd stable-diffusion-webui-rembg
git reset --hard ${INITIAL_SUPPORT_COMMIT_REMBG}
cd ..
# Clone sd-webui-segment-anything
git clone https://github.com/continue-revolution/sd-webui-segment-anything.git
# Go to sd-webui-segment-anything directory and reset to specific commit
cd sd-webui-segment-anything
git reset --hard ${INITIAL_SUPPORT_COMMIT_SAM}
cd ..
# Go to multidiffusion-upscaler-for-automatic1111 directory and reset to specific commit
cd multidiffusion-upscaler-for-automatic1111
git reset --hard ${INITIAL_SUPPORT_COMMIT_TILEDVAE}
cd ..
}
# Parse options with help of getopt
TEMP=$(getopt -o x:y:hpsf -l initial_support_commit_controlnet:,initial_support_commit_dreambooth:,help,pre-flight,version-sync,force -n "$(basename "$0")" -- "$@")
eval set -- "$TEMP"
while true; do
case "$1" in
-x|--initial_support_commit_controlnet)
initial_support_commit_controlnet="$2"
shift 2
;;
-y|--initial_support_commit_dreambooth)
initial_support_commit_dreambooth="$2"
shift 2
;;
-p|--pre-flight)
pre_flight_check
exit
;;
-s|--version-sync)
version_sync
exit
;;
-f|--force)
version_sync -f
exit
;;
-h|--help)
show_help
exit
;;
--)
shift
break
;;
*)
echo "Internal error!"
exit 1
;;
esac
done