Модуль: Utils::Gzip Приватный
- Расширяет:
- Output::Mixin
- Определён в:
- utils/gzip.rb
Обзор
Этот модуль является частью приватного API. Этот модуль можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого модуля, поскольку он может быть удалён или изменён без предупреждения.
Вспомогательные функции для создания файлов gzip.
Краткое описание констант свернуть
- GZIP_BUFFER_SIZE =
Эта константа является частью приватного API. Эту константу можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этой константы, поскольку она может быть удалена или изменена без предупреждения.
В gzip от Apple также используется zlib, поэтому здесь используется тот же размер буфера. https://github.com/apple-oss-distributions/file_cmds/blob/file_cmds-400/gzip/gzip.c#L147
T.let(64 * 1024, Integer)
Краткое описание методов класса свернуть
- .compress(*paths, reproducible: true, mtime: ENV["SOURCE_DATE_EPOCH"].to_i) ⇒ Array<Pathname>
Сжимает один или несколько файлов с помощью
gzip; по умолчанию — с воспроизводимым результатом. - .compress_with_options(path, mtime: ENV["SOURCE_DATE_EPOCH"].to_i, orig_name: File.basename(path), output: "#{path}.gz") ⇒ Pathname приватный
Методы, включённые из 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, pretty_warning
Подробное описание методов
.compress(*paths, reproducible: true, mtime: ENV["SOURCE_DATE_EPOCH"].to_i) ⇒ Array<Pathname>
Сжать один или несколько файлов с помощью gzip; по умолчанию сжимаются воспроизводимо.
В отличие от системного gzip, этот метод не записывает время изменения во время сборки, поэтому результат детерминирован (см. https://docs.brew.sh/Reproducible-Builds). Каждый файл сжимается на месте: результат помещается рядом с исходным файлом с суффиксом .gz, а пути к полученным файлам возвращаются.
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
Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.
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 |
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Utils/Gzip.html