This improves the load time of most brew commands. For an example of
one of the simplest commands this speeds up:
Without Bootsnap:
```
$ hyperfine 'git checkout master; brew help' 'git checkout optimise_requires; brew help'
Benchmark 1: git checkout master; brew help
Time (mean ± σ): 525.0 ms ± 35.8 ms [User: 229.9 ms, System: 113.1 ms]
Range (min … max): 465.3 ms … 576.6 ms 10 runs
Benchmark 2: git checkout optimise_requires; brew help
Time (mean ± σ): 383.3 ms ± 25.1 ms [User: 133.0 ms, System: 72.1 ms]
Range (min … max): 353.0 ms … 443.6 ms 10 runs
Summary
git checkout optimise_requires; brew help ran
1.37 ± 0.13 times faster than git checkout master; brew help
```
With Bootsnap:
```
$ hyperfine 'git checkout master; brew help' 'git checkout optimise_requires; brew help'
Benchmark 1: git checkout master; brew help
Time (mean ± σ): 386.0 ms ± 30.9 ms [User: 130.2 ms, System: 93.8 ms]
Range (min … max): 359.5 ms … 469.3 ms 10 runs
Benchmark 2: git checkout optimise_requires; brew help
Time (mean ± σ): 330.2 ms ± 32.4 ms [User: 93.4 ms, System: 73.0 ms]
Range (min … max): 302.9 ms … 413.9 ms 10 runs
Summary
git checkout optimise_requires; brew help ran
1.17 ± 0.15 times faster than git checkout master; brew help
```
34 lines
800 B
Ruby
34 lines
800 B
Ruby
# typed: strict
|
|
# frozen_string_literal: true
|
|
|
|
raise "#{__FILE__} must not be loaded via `require`." if $PROGRAM_NAME != __FILE__
|
|
|
|
old_trap = trap("INT") { exit! 130 }
|
|
|
|
require_relative "global"
|
|
|
|
require "fcntl"
|
|
require "socket"
|
|
require "cli/parser"
|
|
require "cmd/postinstall"
|
|
require "json/add/exception"
|
|
|
|
begin
|
|
args = Homebrew::Cmd::Postinstall.new.args
|
|
error_pipe = UNIXSocket.open(ENV.fetch("HOMEBREW_ERROR_PIPE"), &:recv_io)
|
|
error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
|
|
|
trap("INT", old_trap)
|
|
|
|
formula = T.must(args.named.to_resolved_formulae.first)
|
|
if args.debug?
|
|
require "debrew"
|
|
formula.extend(Debrew::Formula)
|
|
end
|
|
formula.run_post_install
|
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
error_pipe.puts e.to_json
|
|
error_pipe.close
|
|
exit! 1
|
|
end
|