From ae5565ce680bfba37401c40ca81e50c3dd80ed0c Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Fri, 12 Dec 2025 01:15:12 -0800 Subject: [PATCH] ComfyUI version listing + nightly current fix (#2334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve comfyui version listing * Fix ComfyUI semver selection and stable update * Fix nightly current detection on default branch * Fix: use tag_ref.name explicitly and cache get_remote_name result - 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 --------- Co-authored-by: Dr.Lt.Data Co-authored-by: Claude Opus 4.5 --- glob/manager_core.py | 102 +++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 29 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index c9d38138..bc292958 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -2531,22 +2531,22 @@ def update_to_stable_comfyui(repo_path): logging.error('\t'+branch.name) return "fail", None - versions, current_tag, _ = get_comfyui_versions(repo) - - if len(versions) == 0 or (len(versions) == 1 and versions[0] == 'nightly'): + 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 versions[0] == 'nightly': - latest_tag = versions[1] - else: - latest_tag = versions[0] - 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.name) execute_install_script("ComfyUI", repo_path, instant_execution=False, no_deps=False) return 'updated', latest_tag except: @@ -3370,36 +3370,80 @@ 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) + 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") - 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 - # nearest tag - versions = sorted(versions, key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True) - versions = versions[:4] + 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 - current_tag = repo.git.describe('--tags') + # 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] - 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] + latest_tag = semver_tags[0] if semver_tags else None - main_branch = repo.heads.master - latest_commit = main_branch.commit - latest_tag = repo.git.describe('--tags', latest_commit.hexsha) + try: + described = repo.git.describe('--tags') + except Exception: + described = '' - if latest_tag != versions[0]: - versions.insert(0, 'nightly') - else: - versions[0] = 'nightly' + try: + exact_tag = repo.git.describe('--tags', '--exact-match') + except Exception: + exact_tag = '' + + head_is_default = False + 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 + + 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] + 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 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