mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2025-12-30 16:50:50 +08:00
fix(git): handle divergent branches safely + datetime fallback
- Use --ff-only flag to detect non-fast-forward situations - Create backup branch before resetting divergent local branch - Reset to remote branch when fast-forward is not possible - Add timestamp_utils.py for Mac datetime module compatibility - Migrate all datetime usages to centralized utilities - Bump version to 4.0.3b5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
3425fb7a14
commit
8e8b6ca724
@ -0,0 +1,17 @@
|
|||||||
|
from .timestamp_utils import (
|
||||||
|
current_timestamp,
|
||||||
|
get_timestamp_for_filename,
|
||||||
|
get_timestamp_for_path,
|
||||||
|
get_backup_branch_name,
|
||||||
|
get_now,
|
||||||
|
get_unix_timestamp,
|
||||||
|
)
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'current_timestamp',
|
||||||
|
'get_timestamp_for_filename',
|
||||||
|
'get_timestamp_for_path',
|
||||||
|
'get_backup_branch_name',
|
||||||
|
'get_now',
|
||||||
|
'get_unix_timestamp',
|
||||||
|
]
|
||||||
@ -9,6 +9,7 @@ import yaml
|
|||||||
import requests
|
import requests
|
||||||
from tqdm.auto import tqdm
|
from tqdm.auto import tqdm
|
||||||
from git.remote import RemoteProgress
|
from git.remote import RemoteProgress
|
||||||
|
from comfyui_manager.common.timestamp_utils import get_backup_branch_name
|
||||||
|
|
||||||
|
|
||||||
comfy_path = os.environ.get('COMFYUI_PATH')
|
comfy_path = os.environ.get('COMFYUI_PATH')
|
||||||
@ -222,7 +223,14 @@ def gitpull(path):
|
|||||||
repo.close()
|
repo.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
remote.pull()
|
try:
|
||||||
|
repo.git.pull('--ff-only')
|
||||||
|
except git.GitCommandError:
|
||||||
|
backup_name = get_backup_branch_name(repo)
|
||||||
|
repo.create_head(backup_name)
|
||||||
|
print(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||||
|
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||||
|
print(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||||
|
|
||||||
repo.git.submodule('update', '--init', '--recursive')
|
repo.git.submodule('update', '--init', '--recursive')
|
||||||
new_commit_hash = repo.head.commit.hexsha
|
new_commit_hash = repo.head.commit.hexsha
|
||||||
|
|||||||
@ -8,13 +8,13 @@ import aiohttp
|
|||||||
import json
|
import json
|
||||||
import threading
|
import threading
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
import platform
|
import platform
|
||||||
import shlex
|
import shlex
|
||||||
|
import time
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
|
|
||||||
|
|
||||||
@ -176,7 +176,7 @@ def is_file_created_within_one_day(file_path):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
file_creation_time = os.path.getctime(file_path)
|
file_creation_time = os.path.getctime(file_path)
|
||||||
current_time = datetime.now().timestamp()
|
current_time = time.time()
|
||||||
time_difference = current_time - file_creation_time
|
time_difference = current_time - file_creation_time
|
||||||
|
|
||||||
return time_difference <= 86400
|
return time_difference <= 86400
|
||||||
|
|||||||
136
comfyui_manager/common/timestamp_utils.py
Normal file
136
comfyui_manager/common/timestamp_utils.py
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
"""
|
||||||
|
Robust timestamp utilities with datetime fallback.
|
||||||
|
|
||||||
|
Some environments (especially Mac) have issues with the datetime module
|
||||||
|
due to local file name conflicts or Homebrew Python module path issues.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import time as time_module
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
_datetime_available = None
|
||||||
|
_dt_datetime = None
|
||||||
|
|
||||||
|
|
||||||
|
def _init_datetime():
|
||||||
|
"""Initialize datetime availability check (lazy, once)."""
|
||||||
|
global _datetime_available, _dt_datetime
|
||||||
|
if _datetime_available is not None:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
import datetime as dt
|
||||||
|
if hasattr(dt, 'datetime'):
|
||||||
|
from datetime import datetime as dt_datetime
|
||||||
|
_dt_datetime = dt_datetime
|
||||||
|
_datetime_available = True
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
logging.debug(f"[ComfyUI-Manager] datetime import failed: {e}")
|
||||||
|
|
||||||
|
_datetime_available = False
|
||||||
|
logging.warning("[ComfyUI-Manager] datetime unavailable, using time module fallback")
|
||||||
|
|
||||||
|
|
||||||
|
def current_timestamp() -> str:
|
||||||
|
"""
|
||||||
|
Get current timestamp for logging.
|
||||||
|
Format: YYYY-MM-DD HH:MM:SS.mmm (or Unix timestamp if fallback)
|
||||||
|
"""
|
||||||
|
_init_datetime()
|
||||||
|
if _datetime_available:
|
||||||
|
return _dt_datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
||||||
|
return str(time_module.time()).split('.')[0]
|
||||||
|
|
||||||
|
|
||||||
|
def get_timestamp_for_filename() -> str:
|
||||||
|
"""
|
||||||
|
Get timestamp suitable for filenames.
|
||||||
|
Format: YYYYMMDD_HHMMSS
|
||||||
|
"""
|
||||||
|
_init_datetime()
|
||||||
|
if _datetime_available:
|
||||||
|
return _dt_datetime.now().strftime('%Y%m%d_%H%M%S')
|
||||||
|
return time_module.strftime('%Y%m%d_%H%M%S')
|
||||||
|
|
||||||
|
|
||||||
|
def get_timestamp_for_path() -> str:
|
||||||
|
"""
|
||||||
|
Get timestamp for path/directory names.
|
||||||
|
Format: YYYY-MM-DD_HH-MM-SS
|
||||||
|
"""
|
||||||
|
_init_datetime()
|
||||||
|
if _datetime_available:
|
||||||
|
return _dt_datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
|
||||||
|
return time_module.strftime('%Y-%m-%d_%H-%M-%S')
|
||||||
|
|
||||||
|
|
||||||
|
def get_backup_branch_name(repo=None) -> str:
|
||||||
|
"""
|
||||||
|
Get backup branch name with current timestamp.
|
||||||
|
Format: backup_YYYYMMDD_HHMMSS (or backup_YYYYMMDD_HHMMSS_N if exists)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
repo: Optional git.Repo object. If provided, checks for name collisions
|
||||||
|
and adds sequential suffix if needed.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Unique backup branch name.
|
||||||
|
"""
|
||||||
|
base_name = f'backup_{get_timestamp_for_filename()}'
|
||||||
|
|
||||||
|
if repo is None:
|
||||||
|
return base_name
|
||||||
|
|
||||||
|
# Check if branch exists
|
||||||
|
try:
|
||||||
|
existing_branches = {b.name for b in repo.heads}
|
||||||
|
except Exception:
|
||||||
|
return base_name
|
||||||
|
|
||||||
|
if base_name not in existing_branches:
|
||||||
|
return base_name
|
||||||
|
|
||||||
|
# Add sequential suffix
|
||||||
|
for i in range(1, 100):
|
||||||
|
new_name = f'{base_name}_{i}'
|
||||||
|
if new_name not in existing_branches:
|
||||||
|
return new_name
|
||||||
|
|
||||||
|
# Ultimate fallback: use UUID (very unlikely to reach here)
|
||||||
|
return f'{base_name}_{uuid.uuid4().hex[:6]}'
|
||||||
|
|
||||||
|
|
||||||
|
def get_now():
|
||||||
|
"""
|
||||||
|
Get current datetime object.
|
||||||
|
Returns datetime.now() if available, otherwise a FakeDatetime object
|
||||||
|
that supports basic operations (timestamp(), strftime()).
|
||||||
|
"""
|
||||||
|
_init_datetime()
|
||||||
|
if _datetime_available:
|
||||||
|
return _dt_datetime.now()
|
||||||
|
|
||||||
|
# Fallback: return object with basic datetime-like interface
|
||||||
|
t = time_module.localtime()
|
||||||
|
|
||||||
|
class FakeDatetime:
|
||||||
|
def timestamp(self):
|
||||||
|
return time_module.time()
|
||||||
|
|
||||||
|
def strftime(self, fmt):
|
||||||
|
return time_module.strftime(fmt, t)
|
||||||
|
|
||||||
|
def isoformat(self):
|
||||||
|
return time_module.strftime('%Y-%m-%dT%H:%M:%S', t)
|
||||||
|
|
||||||
|
return FakeDatetime()
|
||||||
|
|
||||||
|
|
||||||
|
def get_unix_timestamp() -> float:
|
||||||
|
"""Get current Unix timestamp."""
|
||||||
|
_init_datetime()
|
||||||
|
if _datetime_available:
|
||||||
|
return _dt_datetime.now().timestamp()
|
||||||
|
return time_module.time()
|
||||||
@ -12,9 +12,9 @@ import re
|
|||||||
import shutil
|
import shutil
|
||||||
import configparser
|
import configparser
|
||||||
import platform
|
import platform
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
import git
|
import git
|
||||||
|
from comfyui_manager.common.timestamp_utils import get_timestamp_for_path, get_backup_branch_name
|
||||||
from git.remote import RemoteProgress
|
from git.remote import RemoteProgress
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from tqdm.auto import tqdm
|
from tqdm.auto import tqdm
|
||||||
@ -2000,7 +2000,15 @@ def git_repo_update_check_with(path, do_fetch=False, do_update=False, no_deps=Fa
|
|||||||
return False, True
|
return False, True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
remote.pull()
|
try:
|
||||||
|
repo.git.pull('--ff-only')
|
||||||
|
except git.GitCommandError:
|
||||||
|
backup_name = get_backup_branch_name(repo)
|
||||||
|
repo.create_head(backup_name)
|
||||||
|
logging.info(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||||
|
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||||
|
logging.info(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||||
|
|
||||||
repo.git.submodule('update', '--init', '--recursive')
|
repo.git.submodule('update', '--init', '--recursive')
|
||||||
new_commit_hash = repo.head.commit.hexsha
|
new_commit_hash = repo.head.commit.hexsha
|
||||||
|
|
||||||
@ -2169,9 +2177,17 @@ def git_pull(path):
|
|||||||
|
|
||||||
current_branch = repo.active_branch
|
current_branch = repo.active_branch
|
||||||
remote_name = current_branch.tracking_branch().remote_name
|
remote_name = current_branch.tracking_branch().remote_name
|
||||||
remote = repo.remote(name=remote_name)
|
branch_name = current_branch.name
|
||||||
|
|
||||||
|
try:
|
||||||
|
repo.git.pull('--ff-only')
|
||||||
|
except git.GitCommandError:
|
||||||
|
backup_name = get_backup_branch_name(repo)
|
||||||
|
repo.create_head(backup_name)
|
||||||
|
logging.info(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||||
|
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||||
|
logging.info(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||||
|
|
||||||
remote.pull()
|
|
||||||
repo.git.submodule('update', '--init', '--recursive')
|
repo.git.submodule('update', '--init', '--recursive')
|
||||||
|
|
||||||
repo.close()
|
repo.close()
|
||||||
@ -2681,9 +2697,7 @@ async def get_current_snapshot(custom_nodes_only = False):
|
|||||||
|
|
||||||
async def save_snapshot_with_postfix(postfix, path=None, custom_nodes_only = False):
|
async def save_snapshot_with_postfix(postfix, path=None, custom_nodes_only = False):
|
||||||
if path is None:
|
if path is None:
|
||||||
now = datetime.now()
|
date_time_format = get_timestamp_for_path()
|
||||||
|
|
||||||
date_time_format = now.strftime("%Y-%m-%d_%H-%M-%S")
|
|
||||||
file_name = f"{date_time_format}_{postfix}"
|
file_name = f"{date_time_format}_{postfix}"
|
||||||
|
|
||||||
path = os.path.join(context.manager_snapshot_path, f"{file_name}.json")
|
path = os.path.join(context.manager_snapshot_path, f"{file_name}.json")
|
||||||
|
|||||||
@ -20,10 +20,12 @@ import threading
|
|||||||
import traceback
|
import traceback
|
||||||
import urllib.request
|
import urllib.request
|
||||||
import uuid
|
import uuid
|
||||||
|
import time
|
||||||
import zipfile
|
import zipfile
|
||||||
from datetime import datetime, timedelta
|
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
|
from comfyui_manager.common.timestamp_utils import get_timestamp_for_filename, get_now
|
||||||
|
|
||||||
import folder_paths
|
import folder_paths
|
||||||
import latent_preview
|
import latent_preview
|
||||||
import nodes
|
import nodes
|
||||||
@ -267,9 +269,9 @@ class TaskQueue:
|
|||||||
def _start_new_batch(self) -> None:
|
def _start_new_batch(self) -> None:
|
||||||
"""Start a new batch session for tracking operations."""
|
"""Start a new batch session for tracking operations."""
|
||||||
self.batch_id = (
|
self.batch_id = (
|
||||||
f"batch_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{uuid.uuid4().hex[:8]}"
|
f"batch_{get_timestamp_for_filename()}_{uuid.uuid4().hex[:8]}"
|
||||||
)
|
)
|
||||||
self.batch_start_time = datetime.now().isoformat()
|
self.batch_start_time = get_now().isoformat()
|
||||||
self.batch_state_before = self._capture_system_state()
|
self.batch_state_before = self._capture_system_state()
|
||||||
logging.debug("[ComfyUI-Manager] Started new batch: %s", self.batch_id)
|
logging.debug("[ComfyUI-Manager] Started new batch: %s", self.batch_id)
|
||||||
|
|
||||||
@ -300,7 +302,7 @@ class TaskQueue:
|
|||||||
MessageTaskStarted(
|
MessageTaskStarted(
|
||||||
ui_id=item.ui_id,
|
ui_id=item.ui_id,
|
||||||
kind=item.kind,
|
kind=item.kind,
|
||||||
timestamp=datetime.now(),
|
timestamp=get_now(),
|
||||||
state=self.get_current_state(),
|
state=self.get_current_state(),
|
||||||
),
|
),
|
||||||
client_id=item.client_id, # Send task started only to the client that requested it
|
client_id=item.client_id, # Send task started only to the client that requested it
|
||||||
@ -317,8 +319,7 @@ class TaskQueue:
|
|||||||
"""Mark task as completed and add to history"""
|
"""Mark task as completed and add to history"""
|
||||||
|
|
||||||
with self.mutex:
|
with self.mutex:
|
||||||
now = datetime.now()
|
now = get_now()
|
||||||
timestamp = now.isoformat()
|
|
||||||
|
|
||||||
# Remove task from running_tasks using the task_index
|
# Remove task from running_tasks using the task_index
|
||||||
self.running_tasks.pop(task_index, None)
|
self.running_tasks.pop(task_index, None)
|
||||||
@ -383,7 +384,7 @@ class TaskQueue:
|
|||||||
result=result_msg,
|
result=result_msg,
|
||||||
kind=item.kind,
|
kind=item.kind,
|
||||||
status=status,
|
status=status,
|
||||||
timestamp=datetime.fromisoformat(timestamp),
|
timestamp=now,
|
||||||
state=self.get_current_state(),
|
state=self.get_current_state(),
|
||||||
),
|
),
|
||||||
client_id=item.client_id, # Send completion only to the client that requested it
|
client_id=item.client_id, # Send completion only to the client that requested it
|
||||||
@ -494,7 +495,7 @@ class TaskQueue:
|
|||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
end_time = datetime.now().isoformat()
|
end_time = get_now().isoformat()
|
||||||
state_after = self._capture_system_state()
|
state_after = self._capture_system_state()
|
||||||
operations = self._extract_batch_operations()
|
operations = self._extract_batch_operations()
|
||||||
|
|
||||||
@ -562,7 +563,7 @@ class TaskQueue:
|
|||||||
"""Capture current ComfyUI system state for batch record."""
|
"""Capture current ComfyUI system state for batch record."""
|
||||||
logging.debug("[ComfyUI-Manager] Capturing system state for batch record")
|
logging.debug("[ComfyUI-Manager] Capturing system state for batch record")
|
||||||
return ComfyUISystemState(
|
return ComfyUISystemState(
|
||||||
snapshot_time=datetime.now().isoformat(),
|
snapshot_time=get_now().isoformat(),
|
||||||
comfyui_version=self._get_comfyui_version_info(),
|
comfyui_version=self._get_comfyui_version_info(),
|
||||||
frontend_version=self._get_frontend_version(),
|
frontend_version=self._get_frontend_version(),
|
||||||
python_version=platform.python_version(),
|
python_version=platform.python_version(),
|
||||||
@ -789,8 +790,8 @@ class TaskQueue:
|
|||||||
to avoid disrupting normal operations.
|
to avoid disrupting normal operations.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
cutoff = datetime.now() - timedelta(days=16)
|
# 16 days in seconds
|
||||||
cutoff_timestamp = cutoff.timestamp()
|
cutoff_timestamp = time.time() - (16 * 24 * 60 * 60)
|
||||||
|
|
||||||
pattern = os.path.join(context.manager_batch_history_path, "batch_*.json")
|
pattern = os.path.join(context.manager_batch_history_path, "batch_*.json")
|
||||||
removed_count = 0
|
removed_count = 0
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import platform
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import git
|
import git
|
||||||
|
from comfyui_manager.common.timestamp_utils import get_timestamp_for_path, get_backup_branch_name
|
||||||
from git.remote import RemoteProgress
|
from git.remote import RemoteProgress
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from tqdm.auto import tqdm
|
from tqdm.auto import tqdm
|
||||||
@ -2012,7 +2013,15 @@ def git_repo_update_check_with(path, do_fetch=False, do_update=False, no_deps=Fa
|
|||||||
return False, True
|
return False, True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
remote.pull()
|
try:
|
||||||
|
repo.git.pull('--ff-only')
|
||||||
|
except git.GitCommandError:
|
||||||
|
backup_name = get_backup_branch_name(repo)
|
||||||
|
repo.create_head(backup_name)
|
||||||
|
logging.info(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||||
|
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||||
|
logging.info(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||||
|
|
||||||
repo.git.submodule('update', '--init', '--recursive')
|
repo.git.submodule('update', '--init', '--recursive')
|
||||||
new_commit_hash = repo.head.commit.hexsha
|
new_commit_hash = repo.head.commit.hexsha
|
||||||
|
|
||||||
@ -2167,9 +2176,17 @@ def git_pull(path):
|
|||||||
|
|
||||||
current_branch = repo.active_branch
|
current_branch = repo.active_branch
|
||||||
remote_name = current_branch.tracking_branch().remote_name
|
remote_name = current_branch.tracking_branch().remote_name
|
||||||
remote = repo.remote(name=remote_name)
|
branch_name = current_branch.name
|
||||||
|
|
||||||
|
try:
|
||||||
|
repo.git.pull('--ff-only')
|
||||||
|
except git.GitCommandError:
|
||||||
|
backup_name = get_backup_branch_name(repo)
|
||||||
|
repo.create_head(backup_name)
|
||||||
|
logging.info(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||||
|
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||||
|
logging.info(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||||
|
|
||||||
remote.pull()
|
|
||||||
repo.git.submodule('update', '--init', '--recursive')
|
repo.git.submodule('update', '--init', '--recursive')
|
||||||
|
|
||||||
repo.close()
|
repo.close()
|
||||||
@ -2683,9 +2700,7 @@ async def get_current_snapshot(custom_nodes_only = False):
|
|||||||
|
|
||||||
async def save_snapshot_with_postfix(postfix, path=None, custom_nodes_only = False):
|
async def save_snapshot_with_postfix(postfix, path=None, custom_nodes_only = False):
|
||||||
if path is None:
|
if path is None:
|
||||||
now = datetime.now()
|
date_time_format = get_timestamp_for_path()
|
||||||
|
|
||||||
date_time_format = now.strftime("%Y-%m-%d_%H-%M-%S")
|
|
||||||
file_name = f"{date_time_format}_{postfix}"
|
file_name = f"{date_time_format}_{postfix}"
|
||||||
|
|
||||||
path = os.path.join(context.manager_snapshot_path, f"{file_name}.json")
|
path = os.path.join(context.manager_snapshot_path, f"{file_name}.json")
|
||||||
|
|||||||
@ -16,25 +16,11 @@ from .common import security_check
|
|||||||
from .common import manager_util
|
from .common import manager_util
|
||||||
from .common import cm_global
|
from .common import cm_global
|
||||||
from .common import manager_downloader
|
from .common import manager_downloader
|
||||||
|
from .common.timestamp_utils import current_timestamp
|
||||||
import folder_paths
|
import folder_paths
|
||||||
|
|
||||||
manager_util.add_python_path_to_env()
|
manager_util.add_python_path_to_env()
|
||||||
|
|
||||||
import datetime as dt
|
|
||||||
|
|
||||||
if hasattr(dt, 'datetime'):
|
|
||||||
from datetime import datetime as dt_datetime
|
|
||||||
|
|
||||||
def current_timestamp():
|
|
||||||
return dt_datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
||||||
else:
|
|
||||||
# NOTE: Occurs in some Mac environments.
|
|
||||||
import time
|
|
||||||
logging.error(f"[ComfyUI-Manager] fallback timestamp mode\n datetime module is invalid: '{dt.__file__}'")
|
|
||||||
|
|
||||||
def current_timestamp():
|
|
||||||
return str(time.time()).split('.')[0]
|
|
||||||
|
|
||||||
|
|
||||||
cm_global.pip_blacklist = {'torch', 'torchaudio', 'torchsde', 'torchvision'}
|
cm_global.pip_blacklist = {'torch', 'torchaudio', 'torchsde', 'torchvision'}
|
||||||
cm_global.pip_downgrade_blacklist = ['torch', 'torchaudio', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
|
cm_global.pip_downgrade_blacklist = ['torch', 'torchaudio', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
|
||||||
|
|||||||
@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui-manager"
|
name = "comfyui-manager"
|
||||||
license = { text = "GPL-3.0-only" }
|
license = { text = "GPL-3.0-only" }
|
||||||
version = "4.0.3b4"
|
version = "4.0.3b5"
|
||||||
requires-python = ">= 3.9"
|
requires-python = ">= 3.9"
|
||||||
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user