Merge pull request #11253 from Bo98/gnu-tar
dev-cmd/bottle: use gnu-tar universally, sort entries & use PAX
This commit is contained in:
commit
af1e39797d
@ -254,24 +254,26 @@ module Homebrew
|
|||||||
system "/usr/bin/sudo", "--non-interactive", "/usr/sbin/purge"
|
system "/usr/bin/sudo", "--non-interactive", "/usr/sbin/purge"
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup_tar_and_args!
|
def setup_tar_and_args!(args)
|
||||||
# Unset the owner/group for reproducible bottles.
|
# Without --only-json-tab bottles are never reproducible
|
||||||
|
default_tar_args = ["tar", [].freeze].freeze
|
||||||
|
return default_tar_args unless args.only_json_tab?
|
||||||
|
|
||||||
# System bsdtar is new enough on macOS Catalina and above.
|
# Ensure tar is set up for reproducibility.
|
||||||
# Set uid and gid for reproducible bottles.
|
# https://reproducible-builds.org/docs/archives/
|
||||||
return ["tar", ["--uid", "0", "--gid", "0"]].freeze if OS.mac? && MacOS.version >= :catalina
|
gnutar_args = [
|
||||||
|
"--format", "pax", "--owner", "0", "--group", "0", "--sort", "name",
|
||||||
|
# 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
|
||||||
|
|
||||||
# Use gnu-tar on Linux
|
|
||||||
# Set owner and group for reproducible bottles.
|
|
||||||
gnutar_args = ["--owner", "0", "--group", "0"]
|
|
||||||
return ["tar", gnutar_args].freeze if OS.linux?
|
return ["tar", gnutar_args].freeze if OS.linux?
|
||||||
|
|
||||||
# Use gnu-tar on older macOS versions for `--owner`/`--group` support (which
|
# Use gnu-tar on macOS as it can be set up for reproducibility better than libarchive.
|
||||||
# old `libarchive` doesn't have).
|
|
||||||
begin
|
begin
|
||||||
gnu_tar = Formula["gnu-tar"]
|
gnu_tar = Formula["gnu-tar"]
|
||||||
rescue FormulaUnavailableError
|
rescue FormulaUnavailableError
|
||||||
return ["tar", []].freeze
|
return default_tar_args
|
||||||
end
|
end
|
||||||
|
|
||||||
unless gnu_tar.any_version_installed?
|
unless gnu_tar.any_version_installed?
|
||||||
@ -279,7 +281,7 @@ module Homebrew
|
|||||||
safe_system HOMEBREW_BREW_FILE, "install", "--formula", gnu_tar.full_name
|
safe_system HOMEBREW_BREW_FILE, "install", "--formula", gnu_tar.full_name
|
||||||
end
|
end
|
||||||
|
|
||||||
["#{gnu_tar.opt_bin}/gtar", gnutar_args]
|
["#{gnu_tar.opt_bin}/gtar", gnutar_args].freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def bottle_formula(f, args:)
|
def bottle_formula(f, args:)
|
||||||
@ -416,9 +418,8 @@ module Homebrew
|
|||||||
cd cellar do
|
cd cellar do
|
||||||
sudo_purge
|
sudo_purge
|
||||||
# Tar then gzip for reproducible bottles.
|
# Tar then gzip for reproducible bottles.
|
||||||
tar, tar_args = setup_tar_and_args!
|
tar, tar_args = setup_tar_and_args!(args)
|
||||||
# Use portable tar format to match libarchive format.
|
safe_system tar, "--create", "--numeric-owner",
|
||||||
safe_system tar, "--create", "--numeric-owner", "--format", "ustar",
|
|
||||||
*tar_args,
|
*tar_args,
|
||||||
"--file", tar_path, "#{f.name}/#{f.pkg_version}"
|
"--file", tar_path, "#{f.name}/#{f.pkg_version}"
|
||||||
sudo_purge
|
sudo_purge
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user