Skip to content

Commit

Permalink
Merge pull request #15173 from ywwry66/fix-brew-tests-tar
Browse files Browse the repository at this point in the history
Don't save mac metadata/extended attributes for `brew bottle`
  • Loading branch information
MikeMcQuaid committed Apr 12, 2023
2 parents 9f1d00e + 73a1380 commit 0d749b5
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 10 deletions.
28 changes: 18 additions & 10 deletions Library/Homebrew/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -231,23 +231,29 @@ def self.sudo_purge
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
Expand All @@ -256,7 +262,7 @@ def self.setup_tar_and_args!(args, mtime)

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)
Expand Down Expand Up @@ -799,3 +805,5 @@ def self.old_checksums(formula, formula_ast, bottle_hash, args:)
checksums
end
end

require "extend/os/dev-cmd/bottle"
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
12 changes: 12 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,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
9 changes: 9 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,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

0 comments on commit 0d749b5

Please sign in to comment.