From f19f718a9fd234ef7ba31e54c1d9d3dbb1c93450 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Mon, 1 Dec 2025 20:55:30 -0800 Subject: [PATCH 1/3] 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 67570786..14eac18f 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 - # 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] + semver_tag_set = set(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] + try: + raw_current_tag = repo.git.describe('--tags') + except Exception: + raw_current_tag = '' - main_branch = repo.heads.master - latest_commit = main_branch.commit - latest_tag = repo.git.describe('--tags', latest_commit.hexsha) + 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 latest_tag != versions[0]: - versions.insert(0, 'nightly') - else: - versions[0] = 'nightly' + 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) + + semver_tags = semver_tags[:4] + + 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/3] Fix ComfyUI semver selection and stable update --- glob/manager_core.py | 70 +++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index 14eac18f..f6d6e535 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 get_comfyui_versions(repo=None): 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 - - 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) - - semver_tags = semver_tags[:4] - - non_semver_current = None - if current_tag and not has_normalized_tag and current_tag not in semver_tags: - non_semver_current = current_tag + described = '' try: - latest_tag = repo.git.describe('--tags', repo.heads.master.commit.hexsha) + exact_tag = repo.git.describe('--tags', '--exact-match') except Exception: - latest_tag = None + exact_tag = '' + + nearest_semver = normalize_describe(described) + exact_semver = exact_tag if parse_semver(exact_tag) else None + + 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 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/3] 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 f6d6e535..d2e4241a 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -3395,10 +3395,23 @@ def get_comfyui_versions(repo=None): 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]