Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add cop to stop bin use in service blocks #15154

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions Library/Homebrew/rubocops/all.rb
Expand Up @@ -24,6 +24,7 @@
require_relative "livecheck"
require_relative "options"
require_relative "patches"
require_relative "service"
require_relative "text"
require_relative "urls"
require_relative "uses_from_macos"
Expand Down
31 changes: 31 additions & 0 deletions Library/Homebrew/rubocops/service.rb
@@ -0,0 +1,31 @@
# typed: true
# frozen_string_literal: true

require "rubocops/extend/formula_cop"

module RuboCop
module Cop
module FormulaAudit
# This cop audits the service block.
#
# @api private
class Service < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
service_node = find_block(body_node, :service)
return if service_node.blank?

# This check ensures that `bin` is not referenced because
# `opt_bin` is more portable and works with the API.
find_every_method_call_by_name(service_node, :bin).each do |bin_node|
offending_node(bin_node)
problem "Use `opt_bin` instead of `bin` in service blocks." do |corrector|
corrector.replace(bin_node.source_range, "opt_bin")
end
end
end
end
end
end
end
43 changes: 43 additions & 0 deletions Library/Homebrew/test/rubocops/service_spec.rb
@@ -0,0 +1,43 @@
# typed: false
# frozen_string_literal: true

require "rubocops/service"

describe RuboCop::Cop::FormulaAudit::Service do
subject(:cop) { described_class.new }

it "reports an offense when a formula's service block uses `bin`" do
expect_offense(<<~RUBY)
class Foo < Formula
url "https://brew.sh/foo-1.0.tgz"

service do
run [bin/"foo", "run", "-config", etc/"foo/config.json"]
^^^ Use `opt_bin` instead of `bin` in service blocks.
end
end
RUBY

expect_correction(<<~RUBY)
class Foo < Formula
url "https://brew.sh/foo-1.0.tgz"

service do
run [opt_bin/"foo", "run", "-config", etc/"foo/config.json"]
end
end
RUBY
end

it "reports no offenses when a formula's service block uses `opt_bin`" do
expect_no_offenses(<<~RUBY)
class Bin < Formula
url "https://brew.sh/foo-1.0.tgz"

service do
run [opt_bin/"bin", "run", "-config", etc/"bin/config.json"]
end
end
RUBY
end
end
2 changes: 1 addition & 1 deletion docs/Formula-Cookbook.md
Expand Up @@ -882,7 +882,7 @@ There are two ways to add `launchd` plists and `systemd` services to a formula,

```ruby
service do
run bin/"script"
run opt_bin/"script"
end
```

Expand Down