Module: Utils::Gzip Private
- Extended by:
- Output::Mixin
- Defined in:
- utils/gzip.rb
Overview
This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.
Helper functions for creating gzip files.
Constant Summary collapse
- GZIP_BUFFER_SIZE =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
Apple's gzip also uses zlib so use the same buffer size here. https://github.com/apple-oss-distributions/file_cmds/blob/file_cmds-400/gzip/gzip.c#L147
T.let(64 * 1024, Integer)
Class Method Summary collapse
-
.compress(*paths, reproducible: true, mtime: ENV["SOURCE_DATE_EPOCH"].to_i) ⇒ Array<Pathname>
Compress one or more files with
gzip, reproducibly by default. - .compress_with_options(path, mtime: ENV["SOURCE_DATE_EPOCH"].to_i, orig_name: File.basename(path), output: "#{path}.gz") ⇒ Pathname private
Methods included from Output::Mixin
issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, opoo_without_github_actions_annotation, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_uninstalled, pretty_upgradable
Class Method Details
.compress(*paths, reproducible: true, mtime: ENV["SOURCE_DATE_EPOCH"].to_i) ⇒ Array<Pathname>
Compress one or more files with gzip, reproducibly by default.
Unlike the system gzip, this avoids recording the build-time modification
time so that the output is deterministic (see https://docs.brew.sh/Reproducible-Builds).
Each file is compressed in place, placing the result next to the original
with a .gz suffix, and the resulting paths are returned.
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'utils/gzip.rb', line 71 def self.compress(*paths, reproducible: true, mtime: ENV["SOURCE_DATE_EPOCH"].to_i) if reproducible paths.map do |path| (path, mtime:) end else paths.map do |path| safe_system "gzip", path Pathname.new("#{path}.gz") end end end |
.compress_with_options(path, mtime: ENV["SOURCE_DATE_EPOCH"].to_i, orig_name: File.basename(path), output: "#{path}.gz") ⇒ Pathname
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'utils/gzip.rb', line 23 def self.(path, mtime: ENV["SOURCE_DATE_EPOCH"].to_i, orig_name: File.basename(path), output: "#{path}.gz") # There are two problems if `mtime` is less than or equal to 0: # # 1. Ideally, we would just set mtime = 0 if SOURCE_DATE_EPOCH is absent, but Ruby's # Zlib::GzipWriter does not properly handle the case of setting mtime = 0: # https://bugs.ruby-lang.org/issues/16285 # # This was fixed in https://github.com/ruby/zlib/pull/10. This workaround # won't be needed once we are using zlib gem version 1.1.0 or newer. # # 2. If mtime is less than 0, gzip may fail to cast a negative number to an unsigned int # https://github.com/Homebrew/homebrew-core/pull/246155#issuecomment-3345772366 if mtime.to_i <= 0 odebug "Setting `mtime = 1` to avoid zlib gem bug and unsigned integer cast when `mtime <= 0`." mtime = 1 end File.open(path, "rb") do |fp| odebug "Creating gzip file at #{output}" gz = Zlib::GzipWriter.open(output) gz.mtime = mtime gz.orig_name = orig_name gz.write(fp.read(GZIP_BUFFER_SIZE)) until fp.eof? ensure # GzipWriter should be closed in case of error as well gz.close end FileUtils.rm_f path Pathname.new(output) end |