From f2513965e8b8f9dd1aed213542ced9f3b47e3eb3 Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Mon, 7 Apr 2025 14:10:42 +0100 Subject: [PATCH 1/2] Revert "Revert "bundle: handle simultaneous `exec --services` better"" This reverts commit 94db0b2f3408280e20ca3888ed5c91672ab4fca2. --- Library/Homebrew/bundle/commands/exec.rb | 16 ++++++++++++---- .../Homebrew/test/bundle/commands/exec_spec.rb | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/bundle/commands/exec.rb b/Library/Homebrew/bundle/commands/exec.rb index b4e9b75d69..aabec4eb0f 100644 --- a/Library/Homebrew/bundle/commands/exec.rb +++ b/Library/Homebrew/bundle/commands/exec.rb @@ -179,6 +179,7 @@ module Homebrew params( entries: T::Array[Homebrew::Bundle::Dsl::Entry], _block: T.proc.params( + entry: Homebrew::Bundle::Dsl::Entry, info: T::Hash[String, T.anything], service_file: Pathname, conflicting_services: T::Array[T::Hash[String, T.anything]], @@ -245,15 +246,20 @@ module Homebrew raise "Failed to get service info for #{entry.name}" if info.nil? - yield info, service_file, conflicting_services + yield entry, info, service_file, conflicting_services end end sig { params(entries: T::Array[Homebrew::Bundle::Dsl::Entry], _block: T.nilable(T.proc.void)).void } private_class_method def self.run_services(entries, &_block) + entries_to_stop = [] services_to_restart = [] - map_service_info(entries) do |info, service_file, conflicting_services| + map_service_info(entries) do |entry, info, service_file, conflicting_services| + # Don't restart if already running this version + loaded_file = Pathname.new(info["loaded_file"].to_s) + next if info["running"] && loaded_file&.file? && loaded_file&.realpath == service_file.realpath + if info["running"] && !Bundle::BrewServices.stop(info["name"], keep: true) opoo "Failed to stop #{info["name"]} service" end @@ -269,6 +275,8 @@ module Homebrew unless Bundle::BrewServices.run(info["name"], file: service_file) opoo "Failed to start #{info["name"]} service" end + + entries_to_stop << entry end return unless block_given? @@ -277,7 +285,7 @@ module Homebrew yield ensure # Do a full re-evaluation of services instead state has changed - stop_services(entries) + stop_services(entries_to_stop) services_to_restart.each do |service| next if Bundle::BrewServices.run(service) @@ -289,7 +297,7 @@ module Homebrew sig { params(entries: T::Array[Homebrew::Bundle::Dsl::Entry]).void } private_class_method def self.stop_services(entries) - map_service_info(entries) do |info, _, _| + map_service_info(entries) do |_, info, _, _| next unless info["loaded"] # Try avoid services not started by `brew bundle services` diff --git a/Library/Homebrew/test/bundle/commands/exec_spec.rb b/Library/Homebrew/test/bundle/commands/exec_spec.rb index 836ca9fa05..a6cc0114de 100644 --- a/Library/Homebrew/test/bundle/commands/exec_spec.rb +++ b/Library/Homebrew/test/bundle/commands/exec_spec.rb @@ -185,6 +185,7 @@ RSpec.describe Homebrew::Bundle::Commands::Exec do allow(pkgconf).to receive(:any_version_installed?).and_return(false) allow_any_instance_of(Pathname).to receive(:file?).and_return(true) + allow_any_instance_of(Pathname).to receive(:realpath) { |path| path } allow(described_class).to receive(:exit!).and_return(nil) end From 80f5c42f027cd0cecb29ce5dec84d9e37c61343a Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Mon, 7 Apr 2025 14:12:41 +0100 Subject: [PATCH 2/2] bundle/commands/exec: handle no services to start --- Library/Homebrew/bundle/commands/exec.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Library/Homebrew/bundle/commands/exec.rb b/Library/Homebrew/bundle/commands/exec.rb index aabec4eb0f..c411d1e316 100644 --- a/Library/Homebrew/bundle/commands/exec.rb +++ b/Library/Homebrew/bundle/commands/exec.rb @@ -196,6 +196,8 @@ module Homebrew [entry, formula] end.to_h + return if entries_formulae.empty? + conflicts = entries_formulae.to_h do |entry, formula| [ entry,