Skip to content

Commit

Permalink
Merge pull request #14479 from hyuraku/apply-extend/os-to-dev-cmd/bottle
Browse files Browse the repository at this point in the history
move `dev-cmd/bottle` methods to extend/os
  • Loading branch information
MikeMcQuaid authored Feb 7, 2023
2 parents 206d4c8 + ddf4d6a commit e26784f
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 32 deletions.
42 changes: 10 additions & 32 deletions Library/Homebrew/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
require "erb"
require "utils/gzip"
require "api"
require "extend/os/dev-cmd/bottle"

BOTTLE_ERB = <<-EOS
bottle do
Expand Down Expand Up @@ -233,38 +234,26 @@ def sudo_purge
system "/usr/bin/sudo", "--non-interactive", "/usr/sbin/purge"
end

def setup_tar_and_args!(args, mtime)
def setup_tar_and_args!(_args, _mtime)
# Without --only-json-tab bottles are never reproducible
default_tar_args = ["tar", [].freeze].freeze
return default_tar_args unless args.only_json_tab?
["tar", [].freeze].freeze
end

alias generic_setup_tar_and_args! setup_tar_and_args!

def gnutar_args(mtime)
# Ensure tar is set up for reproducibility.
# https://reproducible-builds.org/docs/archives/
gnutar_args = [
[
"--format", "pax", "--owner", "0", "--group", "0", "--sort", "name", "--mtime=#{mtime}",
# Set exthdr names to exclude PID (for GNU tar <1.33). Also don't store atime and ctime.
"--pax-option", "globexthdr.name=/GlobalHead.%n,exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime"
].freeze

# TODO: Refactor and move to extend/os
return ["tar", gnutar_args].freeze if OS.linux? # rubocop:disable Homebrew/MoveToExtendOS

# Use gnu-tar on macOS as it can be set up for reproducibility better than libarchive.
begin
gnu_tar = Formula["gnu-tar"]
rescue FormulaUnavailableError
return default_tar_args
end

ensure_formula_installed!(gnu_tar, reason: "bottling")

["#{gnu_tar.opt_bin}/gtar", gnutar_args].freeze
end

def formula_ignores(f)
ignores = []
cellar_regex = Regexp.escape(HOMEBREW_CELLAR)
prefix_regex = Regexp.escape(HOMEBREW_PREFIX)

# Ignore matches to go keg, because all go binaries are statically linked.
any_go_deps = f.deps.any? do |dep|
Expand All @@ -275,22 +264,11 @@ def formula_ignores(f)
ignores << %r{#{cellar_regex}/#{go_regex}/[\d.]+/libexec}
end

# TODO: Refactor and move to extend/os
# rubocop:disable Homebrew/MoveToExtendOS
ignores << case f.name
# On Linux, GCC installation can be moved so long as the whole directory tree is moved together:
# https://gcc-help.gcc.gnu.narkive.com/GnwuCA7l/moving-gcc-from-the-installation-path-is-it-allowed.
when Version.formula_optionally_versioned_regex(:gcc)
Regexp.union(%r{#{cellar_regex}/gcc}, %r{#{prefix_regex}/opt/gcc}) if OS.linux?
# binutils is relocatable for the same reason: https://github.com/Homebrew/brew/pull/11899#issuecomment-906804451.
when Version.formula_optionally_versioned_regex(:binutils)
%r{#{cellar_regex}/binutils} if OS.linux?
end
# rubocop:enable Homebrew/MoveToExtendOS

ignores.compact
end

alias generic_formula_ignores formula_ignores

def bottle_formula(f, args:)
local_bottle_json = args.json? && f.local_bottle_path.present?

Expand Down
8 changes: 8 additions & 0 deletions Library/Homebrew/extend/os/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# typed: strict
# frozen_string_literal: true

if OS.mac?
require "extend/os/mac/dev-cmd/bottle"
elsif OS.linux?
require "extend/os/linux/dev-cmd/bottle"
end
34 changes: 34 additions & 0 deletions Library/Homebrew/extend/os/linux/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# typed: false
# frozen_string_literal: true

module Homebrew
extend T::Sig

module_function

def setup_tar_and_args!(args, mtime)
default_tar_args = generic_setup_tar_and_args!(args, mtime)
return default_tar_args unless args.only_json_tab?

["tar", gnutar_args(mtime)].freeze
end

def formula_ignores(f)
cellar_regex = Regexp.escape(HOMEBREW_CELLAR)
prefix_regex = Regexp.escape(HOMEBREW_PREFIX)

ignores = generic_formula_ignores(f)

ignores << case f.name
# On Linux, GCC installation can be moved so long as the whole directory tree is moved together:
# https://gcc-help.gcc.gnu.narkive.com/GnwuCA7l/moving-gcc-from-the-installation-path-is-it-allowed.
when Version.formula_optionally_versioned_regex(:gcc)
Regexp.union(%r{#{cellar_regex}/gcc}, %r{#{prefix_regex}/opt/gcc})
# binutils is relocatable for the same reason: https://github.com/Homebrew/brew/pull/11899#issuecomment-906804451.
when Version.formula_optionally_versioned_regex(:binutils)
%r{#{cellar_regex}/binutils}
end

ignores.compact
end
end
24 changes: 24 additions & 0 deletions Library/Homebrew/extend/os/mac/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# typed: false
# frozen_string_literal: true

module Homebrew
extend T::Sig

module_function

def setup_tar_and_args!(args, mtime)
default_tar_args = generic_setup_tar_and_args!(args, mtime)
return default_tar_args unless args.only_json_tab?

# Use gnu-tar on macOS as it can be set up for reproducibility better than libarchive.
begin
gnu_tar = Formula["gnu-tar"]
rescue FormulaUnavailableError
return default_tar_args
end

ensure_formula_installed!(gnu_tar, reason: "bottling")

["#{gnu_tar.opt_bin}/gtar", gnutar_args(mtime)].freeze
end
end

0 comments on commit e26784f

Please sign in to comment.