fix: run brew commands on a serial queue, one at a time
runBrew dispatched onto the global concurrent queue, so overlapping operations (refresh timer firing mid-upgrade, quick manual actions) ran multiple brew processes at once — each able to summon its own sudo password dialog, hence duplicate password windows. A private serial queue makes every brew command wait for the previous one, so a second dialog cannot appear while one is open. Log output no longer interleaves either. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
25e4476317
commit
5b1820b7e1
|
|
@ -169,10 +169,15 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
|||
return url
|
||||
}
|
||||
|
||||
/// Serial: brew commands run strictly one after another. Concurrent brew
|
||||
/// processes could each summon their own sudo password dialog (and their
|
||||
/// log output interleaved); queueing them prevents both.
|
||||
static let brewQueue = DispatchQueue(label: "fr.socheleau.BrewBar.brew")
|
||||
|
||||
/// askpassMessage customizes the sudo dialog ("...password to <message>.");
|
||||
/// defaults to naming the brew command.
|
||||
func runBrew(_ command: String, askpassMessage: String? = nil, completion: @escaping (String) -> Void = { _ in }) {
|
||||
DispatchQueue.global().async {
|
||||
Self.brewQueue.async {
|
||||
let brew = self.resolveBrewPath()
|
||||
let cleaned = command.replacingOccurrences(of: "brew ", with: "")
|
||||
let arguments = [brew] + cleaned.split(separator: " ").map(String.init)
|
||||
|
|
|
|||
Loading…
Reference in a new issue