brew/Library/Homebrew/build.rb

275 lines
8.4 KiB
Ruby
Raw Normal View History

rubocop: Use `Sorbet/StrictSigil` as it's better than comments - Previously I thought that comments were fine to discourage people from wasting their time trying to bump things that used `undef` that Sorbet didn't support. But RuboCop is better at this since it'll complain if the comments are unnecessary. - Suggested in https://github.com/Homebrew/brew/pull/18018#issuecomment-2283369501. - I've gone for a mixture of `rubocop:disable` for the files that can't be `typed: strict` (use of undef, required before everything else, etc) and `rubocop:todo` for everything else that should be tried to make strictly typed. There's no functional difference between the two as `rubocop:todo` is `rubocop:disable` with a different name. - And I entirely disabled the cop for the docs/ directory since `typed: strict` isn't going to gain us anything for some Markdown linting config files. - This means that now it's easier to track what needs to be done rather than relying on checklists of files in our big Sorbet issue: ```shell $ git grep 'typed: true # rubocop:todo Sorbet/StrictSigil' | wc -l 268 ``` - And this is confirmed working for new files: ```shell $ git status On branch use-rubocop-for-sorbet-strict-sigils Untracked files: (use "git add <file>..." to include in what will be committed) Library/Homebrew/bad.rb Library/Homebrew/good.rb nothing added to commit but untracked files present (use "git add" to track) $ brew style Offenses: bad.rb:1:1: C: Sorbet/StrictSigil: Sorbet sigil should be at least strict got true. ^^^^^^^^^^^^^ 1340 files inspected, 1 offense detected ```
2024-08-12 10:30:59 +01:00
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
# This script is loaded by formula_installer as a separate instance.
2015-04-13 17:53:02 +08:00
# Thrown exceptions are propagated back to the parent process over a pipe
2011-03-15 22:02:14 -07:00
raise "#{__FILE__} must not be loaded via `require`." if $PROGRAM_NAME != __FILE__
old_trap = trap("INT") { exit! 130 }
require_relative "global"
require "build_options"
require "keg"
require "extend/ENV"
require "fcntl"
require "utils/socket"
require "cmd/install"
require "json/add/exception"
2020-08-14 02:51:51 +02:00
# A formula build.
2013-05-25 15:26:55 -05:00
class Build
attr_reader :formula, :deps, :reqs, :args
def initialize(formula, options, args:)
@formula = formula
@formula.build = BuildOptions.new(options, formula.options)
@args = args
2021-03-18 14:46:48 +00:00
if args.ignore_dependencies?
@deps = []
@reqs = []
else
@deps = expand_deps
@reqs = expand_reqs
end
2013-05-25 15:26:55 -05:00
end
def effective_build_options_for(dependent)
args = dependent.build.used_options
args |= Tab.for_formula(dependent).used_options
BuildOptions.new(args, dependent.options)
end
def expand_reqs
formula.recursive_requirements do |dependent, req|
build = effective_build_options_for(dependent)
2020-11-13 10:07:02 -05:00
if req.prune_from_option?(build) || req.prune_if_build_and_not_dependent?(dependent, formula) || req.test?
Requirement.prune
end
end
end
2013-05-25 15:26:55 -05:00
def expand_deps
formula.recursive_dependencies do |dependent, dep|
build = effective_build_options_for(dependent)
2020-11-13 17:21:51 +01:00
if dep.prune_from_option?(build) ||
dep.prune_if_build_and_not_dependent?(dependent, formula) ||
(dep.test? && !dep.build?) || dep.implicit?
Dependency.prune
elsif dep.build?
Dependency.keep_but_prune_recursive_deps
2013-05-25 15:26:55 -05:00
end
end
end
2013-05-25 15:26:55 -05:00
def install
formula_deps = deps.map(&:to_formula)
keg_only_deps = formula_deps.select(&:keg_only?)
2018-05-16 11:34:12 -07:00
run_time_deps = deps.reject(&:build?).map(&:to_formula)
2013-05-25 15:26:55 -05:00
formula_deps.each do |dep|
fixopt(dep) unless dep.opt_prefix.directory?
end
ENV.activate_extensions!(env: args.env)
if superenv?(args.env)
2024-08-23 05:50:39 +01:00
superenv = T.cast(ENV, Superenv)
superenv.keg_only_deps = keg_only_deps
superenv.deps = formula_deps
superenv.run_time_deps = run_time_deps
2022-08-02 08:47:19 -07:00
ENV.setup_build_environment(
2024-03-07 16:20:20 +00:00
formula:,
2022-08-02 08:47:19 -07:00
cc: args.cc,
build_bottle: args.build_bottle?,
bottle_arch: args.bottle_arch,
debug_symbols: args.debug_symbols?,
)
reqs.each do |req|
req.modify_build_environment(
env: args.env, cc: args.cc, build_bottle: args.build_bottle?, bottle_arch: args.bottle_arch,
)
end
2013-05-25 15:26:55 -05:00
else
2022-08-02 08:47:19 -07:00
ENV.setup_build_environment(
2024-03-07 16:20:20 +00:00
formula:,
2022-08-02 08:47:19 -07:00
cc: args.cc,
build_bottle: args.build_bottle?,
bottle_arch: args.bottle_arch,
debug_symbols: args.debug_symbols?,
)
reqs.each do |req|
req.modify_build_environment(
env: args.env, cc: args.cc, build_bottle: args.build_bottle?, bottle_arch: args.bottle_arch,
)
end
2013-05-25 15:26:55 -05:00
keg_only_deps.each do |dep|
2014-06-09 14:55:01 -05:00
ENV.prepend_path "PATH", dep.opt_bin.to_s
ENV.prepend_path "PKG_CONFIG_PATH", "#{dep.opt_lib}/pkgconfig"
ENV.prepend_path "PKG_CONFIG_PATH", "#{dep.opt_share}/pkgconfig"
ENV.prepend_path "ACLOCAL_PATH", "#{dep.opt_share}/aclocal"
ENV.prepend_path "CMAKE_PREFIX_PATH", dep.opt_prefix.to_s
ENV.prepend "LDFLAGS", "-L#{dep.opt_lib}" if dep.opt_lib.directory?
ENV.prepend "CPPFLAGS", "-I#{dep.opt_include}" if dep.opt_include.directory?
2013-05-25 15:26:55 -05:00
end
end
2017-07-15 17:26:42 -07:00
new_env = {
"TMPDIR" => HOMEBREW_TEMP,
2018-11-02 17:18:07 +00:00
"TEMP" => HOMEBREW_TEMP,
"TMP" => HOMEBREW_TEMP,
2017-07-15 17:26:42 -07:00
}
2017-07-15 17:26:42 -07:00
with_env(new_env) do
2024-07-24 06:16:18 +01:00
if args.debug? && !Homebrew::EnvConfig.disable_debrew?
require "debrew"
formula.extend(Debrew::Formula)
end
formula.update_head_version
formula.brew(
fetch: false,
keep_tmp: args.keep_tmp?,
debug_symbols: args.debug_symbols?,
interactive: args.interactive?,
) do
2021-10-22 20:07:24 +08:00
with_env(
# For head builds, HOMEBREW_FORMULA_PREFIX should include the commit,
# which is not known until after the formula has been staged.
HOMEBREW_FORMULA_PREFIX: formula.prefix,
# https://reproducible-builds.org/docs/build-path/
HOMEBREW_FORMULA_BUILDPATH: formula.buildpath,
2021-10-22 20:07:24 +08:00
# https://reproducible-builds.org/docs/source-date-epoch/
SOURCE_DATE_EPOCH: formula.source_modified_time.to_i.to_s,
2021-10-22 20:07:24 +08:00
# Avoid make getting confused about timestamps.
# https://github.com/Homebrew/homebrew-core/pull/87470
TZ: "UTC0",
2021-10-22 20:07:24 +08:00
) do
if args.git?
formula: don't include DATA patches in initial Git repo Currently, existing DATA patches are subsumed into the initial Git repo created by `brew install --git`, which makes creating a new DATA patch after more fixes a tedious and error-prone process. This PR delays DATA patch processing till after the Git repo is created, so a `git diff` at the end creates a correct and consolidated DATA patch block ready for insertion/replacement, or even migration to a proper remote patch URL. The difference is clearly seen in `gromgit/fuse/dislocker-mac`, which has both remote and DATA patches. Before: ``` % brew install -sig dislocker-mac ==> Fetching gromgit/fuse/dislocker-mac ==> Downloading https://github.com/Aorimn/dislocker/commit/2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch?full_index=1 Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/37276859cbebc1711941278db00cd8b25b98d69e15e31e33915a98d01a13febc--2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch ==> Downloading https://github.com/Aorimn/dislocker/archive/refs/tags/v0.7.3.tar.gz Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/b1ba1098c95535574936051eca45cc472955a5a024b81cc72e1c3b006e1950b3--dislocker-0.7.3.tar.gz ==> Installing dislocker-mac from gromgit/fuse ==> Patching ==> Applying 2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch Initialized empty Git repository in /private/tmp/dislocker-mac-20250215-35534-8qlxtp/dislocker-0.7.3/.git/ ==> Entering interactive mode... Type `exit` to return and finalize the installation. Install to this prefix: /opt/homebrew/Cellar/dislocker-mac/0.7.3_2 This directory is now a Git repository. Make your changes and then use: git diff | pbcopy to copy the diff to the clipboard. % git diff ``` After: ``` % brew install -sig dislocker-mac ==> Fetching gromgit/fuse/dislocker-mac ==> Downloading https://github.com/Aorimn/dislocker/commit/2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch?full_index=1 Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/37276859cbebc1711941278db00cd8b25b98d69e15e31e33915a98d01a13febc--2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch ==> Downloading https://github.com/Aorimn/dislocker/archive/refs/tags/v0.7.3.tar.gz Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/b1ba1098c95535574936051eca45cc472955a5a024b81cc72e1c3b006e1950b3--dislocker-0.7.3.tar.gz ==> Installing dislocker-mac from gromgit/fuse ==> Applying non-DATA patches ==> Applying 2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch Initialized empty Git repository in /private/tmp/dislocker-mac-20250215-32462-zh1akh/dislocker-0.7.3/.git/ ==> Applying DATA patches ==> Entering interactive mode... Type `exit` to return and finalize the installation. Install to this prefix: /opt/homebrew/Cellar/dislocker-mac/0.7.3_2 This directory is now a Git repository. Make your changes and then use: git diff | pbcopy to copy the diff to the clipboard. % git diff diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bd854d2..9ab137d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,7 +92,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") # Don't use `-read_only_relocs' here as it seems to only work for 32 bits # binaries set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-bind_at_load") - set (FUSE_LIB osxfuse_i64) + set (FUSE_LIB fuse) else() # Useless warnings when used within Darwin set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion") diff --git a/src/dislocker-fuse.c b/src/dislocker-fuse.c index f93523f..3dd106c 100644 --- a/src/dislocker-fuse.c +++ b/src/dislocker-fuse.c @@ -33,11 +33,7 @@ -#ifdef __DARWIN -# include <osxfuse/fuse.h> -#else -# include <fuse.h> -#endif /* __DARWIN */ +#include <fuse.h> /** NTFS virtual partition's name */ ```
2025-02-15 20:15:53 +08:00
formula.selective_patch(is_data: false)
2021-10-22 20:07:24 +08:00
system "git", "init"
system "git", "add", "-A"
formula: don't include DATA patches in initial Git repo Currently, existing DATA patches are subsumed into the initial Git repo created by `brew install --git`, which makes creating a new DATA patch after more fixes a tedious and error-prone process. This PR delays DATA patch processing till after the Git repo is created, so a `git diff` at the end creates a correct and consolidated DATA patch block ready for insertion/replacement, or even migration to a proper remote patch URL. The difference is clearly seen in `gromgit/fuse/dislocker-mac`, which has both remote and DATA patches. Before: ``` % brew install -sig dislocker-mac ==> Fetching gromgit/fuse/dislocker-mac ==> Downloading https://github.com/Aorimn/dislocker/commit/2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch?full_index=1 Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/37276859cbebc1711941278db00cd8b25b98d69e15e31e33915a98d01a13febc--2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch ==> Downloading https://github.com/Aorimn/dislocker/archive/refs/tags/v0.7.3.tar.gz Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/b1ba1098c95535574936051eca45cc472955a5a024b81cc72e1c3b006e1950b3--dislocker-0.7.3.tar.gz ==> Installing dislocker-mac from gromgit/fuse ==> Patching ==> Applying 2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch Initialized empty Git repository in /private/tmp/dislocker-mac-20250215-35534-8qlxtp/dislocker-0.7.3/.git/ ==> Entering interactive mode... Type `exit` to return and finalize the installation. Install to this prefix: /opt/homebrew/Cellar/dislocker-mac/0.7.3_2 This directory is now a Git repository. Make your changes and then use: git diff | pbcopy to copy the diff to the clipboard. % git diff ``` After: ``` % brew install -sig dislocker-mac ==> Fetching gromgit/fuse/dislocker-mac ==> Downloading https://github.com/Aorimn/dislocker/commit/2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch?full_index=1 Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/37276859cbebc1711941278db00cd8b25b98d69e15e31e33915a98d01a13febc--2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch ==> Downloading https://github.com/Aorimn/dislocker/archive/refs/tags/v0.7.3.tar.gz Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/b1ba1098c95535574936051eca45cc472955a5a024b81cc72e1c3b006e1950b3--dislocker-0.7.3.tar.gz ==> Installing dislocker-mac from gromgit/fuse ==> Applying non-DATA patches ==> Applying 2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch Initialized empty Git repository in /private/tmp/dislocker-mac-20250215-32462-zh1akh/dislocker-0.7.3/.git/ ==> Applying DATA patches ==> Entering interactive mode... Type `exit` to return and finalize the installation. Install to this prefix: /opt/homebrew/Cellar/dislocker-mac/0.7.3_2 This directory is now a Git repository. Make your changes and then use: git diff | pbcopy to copy the diff to the clipboard. % git diff diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bd854d2..9ab137d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,7 +92,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") # Don't use `-read_only_relocs' here as it seems to only work for 32 bits # binaries set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-bind_at_load") - set (FUSE_LIB osxfuse_i64) + set (FUSE_LIB fuse) else() # Useless warnings when used within Darwin set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion") diff --git a/src/dislocker-fuse.c b/src/dislocker-fuse.c index f93523f..3dd106c 100644 --- a/src/dislocker-fuse.c +++ b/src/dislocker-fuse.c @@ -33,11 +33,7 @@ -#ifdef __DARWIN -# include <osxfuse/fuse.h> -#else -# include <fuse.h> -#endif /* __DARWIN */ +#include <fuse.h> /** NTFS virtual partition's name */ ```
2025-02-15 20:15:53 +08:00
formula.selective_patch(is_data: true)
else
formula.patch
2021-10-22 20:07:24 +08:00
end
formula: don't include DATA patches in initial Git repo Currently, existing DATA patches are subsumed into the initial Git repo created by `brew install --git`, which makes creating a new DATA patch after more fixes a tedious and error-prone process. This PR delays DATA patch processing till after the Git repo is created, so a `git diff` at the end creates a correct and consolidated DATA patch block ready for insertion/replacement, or even migration to a proper remote patch URL. The difference is clearly seen in `gromgit/fuse/dislocker-mac`, which has both remote and DATA patches. Before: ``` % brew install -sig dislocker-mac ==> Fetching gromgit/fuse/dislocker-mac ==> Downloading https://github.com/Aorimn/dislocker/commit/2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch?full_index=1 Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/37276859cbebc1711941278db00cd8b25b98d69e15e31e33915a98d01a13febc--2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch ==> Downloading https://github.com/Aorimn/dislocker/archive/refs/tags/v0.7.3.tar.gz Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/b1ba1098c95535574936051eca45cc472955a5a024b81cc72e1c3b006e1950b3--dislocker-0.7.3.tar.gz ==> Installing dislocker-mac from gromgit/fuse ==> Patching ==> Applying 2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch Initialized empty Git repository in /private/tmp/dislocker-mac-20250215-35534-8qlxtp/dislocker-0.7.3/.git/ ==> Entering interactive mode... Type `exit` to return and finalize the installation. Install to this prefix: /opt/homebrew/Cellar/dislocker-mac/0.7.3_2 This directory is now a Git repository. Make your changes and then use: git diff | pbcopy to copy the diff to the clipboard. % git diff ``` After: ``` % brew install -sig dislocker-mac ==> Fetching gromgit/fuse/dislocker-mac ==> Downloading https://github.com/Aorimn/dislocker/commit/2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch?full_index=1 Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/37276859cbebc1711941278db00cd8b25b98d69e15e31e33915a98d01a13febc--2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch ==> Downloading https://github.com/Aorimn/dislocker/archive/refs/tags/v0.7.3.tar.gz Already downloaded: /Volumes/aho/Library/Caches/Homebrew/downloads/b1ba1098c95535574936051eca45cc472955a5a024b81cc72e1c3b006e1950b3--dislocker-0.7.3.tar.gz ==> Installing dislocker-mac from gromgit/fuse ==> Applying non-DATA patches ==> Applying 2cfbba2c8cc07e529622ba134d0a6982815d2b30.patch Initialized empty Git repository in /private/tmp/dislocker-mac-20250215-32462-zh1akh/dislocker-0.7.3/.git/ ==> Applying DATA patches ==> Entering interactive mode... Type `exit` to return and finalize the installation. Install to this prefix: /opt/homebrew/Cellar/dislocker-mac/0.7.3_2 This directory is now a Git repository. Make your changes and then use: git diff | pbcopy to copy the diff to the clipboard. % git diff diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bd854d2..9ab137d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,7 +92,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") # Don't use `-read_only_relocs' here as it seems to only work for 32 bits # binaries set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-bind_at_load") - set (FUSE_LIB osxfuse_i64) + set (FUSE_LIB fuse) else() # Useless warnings when used within Darwin set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion") diff --git a/src/dislocker-fuse.c b/src/dislocker-fuse.c index f93523f..3dd106c 100644 --- a/src/dislocker-fuse.c +++ b/src/dislocker-fuse.c @@ -33,11 +33,7 @@ -#ifdef __DARWIN -# include <osxfuse/fuse.h> -#else -# include <fuse.h> -#endif /* __DARWIN */ +#include <fuse.h> /** NTFS virtual partition's name */ ```
2025-02-15 20:15:53 +08:00
2021-10-22 20:07:24 +08:00
if args.interactive?
ohai "Entering interactive mode..."
puts <<~EOS
2021-10-22 20:07:24 +08:00
Type `exit` to return and finalize the installation.
Install to this prefix: #{formula.prefix}
EOS
2017-07-15 17:26:42 -07:00
2021-10-22 20:07:24 +08:00
if args.git?
puts <<~EOS
This directory is now a Git repository. Make your changes and then use:
git diff | pbcopy
to copy the diff to the clipboard.
EOS
end
interactive_shell(formula)
else
formula.prefix.mkpath
formula.logs.mkpath
(formula.logs/"00.options.out").write \
"#{formula.full_name} #{formula.build.used_options.sort.join(" ")}".strip
formula.install
stdlibs = detect_stdlibs
tab = Tab.create(formula, ENV.compiler, stdlibs.first)
tab.write
# Find and link metafiles
formula.prefix.install_metafiles formula.buildpath
formula.prefix.install_metafiles formula.libexec if formula.libexec.exist?
normalize_pod2man_outputs!(formula)
2021-10-22 20:07:24 +08:00
end
2013-05-25 15:26:55 -05:00
end
end
end
end
def detect_stdlibs
keg = Keg.new(formula.prefix)
# The stdlib recorded in the install receipt is used during dependency
# compatibility checks, so we only care about the stdlib that libraries
# link against.
keg.detect_cxx_stdlibs(skip_executables: true)
end
def fixopt(formula)
path = if formula.linked_keg.directory? && formula.linked_keg.symlink?
formula.linked_keg.resolved_path
elsif formula.prefix.directory?
formula.prefix
elsif (kids = formula.rack.children).size == 1 && kids.first.directory?
kids.first
else
raise
end
Keg.new(path).optlink(verbose: args.verbose?)
rescue
raise "#{formula.opt_prefix} not present or broken\nPlease reinstall #{formula.full_name}. Sorry :("
end
def normalize_pod2man_outputs!(formula)
keg = Keg.new(formula.prefix)
keg.normalize_pod2man_outputs!
end
end
begin
ENV.delete("HOMEBREW_FORBID_PACKAGES_FROM_PATHS")
2024-03-30 09:36:47 -07:00
args = Homebrew::Cmd::InstallCmd.new.args
Context.current = args.context
2020-08-01 17:37:11 +01:00
error_pipe = Utils::UNIXSocketExt.open(ENV.fetch("HOMEBREW_ERROR_PIPE"), &:recv_io)
error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
trap("INT", old_trap)
formula = args.named.to_formulae.first
options = Options.create(args.flags_only)
2024-03-07 16:20:20 +00:00
build = Build.new(formula, options, args:)
build.install
# Any exception means the build did not complete.
# The `case` for what to do per-exception class is further down.
rescue Exception => e # rubocop:disable Lint/RescueException
error_hash = JSON.parse e.to_json
# Special case: need to recreate BuildErrors in full
# for proper analytics reporting and error messages.
2019-08-19 14:27:29 +10:00
# BuildErrors are specific to build processes and not other
# children, which is why we create the necessary state here
# and not in Utils.safe_fork.
2023-03-12 17:06:29 -07:00
case e
when BuildError
error_hash["cmd"] = e.cmd
error_hash["args"] = e.args
error_hash["env"] = e.env
2023-03-12 17:06:29 -07:00
when ErrorDuringExecution
error_hash["cmd"] = e.cmd
error_hash["status"] = if e.status.is_a?(Process::Status)
{
exitstatus: e.status.exitstatus,
termsig: e.status.termsig,
}
else
e.status
end
error_hash["output"] = e.output
end
error_pipe.puts error_hash.to_json
error_pipe.close
exit! 1
end