(feat) updater installs from PyPi instead of GitHub releases

This commit is contained in:
Millun Atluri 2023-12-19 09:30:40 +11:00
parent aefa828237
commit 16b7246412

View File

@ -8,6 +8,7 @@ import platform
import pkg_resources import pkg_resources
import psutil import psutil
import requests import requests
from distutils.version import LooseVersion
from rich import box, print from rich import box, print
from rich.console import Console, group from rich.console import Console, group
from rich.panel import Panel from rich.panel import Panel
@ -31,10 +32,6 @@ else:
console = Console(style=Style(color="grey74", bgcolor="grey19")) console = Console(style=Style(color="grey74", bgcolor="grey19"))
def get_versions() -> dict:
return requests.get(url=INVOKE_AI_REL).json()
def invokeai_is_running() -> bool: def invokeai_is_running() -> bool:
for p in psutil.process_iter(): for p in psutil.process_iter():
try: try:
@ -50,6 +47,21 @@ def invokeai_is_running() -> bool:
return False return False
def get_pypi_versions():
url = f"https://pypi.org/pypi/invokeai/json"
try:
data = requests.get(url).json()
except:
raise Exception("Unable to fetch version information from PyPi")
versions = list(data["releases"].keys())
versions.sort(key=LooseVersion, reverse=True)
latest_version = [v for v in versions if 'rc' not in v][0]
latest_release_candidate = [v for v in versions if 'rc' in v][0]
return latest_version, latest_release_candidate
def welcome(latest_release: str, latest_prerelease: str): def welcome(latest_release: str, latest_prerelease: str):
@group() @group()
def text(): def text():
@ -63,8 +75,7 @@ def welcome(latest_release: str, latest_prerelease: str):
yield "[bold yellow]Options:" yield "[bold yellow]Options:"
yield f"""[1] Update to the latest [bold]official release[/bold] ([italic]{latest_release}[/italic]) yield f"""[1] Update to the latest [bold]official release[/bold] ([italic]{latest_release}[/italic])
[2] Update to the latest [bold]pre-release[/bold] (may be buggy; caveat emptor!) ([italic]{latest_prerelease}[/italic]) [2] Update to the latest [bold]pre-release[/bold] (may be buggy; caveat emptor!) ([italic]{latest_prerelease}[/italic])
[3] Manually enter the [bold]tag name[/bold] for the version you wish to update to [3] Manually enter the [bold]version[/bold] you wish to update to"""
[4] Manually enter the [bold]branch name[/bold] for the version you wish to update to"""
console.rule() console.rule()
print( print(
@ -91,45 +102,37 @@ def get_extras():
return extras return extras
def main(): def main():
versions = get_versions()
released_versions = [x for x in versions if not (x["draft"] or x["prerelease"])]
prerelease_versions = [x for x in versions if not x["draft"] and x["prerelease"]]
latest_release = released_versions[0]["tag_name"] if len(released_versions) else None
latest_prerelease = prerelease_versions[0]["tag_name"] if len(prerelease_versions) else None
if invokeai_is_running(): if invokeai_is_running():
print(":exclamation: [bold red]Please terminate all running instances of InvokeAI before updating.[/red bold]") print(":exclamation: [bold red]Please terminate all running instances of InvokeAI before updating.[/red bold]")
input("Press any key to continue...") input("Press any key to continue...")
return return
latest_release, latest_prerelease = get_pypi_versions()
welcome(latest_release, latest_prerelease) welcome(latest_release, latest_prerelease)
tag = None
branch = None release = latest_release
release = None choice = Prompt.ask("Choice:", choices=["1", "2", "3"], default="1")
choice = Prompt.ask("Choice:", choices=["1", "2", "3", "4"], default="1")
if choice == "1": if choice == "1":
release = latest_release release = latest_release
elif choice == "2": elif choice == "2":
release = latest_prerelease release = latest_prerelease
elif choice == "3": elif choice == "3":
while not tag: release = Prompt.ask("Enter an InvokeAI version name")
tag = Prompt.ask("Enter an InvokeAI tag name")
elif choice == "4":
while not branch:
branch = Prompt.ask("Enter an InvokeAI branch name")
extras = get_extras() extras = get_extras()
print(f":crossed_fingers: Upgrading to [yellow]{tag or release or branch}[/yellow]") print(f":crossed_fingers: Upgrading to [yellow]{release}[/yellow]")
if release: cmd = f'pip install "invokeai{extras}=={release}" --use-pep517 --upgrade'
cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_SRC}/{release}.zip" --use-pep517 --upgrade'
elif tag:
cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_TAG}/{tag}.zip" --use-pep517 --upgrade'
else:
cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_BRANCH}/{branch}.zip" --use-pep517 --upgrade'
print("") print("")
print("") print("")
if os.system(cmd) == 0: if os.system(cmd) == 0: