diff --git a/Library/Homebrew/dev-cmd/bottle.rb b/Library/Homebrew/dev-cmd/bottle.rb index 0bba2d5d9f..48bd0f9e9e 100644 --- a/Library/Homebrew/dev-cmd/bottle.rb +++ b/Library/Homebrew/dev-cmd/bottle.rb @@ -231,23 +231,29 @@ module Homebrew system "/usr/bin/sudo", "--non-interactive", "/usr/sbin/purge" end - def self.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? + sig { returns(T::Array[String]) } + def self.tar_args + [].freeze + end - # Ensure tar is set up for reproducibility. + sig { params(mtime: String).returns(T::Array[String]) } + def self.reproducible_gnutar_args(mtime) + # Ensure gnu 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 + end - # TODO: Refactor and move to extend/os - return ["tar", gnutar_args].freeze if OS.linux? # rubocop:disable Homebrew/MoveToExtendOS + sig { params(args: T.untyped, mtime: String).returns([String, T::Array[String]]) } + def self.setup_tar_and_args!(args, mtime) + # Without --only-json-tab bottles are never reproducible + default_tar_args = ["tar", tar_args].freeze + 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. + # Use gnu-tar as it can be set up for reproducibility better than libarchive. begin gnu_tar = Formula["gnu-tar"] rescue FormulaUnavailableError @@ -256,7 +262,7 @@ module Homebrew ensure_formula_installed!(gnu_tar, reason: "bottling") - ["#{gnu_tar.opt_bin}/gtar", gnutar_args].freeze + ["#{gnu_tar.opt_bin}/gtar", reproducible_gnutar_args(mtime)].freeze end def self.formula_ignores(formula) @@ -799,3 +805,5 @@ module Homebrew checksums end end + +require "extend/os/dev-cmd/bottle" diff --git a/Library/Homebrew/extend/os/dev-cmd/bottle.rb b/Library/Homebrew/extend/os/dev-cmd/bottle.rb new file mode 100644 index 0000000000..d87c5e5843 --- /dev/null +++ b/Library/Homebrew/extend/os/dev-cmd/bottle.rb @@ -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 diff --git a/Library/Homebrew/extend/os/linux/dev-cmd/bottle.rb b/Library/Homebrew/extend/os/linux/dev-cmd/bottle.rb new file mode 100644 index 0000000000..f7807b2148 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/dev-cmd/bottle.rb @@ -0,0 +1,12 @@ +# typed: true +# frozen_string_literal: true + +module Homebrew + sig { params(args: T.untyped, mtime: String).returns([String, T::Array[String]]) } + def self.setup_tar_and_args!(args, mtime) + # Without --only-json-tab bottles are never reproducible + return ["tar", tar_args].freeze unless args.only_json_tab? + + ["tar", reproducible_gnutar_args(mtime)].freeze + end +end diff --git a/Library/Homebrew/extend/os/mac/dev-cmd/bottle.rb b/Library/Homebrew/extend/os/mac/dev-cmd/bottle.rb new file mode 100644 index 0000000000..ad0689473f --- /dev/null +++ b/Library/Homebrew/extend/os/mac/dev-cmd/bottle.rb @@ -0,0 +1,9 @@ +# typed: true +# frozen_string_literal: true + +module Homebrew + sig { returns(T::Array[String]) } + def self.tar_args + ["--no-mac-metadata", "--no-acls", "--no-xattrs"].freeze + end +end