diff --git a/installer/templates/invoke.bat.in b/installer/templates/invoke.bat.in index f1a5ca5ef2..ca6f7f846a 100644 --- a/installer/templates/invoke.bat.in +++ b/installer/templates/invoke.bat.in @@ -12,9 +12,10 @@ echo 2. browser-based UI echo 3. run textual inversion training echo 4. merge models (diffusers type only) echo 5. re-run the configure script to download new models -echo 6. open the developer console -echo 7. command-line help -set /P restore="Please enter 1, 2, 3, 4, 5, 6 or 7: [2] " +echo 6. update InvokeAI +echo 7. open the developer console +echo 8. command-line help +set /P restore="Please enter 1, 2, 3, 4, 5, 6, 7 or 8: [2] " if not defined restore set restore=2 IF /I "%restore%" == "1" ( echo Starting the InvokeAI command-line.. @@ -32,6 +33,9 @@ IF /I "%restore%" == "1" ( echo Running invokeai-configure... python .venv\Scripts\invokeai-configure.exe %* ) ELSE IF /I "%restore%" == "6" ( + echo Running invokeai-update... + python .venv\Scripts\invokeai-update.exe %* +) ELSE IF /I "%restore%" == "7" ( echo Developer Console echo Python command is: where python @@ -43,7 +47,7 @@ IF /I "%restore%" == "1" ( echo ************************* echo *** Type `exit` to quit this shell and deactivate the Python virtual environment *** call cmd /k -) ELSE IF /I "%restore%" == "7" ( +) ELSE IF /I "%restore%" == "8" ( echo Displaying command line help... python .venv\Scripts\invokeai.exe --help %* pause diff --git a/installer/templates/invoke.sh.in b/installer/templates/invoke.sh.in index 5c08d7c23b..f52442dbae 100644 --- a/installer/templates/invoke.sh.in +++ b/installer/templates/invoke.sh.in @@ -30,11 +30,12 @@ if [ "$0" != "bash" ]; then echo "2. browser-based UI" echo "3. run textual inversion training" echo "4. merge models (diffusers type only)" - echo "5. open the developer console" - echo "6. re-run the configure script to download new models" - echo "7. command-line help " + echo "5. re-run the configure script to download new models" + echo "6. update InvokeAI" + echo "7. open the developer console" + echo "8. command-line help" echo "" - read -p "Please enter 1, 2, 3, 4, 5, 6 or 7: [2] " yn + read -p "Please enter 1, 2, 3, 4, 5, 6, 7 or 8: [2] " yn choice=${yn:='2'} case $choice in 1) @@ -54,14 +55,19 @@ if [ "$0" != "bash" ]; then exec invokeai-merge --gui $@ ;; 5) + echo "Configuration:" + exec invokeai-configure --root ${INVOKEAI_ROOT} + ;; + 6) + echo "Update:" + exec invokeai-update + ;; + 7) echo "Developer Console:" file_name=$(basename "${BASH_SOURCE[0]}") bash --init-file "$file_name" ;; - 6) - exec invokeai-configure --root ${INVOKEAI_ROOT} - ;; - 7) + 8) exec invokeai --help ;; *) diff --git a/ldm/invoke/_version.py b/ldm/invoke/_version.py index 5a0f2532eb..1a5b0e6b87 100644 --- a/ldm/invoke/_version.py +++ b/ldm/invoke/_version.py @@ -1 +1 @@ -__version__='2.3.0' +__version__='2.3.1+a0' diff --git a/ldm/invoke/config/invokeai_update.py b/ldm/invoke/config/invokeai_update.py new file mode 100644 index 0000000000..8ad7290136 --- /dev/null +++ b/ldm/invoke/config/invokeai_update.py @@ -0,0 +1,88 @@ +''' +Minimalist updater script. Prompts user for the tag or branch to update to and runs +pip install . +''' +import os +import platform +import requests +from rich import box, print +from rich.console import Console, Group, group +from rich.panel import Panel +from rich.prompt import Prompt +from rich.style import Style +from rich.syntax import Syntax +from rich.text import Text + +from ldm.invoke import __version__ + +INVOKE_AI_SRC="https://github.com/invoke-ai/InvokeAI/archive" +INVOKE_AI_REL="https://api.github.com/repos/invoke-ai/InvokeAI/releases" + +OS = platform.uname().system +ARCH = platform.uname().machine + +if OS == "Windows": + # Windows terminals look better without a background colour + console = Console(style=Style(color="grey74")) +else: + console = Console(style=Style(color="grey74", bgcolor="grey19")) + +def get_versions()->dict: + return requests.get(url=INVOKE_AI_REL).json() + +def welcome(versions: dict): + + @group() + def text(): + yield f'InvokeAI Version: [bold yellow]{__version__}' + yield '' + yield 'This script will update InvokeAI to the latest release, or to a development version of your choice.' + yield '' + yield '[bold yellow]Options:' + yield f'''[1] Update to the latest official release ([italic]{versions[0]['tag_name']}[/italic]) +[2] Update to the bleeding-edge development version ([italic]main[/italic]) +[3] Manually enter the tag or branch name you wish to update''' + + console.rule() + print( + Panel( + title="[bold wheat1]InvokeAI Updater", + renderable=text(), + box=box.DOUBLE, + expand=True, + padding=(1, 2), + style=Style(bgcolor="grey23", color="orange1"), + subtitle=f"[bold grey39]{OS}-{ARCH}", + ) + ) + console.line() + +def main(): + versions = get_versions() + welcome(versions) + + tag = None + choice = Prompt.ask('Choice:',choices=['1','2','3'],default='1') + + if choice=='1': + tag = versions[0]['tag_name'] + elif choice=='2': + tag = 'main' + elif choice=='3': + tag = Prompt.ask('Enter an InvokeAI tag or branch name') + + print(f':crossed_fingers: Upgrading to [yellow]{tag}[/yellow]') + cmd = f'pip install {INVOKE_AI_SRC}/{tag}.zip --use-pep517' + print('') + print('') + if os.system(cmd)==0: + print(f':heavy_check_mark: Upgrade successful') + else: + print(f':exclamation: [bold red]Upgrade failed[/red bold]') + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass + diff --git a/pyproject.toml b/pyproject.toml index f3dfa69b91..fb8dd466e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,7 @@ dependencies = [ "invokeai-configure" = "ldm.invoke.config.invokeai_configure:main" "invokeai-merge" = "ldm.invoke.merge_diffusers:main" # note name munging "invokeai-ti" = "ldm.invoke.training.textual_inversion:main" +"invokeai-update" = "ldm.invoke.config.invokeai_update:main" [project.urls] "Homepage" = "https://invoke-ai.github.io/InvokeAI/"