From 27bfc539f73e9e5ede452b5b1872be079d4efc32 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 12 Apr 2025 21:10:14 +0900 Subject: [PATCH 1/2] fixed: Removed the possibility of locking by opening the git repo. https://github.com/Comfy-Org/ComfyUI-Manager/issues/1717 --- glob/manager_core.py | 127 +++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 57 insertions(+), 72 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index e9af16bc..35e4828b 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -43,7 +43,7 @@ import manager_downloader from node_package import InstalledNodePackage -version_code = [3, 31, 9] +version_code = [3, 31, 10] version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') @@ -1320,67 +1320,66 @@ class UnifiedManager: return result.fail(f'Path not found: {repo_path}') # version check - repo = git.Repo(repo_path) + with git.Repo(repo_path) as repo: + if repo.head.is_detached: + if not switch_to_default_branch(repo): + return result.fail(f"Failed to switch to default branch: {repo_path}") - if repo.head.is_detached: - if not switch_to_default_branch(repo): - return result.fail(f"Failed to switch to default branch: {repo_path}") + current_branch = repo.active_branch + branch_name = current_branch.name - current_branch = repo.active_branch - branch_name = current_branch.name - - if current_branch.tracking_branch() is None: - print(f"[ComfyUI-Manager] There is no tracking branch ({current_branch})") - remote_name = get_remote_name(repo) - else: - remote_name = current_branch.tracking_branch().remote_name - - if remote_name is None: - return result.fail(f"Failed to get remote when installing: {repo_path}") - - remote = repo.remote(name=remote_name) - - try: - remote.fetch() - except Exception as e: - if 'detected dubious' in str(e): - print(f"[ComfyUI-Manager] Try fixing 'dubious repository' error on '{repo_path}' repository") - safedir_path = repo_path.replace('\\', '/') - subprocess.run(['git', 'config', '--global', '--add', 'safe.directory', safedir_path]) - try: - remote.fetch() - except Exception: - print("\n[ComfyUI-Manager] Failed to fixing repository setup. Please execute this command on cmd: \n" - "-----------------------------------------------------------------------------------------\n" - f'git config --global --add safe.directory "{safedir_path}"\n' - "-----------------------------------------------------------------------------------------\n") - - commit_hash = repo.head.commit.hexsha - if f'{remote_name}/{branch_name}' in repo.refs: - remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha - else: - return result.fail(f"Not updatable branch: {branch_name}") - - if commit_hash != remote_commit_hash: - git_pull(repo_path) - - if len(repo.remotes) > 0: - url = repo.remotes[0].url + if current_branch.tracking_branch() is None: + print(f"[ComfyUI-Manager] There is no tracking branch ({current_branch})") + remote_name = get_remote_name(repo) else: - url = "unknown repo" + remote_name = current_branch.tracking_branch().remote_name - def postinstall(): - return self.execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps) + if remote_name is None: + return result.fail(f"Failed to get remote when installing: {repo_path}") - if return_postinstall: - return result.with_postinstall(postinstall) + remote = repo.remote(name=remote_name) + + try: + remote.fetch() + except Exception as e: + if 'detected dubious' in str(e): + print(f"[ComfyUI-Manager] Try fixing 'dubious repository' error on '{repo_path}' repository") + safedir_path = repo_path.replace('\\', '/') + subprocess.run(['git', 'config', '--global', '--add', 'safe.directory', safedir_path]) + try: + remote.fetch() + except Exception: + print("\n[ComfyUI-Manager] Failed to fixing repository setup. Please execute this command on cmd: \n" + "-----------------------------------------------------------------------------------------\n" + f'git config --global --add safe.directory "{safedir_path}"\n' + "-----------------------------------------------------------------------------------------\n") + + commit_hash = repo.head.commit.hexsha + if f'{remote_name}/{branch_name}' in repo.refs: + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha else: - if not postinstall(): - return result.fail(f"Failed to execute install script: {url}") + return result.fail(f"Not updatable branch: {branch_name}") - return result - else: - return ManagedResult('skip').with_msg('Up to date') + if commit_hash != remote_commit_hash: + git_pull(repo_path) + + if len(repo.remotes) > 0: + url = repo.remotes[0].url + else: + url = "unknown repo" + + def postinstall(): + return self.execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps) + + if return_postinstall: + return result.with_postinstall(postinstall) + else: + if not postinstall(): + return result.fail(f"Failed to execute install script: {url}") + + return result + else: + return ManagedResult('skip').with_msg('Up to date') def unified_update(self, node_id, version_spec=None, instant_execution=False, no_deps=False, return_postinstall=False): orig_print(f"\x1b[2K\rUpdating: {node_id}", end='') @@ -2640,22 +2639,8 @@ async def get_current_snapshot(custom_nodes_only = False): cnr_custom_nodes[info['id']] = info['ver'] else: - repo = git.Repo(fullpath) - - if repo.head.is_detached: - remote_name = get_remote_name(repo) - else: - current_branch = repo.active_branch - - if current_branch.tracking_branch() is None: - remote_name = get_remote_name(repo) - else: - remote_name = current_branch.tracking_branch().remote_name - - commit_hash = repo.head.commit.hexsha - - url = repo.remotes[remote_name].url - + commit_hash = git_utils.get_commit_hash(fullpath) + url = git_utils.git_url(fullpath) git_custom_nodes[url] = dict(hash=commit_hash, disabled=is_disabled) except: print(f"Failed to extract snapshots for the custom node '{path}'.") diff --git a/pyproject.toml b/pyproject.toml index 96948d17..ce342603 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-manager" description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI." -version = "3.31.9" +version = "3.31.10" license = { file = "LICENSE.txt" } dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"] From 17e5c3d2f50ce6e7081816884077a5533c993b0c Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 12 Apr 2025 21:20:45 +0900 Subject: [PATCH 2/2] update DB --- extension-node-map.json | 8 +------- node_db/new/extension-node-map.json | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index c44a89ca..130e8424 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -9035,15 +9035,9 @@ ], "https://github.com/Shiba-2-shiba/comfyui-color-ascii-art-node": [ [ - "ASCIIArtNode", - "ASCIIArtNodev2", - "ASCIIArtSinglefontNode" + "ASCIIArtNodeV3" ], { - "author": "Shiba-2-shiba", - "description": "This node generates colorful ASCII art using custom character sets and fonts.", - "nickname": "ColorASCII", - "title": "Colorful ASCII Art Node", "title_aux": "ComfyUI-color-ascii-art-node" } ], diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index c44a89ca..130e8424 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -9035,15 +9035,9 @@ ], "https://github.com/Shiba-2-shiba/comfyui-color-ascii-art-node": [ [ - "ASCIIArtNode", - "ASCIIArtNodev2", - "ASCIIArtSinglefontNode" + "ASCIIArtNodeV3" ], { - "author": "Shiba-2-shiba", - "description": "This node generates colorful ASCII art using custom character sets and fonts.", - "nickname": "ColorASCII", - "title": "Colorful ASCII Art Node", "title_aux": "ComfyUI-color-ascii-art-node" } ],