diff --git a/cm-cli.py b/cm-cli.py index cb0e7c98..93aaa553 100644 --- a/cm-cli.py +++ b/cm-cli.py @@ -54,7 +54,7 @@ def check_comfyui_hash(): core.comfy_ui_commit_datetime = repo.head.commit.committed_datetime -check_comfyui_hash() # This is a preparation step for manager_core +# check_comfyui_hash() # This is a preparation step for manager_core def read_downgrade_blacklist(): @@ -83,6 +83,10 @@ class Ctx: self.mode = 'remote' self.processed_install = set() self.custom_node_map_cache = None + self.no_deps = False + + def set_no_deps(self, no_deps): + self.no_deps = no_deps def set_channel_mode(self, channel, mode): if mode is not None: @@ -202,10 +206,11 @@ class Ctx: cm_ctx = Ctx() -def install_node(node_name, is_all=False, cnt_msg=''): +def install_node(node_name, is_all=False, cnt_msg='', install_path=None, no_deps=False): if core.is_valid_url(node_name): # install via urls - res = core.gitclone_install([node_name]) + print(f"Installing {node_name} to {install_path}") + res = core.gitclone_install([node_name], install_path=install_path) if not res: print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.[/bold red]") else: @@ -219,7 +224,7 @@ def install_node(node_name, is_all=False, cnt_msg=''): elif os.path.exists(node_path + '.disabled'): enable_node(node_name) else: - res = core.gitclone_install(node_item['files'], instant_execution=True, msg_prefix=f"[{cnt_msg}] ") + res = core.gitclone_install(node_item['files'], instant_execution=True, msg_prefix=f"[{cnt_msg}] ", install_path=install_path, no_deps=no_deps) if not res: print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.[/bold red]") else: @@ -469,7 +474,7 @@ def auto_save_snapshot(): print(f"Current snapshot is saved as `{path}`") -def for_each_nodes(nodes, act, allow_all=True): +def for_each_nodes(nodes, act, allow_all=True, install_path=None, no_deps=False): is_all = False if allow_all and 'all' in nodes: is_all = True @@ -481,7 +486,7 @@ def for_each_nodes(nodes, act, allow_all=True): i = 1 for x in nodes: try: - act(x, is_all=is_all, cnt_msg=f'{i}/{total}') + act(x, is_all=is_all, cnt_msg=f'{i}/{total}', install_path=install_path, no_deps=no_deps) except Exception as e: print(f"ERROR: {e}") traceback.print_exc() @@ -513,9 +518,22 @@ def install( None, help="[remote|local|cache]" ), + install_path: str = typer.Option( + None, + help="Specify the installation path" + ), + no_deps: Annotated[ + Optional[bool], + typer.Option( + "--no-deps", + show_default=False, + help="Skip installing any Python dependencies", + ), + ] = False, ): cm_ctx.set_channel_mode(channel, mode) - for_each_nodes(nodes, act=install_node) + cm_ctx.set_no_deps(no_deps) + for_each_nodes(nodes, act=install_node, install_path=install_path, no_deps=no_deps) @app.command(help="Reinstall custom nodes") diff --git a/glob/manager_core.py b/glob/manager_core.py index a61d19be..959e2d36 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -53,8 +53,8 @@ def get_custom_nodes_paths(): def get_comfyui_tag(): - repo = git.Repo(comfy_path) try: + repo = git.Repo(comfy_path) return repo.git.describe('--tags') except: return None @@ -82,6 +82,7 @@ comfy_ui_required_commit_datetime = datetime(2024, 1, 24, 0, 0, 0) comfy_ui_revision = "Unknown" comfy_ui_commit_datetime = datetime(1900, 1, 1, 0, 0, 0) +is_electron = os.environ.get("ORIGINAL_XDG_CURRENT_DESKTOP") != None cache_lock = threading.Lock() @@ -432,7 +433,7 @@ def __win_check_git_pull(path): process.wait() -def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False): +def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False, no_deps=False): install_script_path = os.path.join(repo_path, "install.py") requirements_path = os.path.join(repo_path, "requirements.txt") @@ -440,7 +441,7 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa install_cmd = ["#LAZY-INSTALL-SCRIPT", sys.executable] try_install_script(url, repo_path, install_cmd) else: - if os.path.exists(requirements_path): + if os.path.exists(requirements_path) and not no_deps: print("Install: pip packages") pip_fixer = PIPFixer(get_installed_packages()) with open(requirements_path, "r") as requirements_file: @@ -584,7 +585,7 @@ def is_valid_url(url): return False -def gitclone_install(files, instant_execution=False, msg_prefix=''): +def gitclone_install(files, instant_execution=False, msg_prefix='', install_path=None, no_deps=False): print(f"{msg_prefix}Install: {files}") for url in files: if not is_valid_url(url): @@ -594,9 +595,9 @@ def gitclone_install(files, instant_execution=False, msg_prefix=''): if url.endswith("/"): url = url[:-1] try: - print(f"Download: git clone '{url}'") + print(f"Download: git clone '{url}' to {install_path}") repo_name = os.path.splitext(os.path.basename(url))[0] - repo_path = os.path.join(get_default_custom_nodes_path(), repo_name) + repo_path = os.path.join(install_path or get_default_custom_nodes_path(), repo_name) # Clone the repository from the remote URL if not instant_execution and platform.system() == 'Windows': @@ -608,7 +609,7 @@ def gitclone_install(files, instant_execution=False, msg_prefix=''): repo.git.clear_cache() repo.close() - if not execute_install_script(url, repo_path, instant_execution=instant_execution): + if not execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps): return False except Exception as e: diff --git a/glob/manager_server.py b/glob/manager_server.py index 2449c04a..f14a0de0 100644 --- a/glob/manager_server.py +++ b/glob/manager_server.py @@ -11,6 +11,8 @@ import threading import re import shutil import git +import datetime +import logging from server import PromptServer import manager_core as core @@ -1219,12 +1221,14 @@ async def get_notice(request): markdown_content = add_target_blank(markdown_content) try: - if core.comfy_ui_commit_datetime == datetime(1900, 1, 1, 0, 0, 0): + if core.is_electron: + pass + elif core.comfy_ui_commit_datetime == datetime.datetime(1900, 1, 1, 0, 0, 0): markdown_content = f'
Your ComfyUI isn\'t git repo.
' + markdown_content elif core.comfy_ui_required_commit_datetime.date() > core.comfy_ui_commit_datetime.date(): markdown_content = f'Your ComfyUI is too OUTDATED!!!
' + markdown_content - except: - pass + except Exception as error: + logging.warning("Unexpected error when checking ComfyUI version via git.") return web.Response(text=markdown_content, status=200) else: diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 8d2b12bf..8f17f800 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -238,7 +238,6 @@ function is_legacy_front() { document.head.appendChild(docStyle); -var update_comfyui_button = null; var fetch_updates_button = null; var update_all_button = null; var badge_mode = "none"; @@ -561,40 +560,6 @@ function drawBadge(node, orig, restArgs) { } -async function updateComfyUI() { - let prev_text = update_comfyui_button.innerText; - update_comfyui_button.innerText = "Updating ComfyUI..."; - update_comfyui_button.disabled = true; - update_comfyui_button.style.backgroundColor = "gray"; - - try { - const response = await api.fetchApi('/comfyui_manager/update_comfyui'); - - if (response.status == 400) { - show_message('Failed to update ComfyUI.'); - return false; - } - - if (response.status == 201) { - show_message('ComfyUI has been successfully updated.'); - } - else { - show_message('ComfyUI is already up to date with the latest version.'); - } - - return true; - } - catch (exception) { - show_message(`Failed to update ComfyUI / ${exception}`); - return false; - } - finally { - update_comfyui_button.disabled = false; - update_comfyui_button.innerText = prev_text; - update_comfyui_button.style.backgroundColor = ""; - } -} - async function fetchUpdates(update_check_checkbox) { let prev_text = fetch_updates_button.innerText; fetch_updates_button.innerText = "Fetching updates..."; @@ -647,15 +612,13 @@ async function fetchUpdates(update_check_checkbox) { async function updateAll(update_check_checkbox, manager_dialog) { let prev_text = update_all_button.innerText; - update_all_button.innerText = "Updating all...(ComfyUI)"; + update_all_button.innerText = "Updating all..."; update_all_button.disabled = true; update_all_button.style.backgroundColor = "gray"; try { var mode = manager_instance.datasrc_combo.value; - update_all_button.innerText = "Updating all..."; - const response1 = await api.fetchApi('/comfyui_manager/update_comfyui'); const response2 = await api.fetchApi(`/customnode/update_all?mode=${mode}`); if (response2.status == 403) { @@ -663,12 +626,12 @@ async function updateAll(update_check_checkbox, manager_dialog) { return false; } - if (response1.status == 400 || response2.status == 400) { - show_message('Failed to update ComfyUI or several extensions.