Spec-Zone.ru › Homebrew

Модуль: Utils::Bottles

Определён в:
utils/bottles.rb

Обзор

Этот модуль является частью внутреннего API. Этот модуль можно использовать только внутри репозиториев, принадлежащих Homebrew, за исключением casks и formulae. По возможности сторонним разработчикам следует избегать использования этого модуля, поскольку он может быть удалён или изменён без предупреждения.

Вспомогательные функции для bottles.

Определено в пространстве имён

Классы: Collector, Tag, TagSpecification

Краткое описание методов класса свернуть

  • .built_as?(formula) ⇒ Boolean закрытый
  • .extname_tag_rebuild(filename) ⇒ Array<String> закрытый
  • .file_from_bottle(bottle_file, file_path) ⇒ String закрытый
  • .file_outdated?(formula, file) ⇒ Boolean закрытый
  • .formula_contents(bottle_file, name: ) ⇒ String закрытый
  • .load_tab(formula) ⇒ Tab закрытый
  • .path_resolved_basename(root_url, name, checksum, filename) ⇒ Array<(String, [String, nil])>, ... закрытый
  • .receipt_path(bottle_file) ⇒ String? закрытый
  • .resolve_formula_names(bottle_file) ⇒ Array<(String, String)> закрытый
  • .resolve_version(bottle_file) ⇒ PkgVersion закрытый
  • .tag(tag = nil) ⇒ Tag внутренний

    Возвращает тег для запущенной ОС.

Подробное описание методов класса

.built_as?(formula) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)

Возвращает:

  • (Boolean)


31
32
33
34
35
36
# File 'utils/bottles.rb', line 31

def built_as?(formula)
  return false unless formula.latest_version_installed?

  tab = Keg.new(formula.latest_installed_prefix).tab
  !!tab.built_as_bottle
end

.extname_tag_rebuild(filename) ⇒ Array<String>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • filename (String)

Возвращает:

  • (Array<String>)


53
54
55
# File 'utils/bottles.rb', line 53

def extname_tag_rebuild(filename)
  HOMEBREW_BOTTLES_EXTNAME_REGEX.match(filename).to_a.map(&:to_s)
end

.file_from_bottle(bottle_file, file_path) ⇒ String

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • bottle_file (Pathname)
  • file_path (String)

Возвращает:

  • (String)


65
66
67
# File 'utils/bottles.rb', line 65

def file_from_bottle(bottle_file, file_path)
  Utils.popen_read("tar", "--extract", "--to-stdout", "--file", bottle_file, file_path)
end

.file_outdated?(formula, file) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)
  • file (Pathname)

Возвращает:

  • (Boolean)


39
40
41
42
43
44
45
46
47
48
49
50
# File 'utils/bottles.rb', line 39

def file_outdated?(formula, file)
  file = file.resolved_path

  filename = file.basename.to_s
  bottle = formula.bottle
  return false unless bottle

  _, bottle_tag, bottle_rebuild = extname_tag_rebuild(filename)
  return false if bottle_tag.blank?

  bottle_tag != bottle.tag.to_s || bottle_rebuild.to_i != bottle.rebuild
end

.formula_contents(bottle_file, name: ) ⇒ String

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • bottle_file (Pathname)
  • name (String) (по умолчанию: )

Возвращает:

  • (String)

Вызывает исключения:

  • (BottleFormulaUnavailableError)


97
98
99
100
101
102
103
104
# File 'utils/bottles.rb', line 97

def formula_contents(bottle_file, name: resolve_formula_names(bottle_file)[0])
  bottle_version = resolve_version bottle_file
  formula_path = "#{name}/#{bottle_version}/.brew/#{name}.rb"
  contents = file_from_bottle(bottle_file, formula_path)
  raise BottleFormulaUnavailableError.new(bottle_file, formula_path) unless $CHILD_STATUS.success?

  contents
end

.load_tab(formula) ⇒ Tab

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)

Возвращает:

  • (Tab)


120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'utils/bottles.rb', line 120

def load_tab(formula)
  keg = Keg.new(formula.prefix)
  tabfile = keg/AbstractTab::FILENAME
  bottle_json_path = formula.local_bottle_path&.sub(/\.(\d+\.)?tar\.gz$/, ".json")

  if bottle_json_path.nil? && (tab_attributes = formula.bottle_tab_attributes.presence)
    tab = Tab.from_file_content(tab_attributes.to_json, tabfile)
    return tab if tab.built_on&.[]("os") == HOMEBREW_SYSTEM
  elsif !tabfile.exist? && bottle_json_path&.exist?
    _, tag, = Utils::Bottles.extname_tag_rebuild(formula.local_bottle_path.to_s)
    bottle_hash = JSON.parse(File.read(bottle_json_path))
    tab_json = bottle_hash[formula.full_name]["bottle"]["tags"][tag]["tab"].to_json
    return Tab.from_file_content(tab_json, tabfile)
  else
    tab = keg.tab
  end

  tab.runtime_dependencies = begin
    f_runtime_deps = formula.runtime_dependencies(read_from_tab: false)
    Tab.runtime_deps_hash(formula, f_runtime_deps)
  end

  tab
end

.path_resolved_basename(root_url, name, checksum, filename) ⇒ Array<(String, [String, nil])>, ...

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • root_url (String)
  • name (String)
  • checksum (Checksum, String)
  • filename (Bottle::Filename, nil)

Возвращает:

  • (Array<(String, [String, nil])>, String, nil)


110
111
112
113
114
115
116
117
# File 'utils/bottles.rb', line 110

def path_resolved_basename(root_url, name, checksum, filename)
  if root_url.match?(GitHubPackages::URL_REGEX)
    image_name = GitHubPackages.image_formula_name(name)
    ["#{image_name}/blobs/sha256:#{checksum}", filename&.github_packages]
  else
    filename&.url_encode
  end
end

.receipt_path(bottle_file) ⇒ String?

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • bottle_file (Pathname)

Возвращает:

  • (String, nil)


58
59
60
61
62
# File 'utils/bottles.rb', line 58

def receipt_path(bottle_file)
  bottle_file_list(bottle_file).find do |line|
    %r{.+/.+/INSTALL_RECEIPT.json}.match?(line)
  end
end

.resolve_formula_names(bottle_file) ⇒ Array<(String, String)>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • bottle_file (Pathname)

Возвращает:

  • (Array<(String, String)>)


70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'utils/bottles.rb', line 70

def resolve_formula_names(bottle_file)
  name = bottle_file_list(bottle_file).first.to_s.split("/").fetch(0)
  full_name = if (receipt_file_path = receipt_path(bottle_file))
    receipt_file = file_from_bottle(bottle_file, receipt_file_path)
    tap = Tab.from_file_content(receipt_file, "#{bottle_file}/#{receipt_file_path}").tap
    "#{tap}/#{name}" if tap.present? && !tap.core_tap?
  else
    bottle_json_path = Pathname(bottle_file.sub(/\.(\d+\.)?tar\.gz$/, ".json"))
    if bottle_json_path.exist? &&
       (bottle_json_path_contents = bottle_json_path.read.presence) &&
       (bottle_json = JSON.parse(bottle_json_path_contents).presence) &&
       bottle_json.is_a?(Hash)
      bottle_json.keys.first.presence
    end
  end
  full_name ||= name

  [name, full_name]
end

.resolve_version(bottle_file) ⇒ PkgVersion

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • bottle_file (Pathname)

Возвращает:

  • (PkgVersion)


91
92
93
94
# File 'utils/bottles.rb', line 91

def resolve_version(bottle_file)
  version = bottle_file_list(bottle_file).first.to_s.split("/").fetch(1)
  PkgVersion.parse(version)
end

.tag(tag = nil) ⇒ Tag

Этот метод является частью внутреннего API. Этот метод можно использовать только внутри репозиториев, принадлежащих Homebrew, за исключением casks и формул. По возможности сторонним разработчикам не следует использовать этот метод, поскольку он может быть удалён или изменён без предупреждения.

Возвращает тег для запущенной операционной системы.

Параметры:

  • tag (Symbol, Tag, nil) (по умолчанию: nil)

Возвращает:

  • (Tag)


16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'utils/bottles.rb', line 16

def tag(tag = nil)
  case tag
  when Symbol
    Tag.from_symbol(tag)
  when Tag
    tag
  else
    @tag ||= T.let(Tag.new(
                     system: HOMEBREW_SYSTEM.downcase.to_sym,
                     arch:   HOMEBREW_PROCESSOR.downcase.to_sym,
                   ), T.nilable(Tag))
  end
end

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Utils/Bottles.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API