2022-12-11 05:37:08 +00:00
#!/bin/bash
2023-01-28 21:55:28 +00:00
set -e
2023-12-10 02:08:23 +00:00
BCYAN = "\e[1;36m"
BBLUE = "\e[1;34m"
BYELLOW = "\e[1;33m"
BGREEN = "\e[1;32m"
RED = "\e[31m"
RESET = "\e[0m"
2022-12-11 05:37:08 +00:00
2023-12-09 02:03:47 +00:00
function is_bin_in_path {
builtin type -P " $1 " & >/dev/null
}
2023-12-10 02:08:23 +00:00
function git_show_ref {
git show-ref --dereference $1 --abbrev 7
}
function git_show {
git show -s --format= '%h %s' $1
}
cd " $( dirname " $0 " ) "
echo -e " ${ BYELLOW } This script must be run from the installer directory! ${ RESET } "
echo " The current working directory is $( pwd ) "
read -p "If that looks right, press any key to proceed, or CTRL-C to exit..."
echo
2023-12-09 05:49:41 +00:00
# Some machines only have `python3`, others have `python` - make an alias.
# We can use a function to approximate an alias within a non-interactive shell.
2023-12-09 02:03:47 +00:00
if ! is_bin_in_path python && is_bin_in_path python3; then
2023-12-10 02:08:23 +00:00
echo -e " Aliasing ${ BBLUE } python3 ${ RESET } to ${ BBLUE } python ${ RESET } ... "
2023-12-09 02:03:47 +00:00
function python {
python3 " $@ "
}
fi
2023-01-30 08:42:27 +00:00
if [ [ -v "VIRTUAL_ENV" ] ] ; then
# we can't just call 'deactivate' because this function is not exported
# to the environment of this script from the bash process that runs the script
2023-12-10 02:08:23 +00:00
echo -e " ${ BYELLOW } A virtual environment is activated. Please deactivate it before proceeding. ${ RESET } "
2023-01-30 08:42:27 +00:00
exit -1
fi
2023-12-09 02:03:47 +00:00
VERSION = $(
cd ..
python -c "from invokeai.version import __version__ as version; print(version)"
)
2023-01-01 17:54:45 +00:00
PATCH = ""
VERSION = " v ${ VERSION } ${ PATCH } "
2023-09-12 08:07:54 +00:00
LATEST_TAG = "v3-latest"
2022-12-11 05:37:08 +00:00
2023-12-10 02:08:23 +00:00
echo " Building installer for version $VERSION ... "
echo
echo -e " ${ BCYAN } $VERSION ${ RESET } "
git_show_ref tags/$VERSION
echo
echo -e " ${ BCYAN } $LATEST_TAG ${ RESET } "
git_show_ref tags/$LATEST_TAG
echo
echo -e " ${ BGREEN } HEAD ${ RESET } "
git_show
echo
echo -e -n " Tag ${ BGREEN } HEAD ${ RESET } with ${ BCYAN } ${ VERSION } ${ RESET } and ${ BCYAN } ${ LATEST_TAG } ${ RESET } , ${ RED } deleting existing tags on remote ${ RESET } ? "
read -e -p 'y/n [n]: ' input
2023-01-15 00:28:14 +00:00
RESPONSE = ${ input : = 'n' }
if [ " $RESPONSE " = = 'y' ] ; then
2023-12-10 02:08:23 +00:00
echo
echo -e " Deleting ${ BCYAN } ${ VERSION } ${ RESET } tag on remote... "
2023-07-16 01:48:04 +00:00
git push origin :refs/tags/$VERSION
2023-12-10 02:08:23 +00:00
echo -e " Tagging ${ BGREEN } HEAD ${ RESET } with ${ BCYAN } ${ VERSION } ${ RESET } locally... "
2023-12-09 02:03:47 +00:00
if ! git tag -fa $VERSION ; then
echo "Existing/invalid tag"
exit -1
2023-01-15 00:28:14 +00:00
fi
2023-02-05 15:24:09 +00:00
2023-12-10 02:08:23 +00:00
echo -e " Deleting ${ BCYAN } ${ LATEST_TAG } ${ RESET } tag on remote... "
2023-02-04 17:00:17 +00:00
git push origin :refs/tags/$LATEST_TAG
2023-12-10 02:08:23 +00:00
echo -e " Tagging ${ BGREEN } HEAD ${ RESET } with ${ BCYAN } ${ LATEST_TAG } ${ RESET } locally... "
2023-02-04 17:00:17 +00:00
git tag -fa $LATEST_TAG
2023-02-23 12:08:41 +00:00
2023-12-10 02:08:23 +00:00
echo
echo -e " ${ BYELLOW } Remember to 'git push origin --tags'! ${ RESET } "
2023-01-15 00:28:14 +00:00
fi
2023-01-01 17:54:45 +00:00
2023-12-09 02:03:47 +00:00
# ---------------------- FRONTEND ----------------------
2023-12-10 02:08:23 +00:00
pushd ../invokeai/frontend/web >/dev/null
echo
echo "Installing frontend dependencies..."
echo
pnpm i --frozen-lockfile
echo
echo "Building frontend..."
echo
pnpm build
popd
2023-12-09 02:03:47 +00:00
# ---------------------- BACKEND ----------------------
2023-01-28 21:55:28 +00:00
2023-12-10 02:08:23 +00:00
echo
echo "Building wheel..."
echo
2023-01-28 21:55:28 +00:00
# install the 'build' package in the user site packages, if needed
# could be improved by using a temporary venv, but it's tiny and harmless
if [ [ $( python -c 'from importlib.util import find_spec; print(find_spec("build") is None)' ) = = "True" ] ] ; then
pip install --user build
fi
2023-12-09 09:33:17 +00:00
rm -rf ../build
2023-12-09 02:03:47 +00:00
2023-01-28 21:55:28 +00:00
python -m build --wheel --outdir dist/ ../.
# ----------------------
2023-12-10 02:08:23 +00:00
echo
echo " Building installer zip files for InvokeAI ${ VERSION } ... "
echo
2022-12-11 05:37:08 +00:00
# get rid of any old ones
2023-01-28 21:55:28 +00:00
rm -f *.zip
2022-12-11 05:37:08 +00:00
rm -rf InvokeAI-Installer
2023-01-28 21:55:28 +00:00
# copy content
mkdir InvokeAI-Installer
2023-02-07 21:35:22 +00:00
for f in templates lib *.txt *.reg; do
2023-01-28 21:55:28 +00:00
cp -r ${ f } InvokeAI-Installer/
done
2022-12-11 05:37:08 +00:00
2023-01-28 21:55:28 +00:00
# Move the wheel
2023-02-07 21:35:22 +00:00
mv dist/*.whl InvokeAI-Installer/lib/
2022-12-11 05:37:08 +00:00
2023-01-28 21:55:28 +00:00
# Install scripts
# Mac/Linux
2023-01-30 01:10:51 +00:00
cp install.sh.in InvokeAI-Installer/install.sh
chmod a+x InvokeAI-Installer/install.sh
2022-12-11 05:37:08 +00:00
2023-01-28 21:55:28 +00:00
# Windows
2023-12-09 02:03:47 +00:00
perl -p -e " s/^set INVOKEAI_VERSION=.*/set INVOKEAI_VERSION= $VERSION / " install.bat.in >InvokeAI-Installer/install.bat
2022-12-11 05:37:08 +00:00
cp WinLongPathsEnabled.reg InvokeAI-Installer/
2023-01-28 21:55:28 +00:00
# Zip everything up
zip -r InvokeAI-installer-$VERSION .zip InvokeAI-Installer
2022-12-11 05:37:08 +00:00
# clean up
2023-01-28 21:55:28 +00:00
rm -rf InvokeAI-Installer tmp dist
2022-12-11 05:37:08 +00:00
exit 0