ComfyUI version listing + nightly current fix (#2334)

* 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 <noreply@anthropic.com>

---------

Co-authored-by: Dr.Lt.Data <dr.lt.data@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Benjamin Lu 2025-12-12 01:15:12 -08:00 committed by Dr.Lt.Data
parent 8e8b6ca724
commit 75f27d99e2

View File

@ -2454,22 +2454,22 @@ def update_to_stable_comfyui(repo_path):
logging.error('\t'+branch.name) logging.error('\t'+branch.name)
return "fail", None return "fail", None
versions, current_tag, _ = get_comfyui_versions(repo) versions, current_tag, latest_tag = get_comfyui_versions(repo)
if len(versions) == 0 or (len(versions) == 1 and versions[0] == 'nightly'): if latest_tag is None:
logging.info("[ComfyUI-Manager] Unable to update to the stable ComfyUI version.") logging.info("[ComfyUI-Manager] Unable to update to the stable ComfyUI version.")
return "fail", None 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 return "skip", None
else: else:
logging.info(f"[ComfyUI-Manager] Updating ComfyUI: {current_tag} -> {latest_tag}") 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) execute_install_script("ComfyUI", repo_path, instant_execution=False, no_deps=False)
return 'updated', latest_tag return 'updated', latest_tag
except Exception: except Exception:
@ -3291,36 +3291,80 @@ async def restore_snapshot(snapshot_path, git_helper_extras=None):
def get_comfyui_versions(repo=None): def get_comfyui_versions(repo=None):
if repo is None: repo = repo or git.Repo(context.comfy_path)
repo = git.Repo(context.comfy_path)
remote_name = None
try: try:
remote = get_remote_name(repo) remote_name = get_remote_name(repo)
repo.remotes[remote].fetch() repo.remotes[remote_name].fetch()
except Exception: except:
logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI") 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 def normalize_describe(tag_name):
versions = sorted(versions, key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True) if not tag_name:
versions = versions[:4] 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: latest_tag = semver_tags[0] if semver_tags else None
versions = sorted(versions + [current_tag], key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True)
versions = versions[:4]
main_branch = repo.heads.master try:
latest_commit = main_branch.commit described = repo.git.describe('--tags')
latest_tag = repo.git.describe('--tags', latest_commit.hexsha) except Exception:
described = ''
if latest_tag != versions[0]: try:
versions.insert(0, 'nightly') exact_tag = repo.git.describe('--tags', '--exact-match')
else: except Exception:
versions[0] = 'nightly' 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' 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 return versions, current_tag, latest_tag