From f19f718a9fd234ef7ba31e54c1d9d3dbb1c93450 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Mon, 1 Dec 2025 20:55:30 -0800 Subject: [PATCH 1/4] Improve comfyui version listing --- glob/manager_core.py | 85 ++++++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 26 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index 67570786a..14eac18f1 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -2519,14 +2519,17 @@ def update_to_stable_comfyui(repo_path): versions, current_tag, _ = get_comfyui_versions(repo) - if len(versions) == 0 or (len(versions) == 1 and versions[0] == 'nightly'): + def pick_latest_semver(tags): + for tag in tags: + if re.match(r'^v\d+\.\d+\.\d+$', tag): + return tag + return None + + latest_tag = pick_latest_semver(versions) + + if latest_tag is None: logging.info("[ComfyUI-Manager] Unable to update to the stable ComfyUI version.") return "fail", None - - if versions[0] == 'nightly': - latest_tag = versions[1] - else: - latest_tag = versions[0] if current_tag == latest_tag: return "skip", None @@ -3356,35 +3359,65 @@ async def restore_snapshot(snapshot_path, git_helper_extras=None): def get_comfyui_versions(repo=None): - if repo is None: - repo = git.Repo(comfy_path) + repo = repo or git.Repo(comfy_path) try: - remote = get_remote_name(repo) - repo.remotes[remote].fetch() - except: + remote = get_remote_name(repo) + repo.remotes[remote].fetch() + except Exception: logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI") - versions = [x.name for x in repo.tags if x.name.startswith('v')] + def parse_semver(tag_name): + match = re.match(r'^v(\d+)\.(\d+)\.(\d+)$', tag_name) + return tuple(int(x) for x in match.groups()) if match else None + + def normalize_describe(tag_name): + if not tag_name: + return None + base = tag_name.split('-', 1)[0] + return base if parse_semver(base) else None + + # Collect semver tags and sort descending (highest first) + semver_tags = [] + for tag in repo.tags: + semver = parse_semver(tag.name) + if semver: + semver_tags.append((semver, tag.name)) + semver_tags.sort(key=lambda x: x[0], reverse=True) + semver_tags = [name for _, name in semver_tags] + semver_tag_set = set(semver_tags) - # nearest tag - versions = sorted(versions, key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True) - versions = versions[:4] + try: + raw_current_tag = repo.git.describe('--tags') + except Exception: + raw_current_tag = '' - current_tag = repo.git.describe('--tags') + normalized_current = normalize_describe(raw_current_tag) + has_normalized_tag = normalized_current in semver_tag_set + current_tag = normalized_current if has_normalized_tag else raw_current_tag - if current_tag not in versions: - versions = sorted(versions + [current_tag], key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True) - versions = versions[:4] + if has_normalized_tag and normalized_current not in semver_tags: + semver_tags.append(normalized_current) + semver_tags.sort(key=lambda t: parse_semver(t) or (0, 0, 0), reverse=True) - main_branch = repo.heads.master - latest_commit = main_branch.commit - latest_tag = repo.git.describe('--tags', latest_commit.hexsha) + semver_tags = semver_tags[:4] - if latest_tag != versions[0]: - versions.insert(0, 'nightly') - else: - versions[0] = 'nightly' + non_semver_current = None + if current_tag and not has_normalized_tag and current_tag not in semver_tags: + non_semver_current = current_tag + + try: + latest_tag = repo.git.describe('--tags', repo.heads.master.commit.hexsha) + except Exception: + latest_tag = None + + versions = ['nightly'] + if non_semver_current: + versions.append(non_semver_current) + versions.extend(semver_tags) + versions = versions[:5] + + if not current_tag: current_tag = 'nightly' return versions, current_tag, latest_tag From a72505e3397189d18f1da56b97dbaf2a814ab020 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Tue, 2 Dec 2025 14:23:02 -0800 Subject: [PATCH 2/4] Fix ComfyUI semver selection and stable update --- glob/manager_core.py | 68 +++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index 14eac18f1..f6d6e5350 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -2517,25 +2517,22 @@ def update_to_stable_comfyui(repo_path): logging.error('\t'+branch.name) return "fail", None - versions, current_tag, _ = get_comfyui_versions(repo) - - def pick_latest_semver(tags): - for tag in tags: - if re.match(r'^v\d+\.\d+\.\d+$', tag): - return tag - return None - - latest_tag = pick_latest_semver(versions) + versions, current_tag, latest_tag = get_comfyui_versions(repo) if latest_tag is None: logging.info("[ComfyUI-Manager] Unable to update to the stable ComfyUI version.") return "fail", None - if current_tag == latest_tag: + tag_ref = next((t for t in repo.tags if t.name == latest_tag), None) + if tag_ref is None: + logging.info(f"[ComfyUI-Manager] Unable to locate tag '{latest_tag}' in repository.") + return "fail", None + + if repo.head.commit == tag_ref.commit: return "skip", None else: logging.info(f"[ComfyUI-Manager] Updating ComfyUI: {current_tag} -> {latest_tag}") - repo.git.checkout(latest_tag) + repo.git.checkout(tag_ref) execute_install_script("ComfyUI", repo_path, instant_execution=False, no_deps=False) return 'updated', latest_tag except: @@ -3385,40 +3382,41 @@ def normalize_describe(tag_name): semver_tags.append((semver, tag.name)) semver_tags.sort(key=lambda x: x[0], reverse=True) semver_tags = [name for _, name in semver_tags] - semver_tag_set = set(semver_tags) + + latest_tag = semver_tags[0] if semver_tags else None try: - raw_current_tag = repo.git.describe('--tags') + described = repo.git.describe('--tags') except Exception: - raw_current_tag = '' - - normalized_current = normalize_describe(raw_current_tag) - has_normalized_tag = normalized_current in semver_tag_set - current_tag = normalized_current if has_normalized_tag else raw_current_tag + described = '' - if has_normalized_tag and normalized_current not in semver_tags: - semver_tags.append(normalized_current) - semver_tags.sort(key=lambda t: parse_semver(t) or (0, 0, 0), reverse=True) + try: + exact_tag = repo.git.describe('--tags', '--exact-match') + except Exception: + exact_tag = '' - semver_tags = semver_tags[:4] + nearest_semver = normalize_describe(described) + exact_semver = exact_tag if parse_semver(exact_tag) else None - non_semver_current = None - if current_tag and not has_normalized_tag and current_tag not in semver_tags: - non_semver_current = current_tag + current_tag = exact_tag or described or 'nightly' - try: - latest_tag = repo.git.describe('--tags', repo.heads.master.commit.hexsha) - except Exception: - latest_tag = None + # Prepare semver list for display: top 4 plus the current/nearest semver if missing + display_semver_tags = semver_tags[:4] + if exact_semver and exact_semver not in display_semver_tags: + display_semver_tags.append(exact_semver) + elif nearest_semver and nearest_semver not in display_semver_tags: + display_semver_tags.append(nearest_semver) versions = ['nightly'] - if non_semver_current: - versions.append(non_semver_current) - versions.extend(semver_tags) - versions = versions[:5] - if not current_tag: - current_tag = 'nightly' + if current_tag and not exact_semver and current_tag not in versions and current_tag not in display_semver_tags: + versions.append(current_tag) + + for tag in display_semver_tags: + if tag not in versions: + versions.append(tag) + + versions = versions[:6] return versions, current_tag, latest_tag From 8d728a1b286c1c838a118d72d405cb8bd406c552 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Tue, 2 Dec 2025 16:33:56 -0800 Subject: [PATCH 3/4] Fix nightly current detection on default branch --- glob/manager_core.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index f6d6e5350..d2e4241a2 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -3395,10 +3395,23 @@ def normalize_describe(tag_name): except Exception: exact_tag = '' + head_is_default = False + remote_name = get_remote_name(repo) + if remote_name: + try: + default_head_ref = repo.refs[f'{remote_name}/HEAD'] + default_commit = default_head_ref.reference.commit + head_is_default = repo.head.commit == default_commit + except Exception: + head_is_default = False + nearest_semver = normalize_describe(described) exact_semver = exact_tag if parse_semver(exact_tag) else None - current_tag = exact_tag or described or 'nightly' + if head_is_default and not exact_tag: + current_tag = 'nightly' + else: + current_tag = exact_tag or described or 'nightly' # Prepare semver list for display: top 4 plus the current/nearest semver if missing display_semver_tags = semver_tags[:4] From 5941ee9ae5383d42403c8b79ca947f6b13fc3a4a Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Fri, 12 Dec 2025 18:13:49 +0900 Subject: [PATCH 4/4] Fix: use tag_ref.name explicitly and cache get_remote_name result MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use tag_ref.name instead of tag_ref object for checkout - Cache get_remote_name() result to avoid duplicate calls 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- glob/manager_core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index dbb2c0cf2..2dc83a8cd 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -2538,7 +2538,7 @@ def update_to_stable_comfyui(repo_path): return "skip", None else: logging.info(f"[ComfyUI-Manager] Updating ComfyUI: {current_tag} -> {latest_tag}") - repo.git.checkout(tag_ref) + repo.git.checkout(tag_ref.name) execute_install_script("ComfyUI", repo_path, instant_execution=False, no_deps=False) return 'updated', latest_tag except: @@ -3364,9 +3364,10 @@ async def restore_snapshot(snapshot_path, git_helper_extras=None): def get_comfyui_versions(repo=None): repo = repo or git.Repo(comfy_path) + remote_name = None try: - remote = get_remote_name(repo) - repo.remotes[remote].fetch() + remote_name = get_remote_name(repo) + repo.remotes[remote_name].fetch() except: logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI") @@ -3402,7 +3403,6 @@ def normalize_describe(tag_name): exact_tag = '' head_is_default = False - remote_name = get_remote_name(repo) if remote_name: try: default_head_ref = repo.refs[f'{remote_name}/HEAD']