Path: blob/master/modules/config_states.py
3055 views
"""1Supports saving and restoring webui and extensions from a known working set of commits2"""34import os5import json6import tqdm78from datetime import datetime9import git1011from modules import shared, extensions, errors12from modules.paths_internal import script_path, config_states_dir1314all_config_states = {}151617def list_config_states():18global all_config_states1920all_config_states.clear()21os.makedirs(config_states_dir, exist_ok=True)2223config_states = []24for filename in os.listdir(config_states_dir):25if filename.endswith(".json"):26path = os.path.join(config_states_dir, filename)27try:28with open(path, "r", encoding="utf-8") as f:29j = json.load(f)30assert "created_at" in j, '"created_at" does not exist'31j["filepath"] = path32config_states.append(j)33except Exception as e:34print(f'[ERROR]: Config states {path}, {e}')3536config_states = sorted(config_states, key=lambda cs: cs["created_at"], reverse=True)3738for cs in config_states:39timestamp = datetime.fromtimestamp(cs["created_at"]).strftime('%Y-%m-%d %H:%M:%S')40name = cs.get("name", "Config")41full_name = f"{name}: {timestamp}"42all_config_states[full_name] = cs4344return all_config_states454647def get_webui_config():48webui_repo = None4950try:51if os.path.exists(os.path.join(script_path, ".git")):52webui_repo = git.Repo(script_path)53except Exception:54errors.report(f"Error reading webui git info from {script_path}", exc_info=True)5556webui_remote = None57webui_commit_hash = None58webui_commit_date = None59webui_branch = None60if webui_repo and not webui_repo.bare:61try:62webui_remote = next(webui_repo.remote().urls, None)63head = webui_repo.head.commit64webui_commit_date = webui_repo.head.commit.committed_date65webui_commit_hash = head.hexsha66webui_branch = webui_repo.active_branch.name6768except Exception:69webui_remote = None7071return {72"remote": webui_remote,73"commit_hash": webui_commit_hash,74"commit_date": webui_commit_date,75"branch": webui_branch,76}777879def get_extension_config():80ext_config = {}8182for ext in extensions.extensions:83ext.read_info_from_repo()8485entry = {86"name": ext.name,87"path": ext.path,88"enabled": ext.enabled,89"is_builtin": ext.is_builtin,90"remote": ext.remote,91"commit_hash": ext.commit_hash,92"commit_date": ext.commit_date,93"branch": ext.branch,94"have_info_from_repo": ext.have_info_from_repo95}9697ext_config[ext.name] = entry9899return ext_config100101102def get_config():103creation_time = datetime.now().timestamp()104webui_config = get_webui_config()105ext_config = get_extension_config()106107return {108"created_at": creation_time,109"webui": webui_config,110"extensions": ext_config111}112113114def restore_webui_config(config):115print("* Restoring webui state...")116117if "webui" not in config:118print("Error: No webui data saved to config")119return120121webui_config = config["webui"]122123if "commit_hash" not in webui_config:124print("Error: No commit saved to webui config")125return126127webui_commit_hash = webui_config.get("commit_hash", None)128webui_repo = None129130try:131if os.path.exists(os.path.join(script_path, ".git")):132webui_repo = git.Repo(script_path)133except Exception:134errors.report(f"Error reading webui git info from {script_path}", exc_info=True)135return136137try:138webui_repo.git.fetch(all=True)139webui_repo.git.reset(webui_commit_hash, hard=True)140print(f"* Restored webui to commit {webui_commit_hash}.")141except Exception:142errors.report(f"Error restoring webui to commit{webui_commit_hash}")143144145def restore_extension_config(config):146print("* Restoring extension state...")147148if "extensions" not in config:149print("Error: No extension data saved to config")150return151152ext_config = config["extensions"]153154results = []155disabled = []156157for ext in tqdm.tqdm(extensions.extensions):158if ext.is_builtin:159continue160161ext.read_info_from_repo()162current_commit = ext.commit_hash163164if ext.name not in ext_config:165ext.disabled = True166disabled.append(ext.name)167results.append((ext, current_commit[:8], False, "Saved extension state not found in config, marking as disabled"))168continue169170entry = ext_config[ext.name]171172if "commit_hash" in entry and entry["commit_hash"]:173try:174ext.fetch_and_reset_hard(entry["commit_hash"])175ext.read_info_from_repo()176if current_commit != entry["commit_hash"]:177results.append((ext, current_commit[:8], True, entry["commit_hash"][:8]))178except Exception as ex:179results.append((ext, current_commit[:8], False, ex))180else:181results.append((ext, current_commit[:8], False, "No commit hash found in config"))182183if not entry.get("enabled", False):184ext.disabled = True185disabled.append(ext.name)186else:187ext.disabled = False188189shared.opts.disabled_extensions = disabled190shared.opts.save(shared.config_filename)191192print("* Finished restoring extensions. Results:")193for ext, prev_commit, success, result in results:194if success:195print(f" + {ext.name}: {prev_commit} -> {result}")196else:197print(f" ! {ext.name}: FAILURE ({result})")198199200