From 8808b1a222b558b816dde7ecf119ec202293b2a7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 17 Apr 2023 09:53:53 -0400 Subject: [PATCH] add setup auto-recover --- .pylintrc | 6 ++-- TODO.md | 3 +- extensions-builtin/sd-extension-system-info | 2 +- extensions-builtin/sd-webui-controlnet | 2 +- javascript/ui.js | 4 +++ modules/lora | 2 +- modules/middleware.py | 2 +- setup.py | 40 ++++++++++++++++----- 8 files changed, 44 insertions(+), 17 deletions(-) diff --git a/.pylintrc b/.pylintrc index f644719cb..72e1224e8 100644 --- a/.pylintrc +++ b/.pylintrc @@ -9,8 +9,10 @@ extension-pkg-whitelist= fail-on= fail-under=10 ignore=CVS -ignore-paths= -ignore-patterns=^\.# +ignore-paths=^repositories/.*$, + ^extensions/.*$, + /usr/lib/.*$, +ignore-patterns= ignored-modules= jobs=0 limit-inference-results=100 diff --git a/TODO.md b/TODO.md index 6da182fde..55fe98b2c 100644 --- a/TODO.md +++ b/TODO.md @@ -7,7 +7,6 @@ Stuff to be fixed... - Reconnect UI to ops in progress on browser restart - Redo Extensions tab: see - Cleanup & integrate CSS into single file -- Allow user themes - Replace PngInfo/EXIF metadata handler - Pick & merge PRs from main repo - Create new GitHub hooks/actions for CI/CD @@ -15,11 +14,11 @@ Stuff to be fixed... - Set defaults for Apple M1 - Revisit `torch.compile` - Ask to download default model -- Support UI restart on-the-fly - Stream-load as option - Dont spawn extensions installer - Remove `models` from git repo - Merge `Image Info` into `Process` +- Refresh theme list ## Integration diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info index 43df1adaa..44b70636c 160000 --- a/extensions-builtin/sd-extension-system-info +++ b/extensions-builtin/sd-extension-system-info @@ -1 +1 @@ -Subproject commit 43df1adaab1860eebcdb590a3827fc99b2247714 +Subproject commit 44b70636c194c5bf6a1a7b23e0b4c6f1bcdc8d7c diff --git a/extensions-builtin/sd-webui-controlnet b/extensions-builtin/sd-webui-controlnet index 0e74848e0..db097f4df 160000 --- a/extensions-builtin/sd-webui-controlnet +++ b/extensions-builtin/sd-webui-controlnet @@ -1 +1 @@ -Subproject commit 0e74848e0209044683e206c2820e62ec466b3ac7 +Subproject commit db097f4df734dec33f53cfe4b604ce336f6e3d16 diff --git a/javascript/ui.js b/javascript/ui.js index cca454040..61f75762e 100644 --- a/javascript/ui.js +++ b/javascript/ui.js @@ -336,6 +336,10 @@ function update_img2img_tokens(...args) { return args; } +function getTranslation(...args) { + return null +} + function update_token_counter(button_id) { if (token_timeouts[button_id]) clearTimeout(token_timeouts[button_id]); diff --git a/modules/lora b/modules/lora index 6d5f847ed..334589af4 160000 --- a/modules/lora +++ b/modules/lora @@ -1 +1 @@ -Subproject commit 6d5f847edc7eaf858aa6fe060c68875b8da7392a +Subproject commit 334589af4efb3dbb570eb551f4dd45cfc1cf052a diff --git a/modules/middleware.py b/modules/middleware.py index fbc50da9b..2301d1e60 100644 --- a/modules/middleware.py +++ b/modules/middleware.py @@ -68,7 +68,7 @@ def setup_middleware(app: FastAPI, cmd_opts): try: return await call_next(req) except CancelledError: - print('WebSocket closed') + print('WebSocket closed (ignore asyncio.exceptions.CancelledError)') except BaseException as e: return handle_exception(req, e) diff --git a/setup.py b/setup.py index 3a6954903..e826d745b 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,12 @@ import time import shutil import logging import subprocess -from modules.cmd_args import parser + +try: + from modules.cmd_args import parser +except: + import argparse + parser = argparse.ArgumentParser(description="Stable Diffusion", formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=55,indent_increment=2,width=200)) class Dot(dict): # dot notation access to dictionary attributes @@ -89,7 +94,8 @@ def install(package, friendly: str = None): result = subprocess.run(f'"{sys.executable}" -m pip {arg}', shell=True, check=False, env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE) txt = result.stdout.decode(encoding="utf8", errors="ignore") if len(result.stderr) > 0: - txt = txt + '\n' + result.stderr.decode(encoding="utf8", errors="ignore") + txt += ('\n' if len(txt) > 0 else '') + result.stderr.decode(encoding="utf8", errors="ignore") + txt = txt.strip() if result.returncode != 0: global errors # pylint: disable=global-statement errors += 1 @@ -102,13 +108,14 @@ def install(package, friendly: str = None): # execute git command -def git(arg: str): +def git(arg: str, ignore: bool = False): git_cmd = os.environ.get('GIT', "git") result = subprocess.run(f'"{git_cmd}" {arg}', check=False, shell=True, env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE) txt = result.stdout.decode(encoding="utf8", errors="ignore") if len(result.stderr) > 0: - txt = txt + '\n' + result.stderr.decode(encoding="utf8", errors="ignore") - if result.returncode != 0: + txt += ('\n' if len(txt) > 0 else '') + result.stderr.decode(encoding="utf8", errors="ignore") + txt = txt.strip() + if result.returncode != 0 and not ignore: global errors # pylint: disable=global-statement errors += 1 log.error(f'Error running git with args: {arg}') @@ -150,7 +157,7 @@ def check_python(): import platform supported_minors = [10] if platform.system() != "Windows" else [9, 10, 11] log.info(f'Python {platform.python_version()} on {platform.system()}') - if not (sys.version_info.major == 3 and sys.version_info.minor in supported_minors): + if not (int(sys.version_info.major) == 3 and int(sys.version_info.minor) in supported_minors): raise RuntimeError(f"Incompatible Python version: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} required 3.9-3.11") git_cmd = os.environ.get('GIT', "git") if shutil.which(git_cmd) is None: @@ -159,7 +166,8 @@ def check_python(): # check torch version def check_torch(): - install('torch torchaudio torchvision --index-url https://download.pytorch.org/whl/cu118') + torch_command = os.environ.get('TORCH_COMMAND', 'torch torchaudio torchvision --index-url https://download.pytorch.org/whl/cu118') + install(torch_command) try: import torch log.info(f'Torch {torch.__version__}') @@ -277,6 +285,16 @@ def install_extensions(): # initialize and optionally update submodules def install_submodules(): log.info('Installing submodules') + txt = git('submodule') + if 'no submodule mapping found' in txt: + log.warning('Attempting repository recover') + git('add .') + git('stash') + git('merge --abort', ignore=True) + git('fetch --all') + git('reset --hard origin/master') + git('checkout master') + log.info('Continuing setup') git('submodule --quiet update --init --recursive') if not args.noupdate: log.info('Updating submodules') @@ -361,7 +379,7 @@ def check_version(): except: log.error('Error upgrading repository') else: - log.info(f'Latest available version: {commits["commit"]["sha"]} {commits["commit"]["commit"]["author"]["date"]}') + log.info(f'Latest published version: {commits["commit"]["sha"]} {commits["commit"]["commit"]["author"]["date"]}') if not args.noupdate: log.info('Updating Wiki') try: @@ -385,7 +403,11 @@ def check_timestamp(): for line in lines: if 'Setup complete without errors' in line: setup_time = int(line.split(' ')[-1]) - version_time = int(git('log -1 --pretty=format:"%at"')) + try: + version_time = int(git('log -1 --pretty=format:"%at"')) + except Exception as e: + log.error(f'Error getting local repository version: {e}') + exit(1) log.debug(f'Repository update time: {time.ctime(int(version_time))}') if setup_time == -1: return False