feat(version): apply semver-based version sorting to glob and add master fallback
Some checks failed
Publish to PyPI / build-and-publish (push) Has been cancelled
Python Linting / Run Ruff (push) Has been cancelled

- Apply PR #2334 changes to glob/manager_core.py (was only in legacy)
- Add master branch fallback when remote/HEAD reference is unavailable
This commit is contained in:
Dr.Lt.Data 2025-12-15 03:39:13 +09:00
parent 952613c07b
commit 2779c66b39
2 changed files with 85 additions and 31 deletions

View File

@ -2457,22 +2457,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:
@ -3290,36 +3290,85 @@ 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 Exception:
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:
# Fallback: compare directly with master branch
try:
if 'master' in [h.name for h in repo.heads]:
head_is_default = repo.head.commit == repo.heads.master.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

View File

@ -3297,7 +3297,7 @@ def get_comfyui_versions(repo=None):
try: try:
remote_name = get_remote_name(repo) remote_name = get_remote_name(repo)
repo.remotes[remote_name].fetch() repo.remotes[remote_name].fetch()
except: except Exception:
logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI") logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI")
def parse_semver(tag_name): def parse_semver(tag_name):
@ -3338,7 +3338,12 @@ def get_comfyui_versions(repo=None):
default_commit = default_head_ref.reference.commit default_commit = default_head_ref.reference.commit
head_is_default = repo.head.commit == default_commit head_is_default = repo.head.commit == default_commit
except Exception: except Exception:
head_is_default = False # Fallback: compare directly with master branch
try:
if 'master' in [h.name for h in repo.heads]:
head_is_default = repo.head.commit == repo.heads.master.commit
except Exception:
head_is_default = False
nearest_semver = normalize_describe(described) nearest_semver = normalize_describe(described)
exact_semver = exact_tag if parse_semver(exact_tag) else None exact_semver = exact_tag if parse_semver(exact_tag) else None