load extensions' git metadata in parallel to loading the main program to save a ton of time during startup

This commit is contained in:
AUTOMATIC 2023-05-15 20:57:11 +03:00
parent 0d3a80e269
commit 0d2a4b608c
3 changed files with 26 additions and 3 deletions

View File

@ -83,6 +83,8 @@ def get_extension_config():
ext_config = {}
for ext in extensions.extensions:
ext.read_info_from_repo()
entry = {
"name": ext.name,
"path": ext.path,

View File

@ -1,5 +1,6 @@
import os
import sys
import threading
import traceback
import time
@ -24,6 +25,8 @@ def active():
class Extension:
lock = threading.Lock()
def __init__(self, name, path, enabled=True, is_builtin=False):
self.name = name
self.path = path
@ -42,8 +45,13 @@ class Extension:
if self.is_builtin or self.have_info_from_repo:
return
self.have_info_from_repo = True
with self.lock:
if self.have_info_from_repo:
return
self.do_read_info_from_repo()
def do_read_info_from_repo(self):
repo = None
try:
if os.path.exists(os.path.join(self.path, ".git")):
@ -70,6 +78,8 @@ class Extension:
print(f"Failed reading extension data from Git repository ({self.name}): {ex}", file=sys.stderr)
self.remote = None
self.have_info_from_repo = True
def list_files(self, subdir, extension):
from modules import scripts

View File

@ -1,6 +1,7 @@
import json
import os.path
import sys
import threading
import time
from datetime import datetime
import traceback
@ -484,11 +485,18 @@ def refresh_available_extensions_from_data(hide_tags, sort_column, filter_text="
return code, list(tags)
def preload_extensions_git_metadata():
for extension in extensions.extensions:
extension.read_info_from_repo()
def create_ui():
import modules.ui
config_states.list_config_states()
threading.Thread(target=preload_extensions_git_metadata).start()
with gr.Blocks(analytics_enabled=False) as ui:
with gr.Tabs(elem_id="tabs_extensions"):
with gr.TabItem("Installed", id="installed"):
@ -508,7 +516,8 @@ def create_ui():
</span>
"""
info = gr.HTML(html)
extensions_table = gr.HTML(lambda: extension_table())
extensions_table = gr.HTML('Loading...')
ui.load(fn=extension_table, inputs=[], outputs=[extensions_table])
apply.click(
fn=apply_and_restart,
@ -595,7 +604,8 @@ def create_ui():
config_save_button = gr.Button(value="Save Current Config")
config_states_info = gr.HTML("")
config_states_table = gr.HTML(lambda: update_config_states_table("Current"))
config_states_table = gr.HTML("Loading...")
ui.load(fn=update_config_states_table, inputs=[config_states_list], outputs=[config_states_table])
config_save_button.click(fn=save_config_state, inputs=[config_save_name], outputs=[config_states_list, config_states_info])
@ -608,4 +618,5 @@ def create_ui():
outputs=[config_states_table],
)
return ui