Class: Tab
- Inherits:
-
OpenStruct
- Object
- OpenStruct
- Tab
- Extended by:
- Cachable
- Defined in:
- Library/Homebrew/tab.rb
Overview
Inherit from OpenStruct to gain a generic initialization method that takes a
hash and creates an attribute for each key and value. Rather than calling
new
directly, use one of the class methods like Tab.create.
Constant Summary collapse
- FILENAME =
"INSTALL_RECEIPT.json"
Class Method Summary collapse
-
.create(formula, compiler, stdlib) ⇒ Object
Instantiates a Tab for a new installation of a formula.
- .empty ⇒ Object
-
.for_formula(f) ⇒ Object
Returns a Tab for an already installed formula, or a fake one if the formula is not installed.
- .for_keg(keg) ⇒ Object
-
.for_name(name) ⇒ Object
Returns a Tab for the named formula's installation, or a fake one if the formula is not installed.
-
.from_file(path) ⇒ Object
Returns the Tab for an install receipt at
path
. -
.from_file_content(content, path) ⇒ Object
Like Tab.from_file, but bypass the cache.
- .remap_deprecated_options(deprecated_options, options) ⇒ Object
- .runtime_deps_hash(deps) ⇒ Object
Instance Method Summary collapse
- #any_args_or_options? ⇒ Boolean
- #bottle? ⇒ Boolean
- #built_bottle? ⇒ Boolean
- #compiler ⇒ Object
- #cxx11? ⇒ Boolean
- #cxxstdlib ⇒ Object
- #devel? ⇒ Boolean
- #devel_version ⇒ Object
- #head? ⇒ Boolean
- #head_version ⇒ Object
- #include?(opt) ⇒ Boolean
- #parsed_homebrew_version ⇒ Object
- #runtime_dependencies ⇒ Object
- #source_modified_time ⇒ Object
- #spec ⇒ Object
- #stable? ⇒ Boolean
- #stable_version ⇒ Object
- #tap ⇒ Object
- #tap=(tap) ⇒ Object
- #to_json(options = nil) ⇒ Object
- #to_s ⇒ Object
- #universal? ⇒ Boolean
- #unused_options ⇒ Object
- #used_options ⇒ Object
- #version_scheme ⇒ Object
- #versions ⇒ Object
- #with?(val) ⇒ Boolean
- #without?(val) ⇒ Boolean
- #write ⇒ Object
Methods included from Cachable
Class Method Details
.create(formula, compiler, stdlib) ⇒ Object
Instantiates a Tab for a new installation of a formula.
20 21 22 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 'Library/Homebrew/tab.rb', line 20 def self.create(formula, compiler, stdlib) build = formula.build runtime_deps = formula.runtime_dependencies(undeclared: false) attributes = { "homebrew_version" => HOMEBREW_VERSION, "used_options" => build..as_flags, "unused_options" => build..as_flags, "tabfile" => formula.prefix/FILENAME, "built_as_bottle" => build.bottle?, "installed_as_dependency" => false, "installed_on_request" => true, "poured_from_bottle" => false, "time" => Time.now.to_i, "source_modified_time" => formula.source_modified_time.to_i, "HEAD" => HOMEBREW_REPOSITORY.git_head, "compiler" => compiler, "stdlib" => stdlib, "aliases" => formula.aliases, "runtime_dependencies" => Tab.runtime_deps_hash(runtime_deps), "arch" => Hardware::CPU.arch, "source" => { "path" => formula.specified_path.to_s, "tap" => formula.tap&.name, "spec" => formula.active_spec_sym.to_s, "versions" => { "stable" => formula.stable&.version.to_s, "head" => formula.head&.version.to_s, "version_scheme" => formula.version_scheme, }, }, "built_on" => DevelopmentTools.build_system_info, } new(attributes) end |
.empty ⇒ Object
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'Library/Homebrew/tab.rb', line 173 def self.empty attributes = { "homebrew_version" => HOMEBREW_VERSION, "used_options" => [], "unused_options" => [], "built_as_bottle" => false, "installed_as_dependency" => false, "installed_on_request" => true, "poured_from_bottle" => false, "time" => nil, "source_modified_time" => 0, "HEAD" => nil, "stdlib" => nil, "compiler" => DevelopmentTools.default_compiler, "aliases" => [], "runtime_dependencies" => nil, "source" => { "path" => nil, "tap" => nil, "spec" => "stable", "versions" => { "stable" => nil, "head" => nil, "version_scheme" => 0, }, }, "built_on" => DevelopmentTools.generic_build_system_info, } new(attributes) end |
.for_formula(f) ⇒ Object
Returns a Tab for an already installed formula, or a fake one if the formula is not installed.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'Library/Homebrew/tab.rb', line 135 def self.for_formula(f) paths = [] paths << f.opt_prefix.resolved_path if f.opt_prefix.symlink? && f.opt_prefix.directory? paths << f.linked_keg.resolved_path if f.linked_keg.symlink? && f.linked_keg.directory? if (dirs = f.installed_prefixes).length == 1 paths << dirs.first end paths << f.latest_installed_prefix path = paths.map { |pn| pn/FILENAME }.find(&:file?) if path tab = from_file(path) = (f., tab.) tab. = .as_flags else # Formula is not installed. Return a fake tab. tab = empty tab. = f..as_flags tab.source = { "path" => f.specified_path.to_s, "tap" => f.tap&.name, "spec" => f.active_spec_sym.to_s, "versions" => { "stable" => f.stable&.version.to_s, "head" => f.head&.version.to_s, "version_scheme" => f.version_scheme, }, } end tab end |
.for_keg(keg) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'Library/Homebrew/tab.rb', line 103 def self.for_keg(keg) path = keg/FILENAME tab = if path.exist? from_file(path) else empty end tab["tabfile"] = path tab end |
.for_name(name) ⇒ Object
Returns a Tab for the named formula's installation, or a fake one if the formula is not installed.
118 119 120 |
# File 'Library/Homebrew/tab.rb', line 118 def self.for_name(name) for_formula(Formulary.factory(name)) end |
.from_file(path) ⇒ Object
Returns the Tab for an install receipt at path
.
Results are cached.
58 59 60 |
# File 'Library/Homebrew/tab.rb', line 58 def self.from_file(path) cache.fetch(path) { |p| cache[p] = from_file_content(File.read(p), p) } end |
.from_file_content(content, path) ⇒ Object
Like from_file, but bypass the cache.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'Library/Homebrew/tab.rb', line 63 def self.from_file_content(content, path) attributes = begin JSON.parse(content) rescue JSON::ParserError => e raise e, "Cannot parse #{path}: #{e}", e.backtrace end attributes["tabfile"] = path attributes["source_modified_time"] ||= 0 attributes["source"] ||= {} tapped_from = attributes["tapped_from"] if !tapped_from.nil? && tapped_from != "path or URL" attributes["source"]["tap"] = attributes.delete("tapped_from") end if attributes["source"]["tap"] == "mxcl/master" || attributes["source"]["tap"] == "Homebrew/homebrew" attributes["source"]["tap"] = "homebrew/core" end if attributes["source"]["spec"].nil? version = PkgVersion.parse path.to_s.split("/").second_to_last attributes["source"]["spec"] = if version.head? "head" else "stable" end end if attributes["source"]["versions"].nil? attributes["source"]["versions"] = { "stable" => nil, "head" => nil, "version_scheme" => 0, } end new(attributes) end |
.remap_deprecated_options(deprecated_options, options) ⇒ Object
122 123 124 125 126 127 128 129 130 131 |
# File 'Library/Homebrew/tab.rb', line 122 def self.(, ) .each do |deprecated_option| option = .find { |o| o.name == deprecated_option.old } next unless option -= [option] << Option.new(deprecated_option.current, option.description) end end |
.runtime_deps_hash(deps) ⇒ Object
205 206 207 208 209 210 |
# File 'Library/Homebrew/tab.rb', line 205 def self.runtime_deps_hash(deps) deps.map do |dep| f = dep.to_formula { "full_name" => f.full_name, "version" => f.version.to_s } end end |
Instance Method Details
#any_args_or_options? ⇒ Boolean
212 213 214 |
# File 'Library/Homebrew/tab.rb', line 212 def !.empty? || !.empty? end |
#bottle? ⇒ Boolean
288 289 290 |
# File 'Library/Homebrew/tab.rb', line 288 def bottle? built_as_bottle end |
#built_bottle? ⇒ Boolean
284 285 286 |
# File 'Library/Homebrew/tab.rb', line 284 def built_bottle? built_as_bottle && !poured_from_bottle end |
#compiler ⇒ Object
262 263 264 |
# File 'Library/Homebrew/tab.rb', line 262 def compiler super || DevelopmentTools.default_compiler end |
#cxx11? ⇒ Boolean
237 238 239 240 |
# File 'Library/Homebrew/tab.rb', line 237 def cxx11? odeprecated "Tab#cxx11?" include?("c++11") end |
#cxxstdlib ⇒ Object
278 279 280 281 282 |
# File 'Library/Homebrew/tab.rb', line 278 def cxxstdlib # Older tabs won't have these values, so provide sensible defaults lib = stdlib.to_sym if stdlib CxxStdlib.create(lib, compiler.to_sym) end |
#devel? ⇒ Boolean
246 247 248 |
# File 'Library/Homebrew/tab.rb', line 246 def devel? odisabled "Tab#devel?" end |
#devel_version ⇒ Object
314 315 316 |
# File 'Library/Homebrew/tab.rb', line 314 def devel_version odisabled "Tab#devel_version" end |
#head? ⇒ Boolean
242 243 244 |
# File 'Library/Homebrew/tab.rb', line 242 def head? spec == :head end |
#head_version ⇒ Object
318 319 320 |
# File 'Library/Homebrew/tab.rb', line 318 def head_version Version.create(versions["head"]) if versions["head"] end |
#include?(opt) ⇒ Boolean
228 229 230 |
# File 'Library/Homebrew/tab.rb', line 228 def include?(opt) .include? opt end |
#parsed_homebrew_version ⇒ Object
266 267 268 269 270 |
# File 'Library/Homebrew/tab.rb', line 266 def parsed_homebrew_version return Version::NULL if homebrew_version.nil? Version.new(homebrew_version) end |
#runtime_dependencies ⇒ Object
272 273 274 275 276 |
# File 'Library/Homebrew/tab.rb', line 272 def runtime_dependencies # Homebrew versions prior to 1.1.6 generated incorrect runtime dependency # lists. super unless parsed_homebrew_version < "1.1.6" end |
#source_modified_time ⇒ Object
326 327 328 |
# File 'Library/Homebrew/tab.rb', line 326 def source_modified_time Time.at(super || 0) end |
#spec ⇒ Object
302 303 304 |
# File 'Library/Homebrew/tab.rb', line 302 def spec source["spec"].to_sym end |
#stable? ⇒ Boolean
250 251 252 |
# File 'Library/Homebrew/tab.rb', line 250 def stable? spec == :stable end |
#stable_version ⇒ Object
310 311 312 |
# File 'Library/Homebrew/tab.rb', line 310 def stable_version Version.create(versions["stable"]) if versions["stable"] end |
#tap ⇒ Object
292 293 294 295 |
# File 'Library/Homebrew/tab.rb', line 292 def tap tap_name = source["tap"] Tap.fetch(tap_name) if tap_name end |
#tap=(tap) ⇒ Object
297 298 299 300 |
# File 'Library/Homebrew/tab.rb', line 297 def tap=(tap) tap_name = tap.respond_to?(:name) ? tap.name : tap source["tap"] = tap_name end |
#to_json(options = nil) ⇒ Object
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'Library/Homebrew/tab.rb', line 330 def to_json( = nil) attributes = { "homebrew_version" => homebrew_version, "used_options" => .as_flags, "unused_options" => .as_flags, "built_as_bottle" => built_as_bottle, "poured_from_bottle" => poured_from_bottle, "installed_as_dependency" => installed_as_dependency, "installed_on_request" => installed_on_request, "changed_files" => changed_files&.map(&:to_s), "time" => time, "source_modified_time" => source_modified_time.to_i, "HEAD" => self.HEAD, "stdlib" => stdlib&.to_s, "compiler" => compiler&.to_s, "aliases" => aliases, "runtime_dependencies" => runtime_dependencies, "source" => source, "built_on" => built_on, } JSON.generate(attributes, ) end |
#to_s ⇒ Object
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 |
# File 'Library/Homebrew/tab.rb', line 363 def to_s s = [] s << if poured_from_bottle "Poured from bottle" else "Built from source" end s << Time.at(time).strftime("on %Y-%m-%d at %H:%M:%S") if time unless .empty? s << "with:" s << .to_a.join(" ") end s.join(" ") end |
#universal? ⇒ Boolean
232 233 234 235 |
# File 'Library/Homebrew/tab.rb', line 232 def universal? odeprecated "Tab#universal?" include?("universal") end |
#unused_options ⇒ Object
258 259 260 |
# File 'Library/Homebrew/tab.rb', line 258 def Options.create(super) end |
#used_options ⇒ Object
254 255 256 |
# File 'Library/Homebrew/tab.rb', line 254 def Options.create(super) end |
#version_scheme ⇒ Object
322 323 324 |
# File 'Library/Homebrew/tab.rb', line 322 def version_scheme versions["version_scheme"] || 0 end |
#versions ⇒ Object
306 307 308 |
# File 'Library/Homebrew/tab.rb', line 306 def versions source["versions"] end |
#with?(val) ⇒ Boolean
216 217 218 219 220 221 222 |
# File 'Library/Homebrew/tab.rb', line 216 def with?(val) option_names = val.respond_to?(:option_names) ? val.option_names : [val] option_names.any? do |name| include?("with-#{name}") || .include?("without-#{name}") end end |
#without?(val) ⇒ Boolean
224 225 226 |
# File 'Library/Homebrew/tab.rb', line 224 def without?(val) !with?(val) end |
#write ⇒ Object
354 355 356 357 358 359 360 361 |
# File 'Library/Homebrew/tab.rb', line 354 def write # If this is a new installation, the cache of installed formulae # will no longer be valid. Formula.clear_cache unless tabfile.exist? self.class.cache[tabfile] = self tabfile.atomic_write(to_json) end |