Skip to content

Commit 4eeb9d4

Browse files
authored
Merge pull request #3763 from vladmandic/dev
refresh master
2 parents c925b61 + 4e06125 commit 4eeb9d4

File tree

6 files changed

+37
-16
lines changed

6 files changed

+37
-16
lines changed

CHANGELOG.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,17 @@
22

33
## Update for 2025-02-20
44

5-
### Highlight for 2025-02-20
5+
Quick release refresh:
6+
- remove ui splash screen on auth fail
7+
- add `--extensions-dir` cli arg and `SD_EXTENSIONSDIR` env variable to specify extensions directory
8+
- log full path when reading/saving `config.json`
9+
- log full path to `sdnext.log`
10+
- log system hostname in `sdnext.log`
11+
- log extensions path in `sdnext.log`
12+
13+
## Update for 2025-02-18
14+
15+
### Highlight for 2025-02-18
616

717
We're back with another update with nearly 100 commits!
818
- Starting with massive UI update with full [localization](https://vladmandic.github.io/sdnext-docs/Locale/) for 8 languages

installer.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import time
66
import shutil
77
import locale
8+
import socket
89
import logging
910
import platform
1011
import subprocess
@@ -26,6 +27,7 @@ class Dot(dict): # dot notation access to dictionary attributes
2627
debug = log.debug if os.environ.get('SD_INSTALL_DEBUG', None) is not None else lambda *args, **kwargs: None
2728
pip_log = '--log pip.log ' if os.environ.get('SD_PIP_DEBUG', None) is not None else ''
2829
log_file = os.path.join(os.path.dirname(__file__), 'sdnext.log')
30+
hostname = socket.gethostname()
2931
log_rolled = False
3032
first_call = True
3133
quick_allowed = True
@@ -176,7 +178,7 @@ def get(self):
176178
fh.doRollover()
177179
log_rolled = True
178180

179-
fh.formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(module)s | %(message)s')
181+
fh.formatter = logging.Formatter(f'%(asctime)s | {hostname} | %(name)s | %(levelname)s | %(module)s | %(message)s')
180182
fh.setLevel(logging.DEBUG)
181183
log.addHandler(fh)
182184

@@ -203,7 +205,7 @@ def quiet_log(quiet: bool=False, *args, **kwargs): # pylint: disable=redefined-o
203205

204206
def get_logfile():
205207
log_size = os.path.getsize(log_file) if os.path.exists(log_file) else 0
206-
log.info(f'Logger: file="{log_file}" level={logging.getLevelName(logging.DEBUG if args.debug else logging.INFO)} size={log_size} mode={"append" if not log_rolled else "create"}')
208+
log.info(f'Logger: file="{os.path.abspath(log_file)}" level={logging.getLevelName(logging.DEBUG if args.debug else logging.INFO)} host="{hostname}" size={log_size} mode={"append" if not log_rolled else "create"}')
207209
return log_file
208210

209211

@@ -979,14 +981,13 @@ def run_extension_installer(folder):
979981

980982
# get list of all enabled extensions
981983
def list_extensions_folder(folder, quiet=False):
982-
name = os.path.basename(folder)
983984
disabled_extensions_all = opts.get('disable_all_extensions', 'none')
984985
if disabled_extensions_all != 'none':
985986
return []
986987
disabled_extensions = opts.get('disabled_extensions', [])
987988
enabled_extensions = [x for x in os.listdir(folder) if os.path.isdir(os.path.join(folder, x)) and x not in disabled_extensions and not x.startswith('.')]
988989
if not quiet:
989-
log.info(f'Extensions: enabled={enabled_extensions} {name}')
990+
log.info(f'Extensions: path="{folder}" enabled={enabled_extensions}')
990991
return enabled_extensions
991992

992993

javascript/loader.js

+16-10
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,22 @@ async function preloadImages() {
1919
}
2020
try {
2121
await Promise.all(imagePromises);
22+
return true;
2223
} catch (error) {
2324
error(`preloadImages: ${error}`);
25+
return false;
2426
}
2527
}
2628

29+
async function removeSplash() {
30+
const splash = document.getElementById('splash');
31+
if (splash) splash.remove();
32+
log('removeSplash');
33+
const t = Math.round(performance.now() - appStartTime) / 1000;
34+
log('startupTime', t);
35+
xhrPost(`${window.api}/log`, { message: `ready time=${t}` });
36+
}
37+
2738
async function createSplash() {
2839
const dark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
2940
log('createSplash', { theme: dark ? 'dark' : 'light' });
@@ -34,7 +45,11 @@ async function createSplash() {
3445
<div id="motd" class="motd""></div>
3546
</div>`;
3647
document.body.insertAdjacentHTML('beforeend', splash);
37-
await preloadImages();
48+
const ok = await preloadImages();
49+
if (!ok) {
50+
removeSplash();
51+
return;
52+
}
3853
const imgEl = `<div id="spash-img" class="splash-img" alt="logo" style="background-image: url(file=html/logo-bg-${dark ? 'dark' : 'light'}.jpg), url(file=html/logo-bg-${num}.jpg); background-blend-mode: ${dark ? 'multiply' : 'lighten'}"></div>`;
3954
document.getElementById('splash').insertAdjacentHTML('afterbegin', imgEl);
4055
fetch(`${window.api}/motd`)
@@ -46,13 +61,4 @@ async function createSplash() {
4661
.catch((err) => error(`getMOTD: ${err}`));
4762
}
4863

49-
async function removeSplash() {
50-
const splash = document.getElementById('splash');
51-
if (splash) splash.remove();
52-
log('removeSplash');
53-
const t = Math.round(performance.now() - appStartTime) / 1000;
54-
log('startupTime', t);
55-
xhrPost(`${window.api}/log`, { message: `ready time=${t}` });
56-
}
57-
5864
window.onload = createSplash;

modules/cmd_args.py

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def main_args():
3131
group_paths.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s")
3232
group_paths.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s")
3333
group_paths.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", 'models'), help="Base path where all models are stored, default: %(default)s",)
34+
group_paths.add_argument("--extensions-dir", type=str, default=os.environ.get("SD_EXTENSIONSDIR", None), help="Base path where all extensions are stored, default: %(default)s",)
3435

3536
group_diag = parser.add_argument_group('Diagnostics')
3637
group_diag.add_argument("--no-hashing", default=os.environ.get("SD_NOHASHING", False), action='store_true', help="Disable hashing of checkpoints, default: %(default)s")

modules/paths.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
parser.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s")
1414
parser.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s")
1515
parser.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", None), help="Base path where all models are stored, default: %(default)s",)
16+
parser.add_argument("--extensions-dir", type=str, default=os.environ.get("SD_EXTENSIONSDIR", None), help="Base path where all extensions are stored, default: %(default)s",)
1617
cli = parser.parse_known_args(argv)[0]
1718
parser.add_argument("--config", type=str, default=os.environ.get("SD_CONFIG", os.path.join(cli.data_dir, 'config.json')), help="Use specific server configuration file, default: %(default)s") # twice because we want data_dir
1819
cli = parser.parse_known_args(argv)[0]
@@ -28,7 +29,7 @@
2829
data_path = cli.data_dir
2930
models_config = cli.models_dir or config.get('models_dir') or 'models'
3031
models_path = models_config if os.path.isabs(models_config) else os.path.join(data_path, models_config)
31-
extensions_dir = os.path.join(data_path, "extensions")
32+
extensions_dir = cli.extensions_dir or os.path.join(data_path, "extensions")
3233
extensions_builtin_dir = "extensions-builtin"
3334
sd_configs_path = os.path.join(script_path, "configs")
3435
sd_default_config = os.path.join(sd_configs_path, "v1-inference.yaml")

modules/shared.py

+2
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ def save_atomic(self, filename=None, silent=False):
11291129
self.filename = config_filename
11301130
if filename is None:
11311131
filename = self.filename
1132+
filename = os.path.abspath(filename)
11321133
if cmd_opts.freeze:
11331134
log.warning(f'Setting: fn="{filename}" save disabled')
11341135
return
@@ -1173,6 +1174,7 @@ def same_type(self, x, y):
11731174
def load(self, filename=None):
11741175
if filename is None:
11751176
filename = self.filename
1177+
filename = os.path.abspath(filename)
11761178
if not os.path.isfile(filename):
11771179
log.debug(f'Settings: fn="{filename}" created')
11781180
self.save(filename)

0 commit comments

Comments
 (0)