updates to launcer

This commit is contained in:
Mark Gregory
2026-10-23 10:56:12 +01:00
parent da75e6b21d
commit b34d1ceccf
@@ -0,0 +1,88 @@
#!/usr/bin/env python3
from pathlib import Path
from datetime import datetime
import shutil
root = Path.cwd()
controller = root / 'OrionToolbar/OrionVMController.swift'
view = root / 'OrionToolbar/OrionMenuView.swift'
if not controller.exists() or not view.exists():
raise SystemExit('Run from the OrionToolbar project root. No changes made.')
c = controller.read_text()
v = view.read_text()
# Verify all expected anchors before writing anything.
checks = [
(c, 'await discoverVMs()\n await refreshAll()', 1),
(c, 'await self.discoverVMs(); await self.refreshAll()', 1),
(c, 'func refreshServiceAvailability() async {', 1),
(c, 'func openSSH(_ s: ServerDefinition) {', 1),
(c, 'func openMailpit(_ s: ServerDefinition) { if let p = s.mailpitPort, let url = URL(string: "http://\\(s.host):\\(p)") { NSWorkspace.shared.open(url) } }', 1),
(v, 'if !server.host.isEmpty && !server.sshUser.isEmpty {', 2),
(v, 'if !server.host.isEmpty && server.mailpitPort != nil {', 2),
]
for src, anchor, count in checks:
if src.count(anchor) != count:
raise SystemExit(f'Expected {count} occurrence(s) of {anchor!r}, found {src.count(anchor)}. No changes made.')
c = c.replace('await discoverVMs()\n await refreshAll()', 'await discoverVMs()\n await refreshAll()\n await refreshServiceAvailability()', 1)
c = c.replace('await self.discoverVMs(); await self.refreshAll()', 'await self.discoverVMs(); await self.refreshAll(); await self.refreshServiceAvailability()', 1)
# Dismiss the menu bar panel before activating external apps. This must happen
# at the click site; delayed activation alone leaves the panel in front.
helper = ''' private func dismissMenuPanelAndActivate(_ application: NSRunningApplication?) {
NSApp.keyWindow?.orderOut(nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
application?.activate(options: [.activateAllWindows])
}
}
'''
if 'private func dismissMenuPanelAndActivate(' not in c:
c = c.replace(' func openSSH(_ s: ServerDefinition) {', helper + ' func openSSH(_ s: ServerDefinition) {', 1)
old = ''' NSWorkspace.shared.open([scriptURL], withApplicationAt: terminalURL, configuration: configuration) { _, error in
Task { @MainActor in
if let error { self.lastError = "Could not open Terminal: \\(error.localizedDescription)" }
}
}'''
new = ''' NSApp.keyWindow?.orderOut(nil)
NSWorkspace.shared.open([scriptURL], withApplicationAt: terminalURL, configuration: configuration) { app, error in
Task { @MainActor in
if let error {
self.lastError = "Could not open Terminal: \\(error.localizedDescription)"
} else {
self.dismissMenuPanelAndActivate(app)
}
}
}'''
if c.count(old) != 1:
raise SystemExit('SSH open completion differs from expected. No changes made.')
c = c.replace(old, new, 1)
old_mail = ' func openMailpit(_ s: ServerDefinition) { if let p = s.mailpitPort, let url = URL(string: "http://\\(s.host):\\(p)") { NSWorkspace.shared.open(url) } }'
new_mail = ''' func openMailpit(_ s: ServerDefinition) {
guard let port = s.mailpitPort,
let url = URL(string: "http://\\(s.host):\\(port)") else { return }
NSApp.keyWindow?.orderOut(nil)
NSWorkspace.shared.open(url)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
if let browser = NSWorkspace.shared.frontmostApplication,
browser.bundleIdentifier != Bundle.main.bundleIdentifier {
browser.activate(options: [.activateAllWindows])
}
}
}'''
c = c.replace(old_mail, new_mail, 1)
v = v.replace('if !server.host.isEmpty && !server.sshUser.isEmpty {', 'if !server.host.isEmpty && !server.sshUser.isEmpty && vm.reachableSSH.contains(server.id) {')
v = v.replace('if !server.host.isEmpty && server.mailpitPort != nil {', 'if !server.host.isEmpty && server.mailpitPort != nil && vm.reachableMailpit.contains(server.id) {')
backup = root / 'backups' / ('service-foreground-' + datetime.now().strftime('%Y%m%d-%H%M%S'))
for path, content in [(controller, c), (view, v)]:
dest = backup / path.relative_to(root)
dest.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(path, dest)
path.write_text(content)
print('Updated:', path.relative_to(root))
print('Backup:', backup)