Class: Resource

Inherits:
Object
  • Object
show all
Includes:
FileUtils
Defined in:
Library/Homebrew/resource.rb

Overview

Resource is the fundamental representation of an external resource. The primary formula download, along with other declared resources, are instances of this class.

Direct Known Subclasses

Go, PatchResource

Defined Under Namespace

Classes: Download, Go, Partial, PatchResource

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from FileUtils

#make, mkdir, mktemp, #old_mkdir, #old_ruby, #ruby, #scons, #xcodebuild

Constructor Details

#initialize(name = nil, &block) ⇒ Resource

Returns a new instance of Resource


41
42
43
44
45
46
47
48
49
50
51
# File 'Library/Homebrew/resource.rb', line 41

def initialize(name = nil, &block)
  @name = name
  @url = nil
  @version = nil
  @mirrors = []
  @specs = {}
  @checksum = nil
  @using = nil
  @patches = []
  instance_eval(&block) if block_given?
end

Instance Attribute Details

#checksumObject

Returns the value of attribute checksum


13
14
15
# File 'Library/Homebrew/resource.rb', line 13

def checksum
  @checksum
end

#download_strategyObject

Returns the value of attribute download_strategy


13
14
15
# File 'Library/Homebrew/resource.rb', line 13

def download_strategy
  @download_strategy
end

#mirrorsObject (readonly)

Returns the value of attribute mirrors


11
12
13
# File 'Library/Homebrew/resource.rb', line 11

def mirrors
  @mirrors
end

#nameObject

Formula name must be set after the DSL, as we have no access to the formula name before initialization of the formula


17
18
19
# File 'Library/Homebrew/resource.rb', line 17

def name
  @name
end

#ownerObject

Returns the value of attribute owner


11
12
13
# File 'Library/Homebrew/resource.rb', line 11

def owner
  @owner
end

#patchesObject (readonly)

Returns the value of attribute patches


11
12
13
# File 'Library/Homebrew/resource.rb', line 11

def patches
  @patches
end

#source_modified_timeObject (readonly)

Returns the value of attribute source_modified_time


11
12
13
# File 'Library/Homebrew/resource.rb', line 11

def source_modified_time
  @source_modified_time
end

#specsObject (readonly)

Returns the value of attribute specs


11
12
13
# File 'Library/Homebrew/resource.rb', line 11

def specs
  @specs
end

#usingObject (readonly)

Returns the value of attribute using


11
12
13
# File 'Library/Homebrew/resource.rb', line 11

def using
  @using
end

#version(val = nil) ⇒ Object


168
169
170
171
172
173
# File 'Library/Homebrew/resource.rb', line 168

def version(val = nil)
  @version ||= begin
    version = detect_version(val)
    version.null? ? nil : version
  end
end

Instance Method Details

#apply_patchesObject


103
104
105
106
107
# File 'Library/Homebrew/resource.rb', line 103

def apply_patches
  return if patches.empty?
  ohai "Patching #{name}"
  patches.each(&:apply)
end

#cached_downloadObject


73
74
75
# File 'Library/Homebrew/resource.rb', line 73

def cached_download
  downloader.cached_location
end

#clear_cacheObject


77
78
79
# File 'Library/Homebrew/resource.rb', line 77

def clear_cache
  downloader.clear_cache
end

#download_nameObject


69
70
71
# File 'Library/Homebrew/resource.rb', line 69

def download_name
  name.nil? ? owner.name : "#{owner.name}--#{escaped_name}"
end

#downloaderObject


58
59
60
# File 'Library/Homebrew/resource.rb', line 58

def downloader
  download_strategy.new(download_name, Download.new(self))
end

#escaped_nameObject

Removes /s from resource names; this allows go package names to be used as resource names without confusing software that interacts with download_name, e.g. github.com/foo/bar


65
66
67
# File 'Library/Homebrew/resource.rb', line 65

def escaped_name
  name.tr("/", "-")
end

#fetchObject


133
134
135
136
137
138
139
140
141
142
143
# File 'Library/Homebrew/resource.rb', line 133

def fetch
  HOMEBREW_CACHE.mkpath

  begin
    downloader.fetch
  rescue ErrorDuringExecution, CurlDownloadStrategyError => e
    raise DownloadError.new(self, e)
  end

  cached_download
end

#files(*files) ⇒ Object


129
130
131
# File 'Library/Homebrew/resource.rb', line 129

def files(*files)
  Partial.new(self, files)
end

#mirror(val) ⇒ Object


175
176
177
# File 'Library/Homebrew/resource.rb', line 175

def mirror(val)
  mirrors << val
end

#patch(strip = :p1, src = nil, &block) ⇒ Object


179
180
181
182
# File 'Library/Homebrew/resource.rb', line 179

def patch(strip = :p1, src = nil, &block)
  p = Patch.create(strip, src, &block)
  patches << p
end

#prepare_patchesObject


95
96
97
98
99
100
101
# File 'Library/Homebrew/resource.rb', line 95

def prepare_patches
  patches.grep(DATAPatch) { |p| p.path = owner.owner.path }

  patches.each do |patch|
    patch.verify_download_integrity(patch.fetch) if patch.external?
  end
end

#stage(target = nil, &block) ⇒ Object

Verifies download and unpacks it The block may call `|resource,staging| staging.retain!` to retain the staging directory. Subclasses that override stage should implement the tmp dir using FileUtils.mktemp so that works with all subtypes.


85
86
87
88
89
90
91
92
93
# File 'Library/Homebrew/resource.rb', line 85

def stage(target = nil, &block)
  unless target || block
    raise ArgumentError, "target directory or block is required"
  end

  verify_download_integrity(fetch)
  prepare_patches
  unpack(target, &block)
end

#unpack(target = nil) ⇒ Object

If a target is given, unpack there; else unpack to a temp folder. If block is given, yield to that block with |stage|, where stage is a ResourceStagingContext. A target or a block must be given, but not both.


113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'Library/Homebrew/resource.rb', line 113

def unpack(target = nil)
  mktemp(download_name) do |staging|
    downloader.stage
    @source_modified_time = downloader.source_modified_time
    apply_patches
    if block_given?
      yield ResourceStageContext.new(self, staging)
    elsif target
      target = Pathname.new(target) unless target.is_a? Pathname
      target.install Pathname.pwd.children
    end
  end
end

#url(val = nil, specs = {}) ⇒ Object


160
161
162
163
164
165
166
# File 'Library/Homebrew/resource.rb', line 160

def url(val = nil, specs = {})
  return @url if val.nil?
  @url = val
  @specs.merge!(specs)
  @using = @specs.delete(:using)
  @download_strategy = DownloadStrategyDetector.detect(url, using)
end

#verify_download_integrity(fn) ⇒ Object


145
146
147
148
149
150
151
152
153
154
# File 'Library/Homebrew/resource.rb', line 145

def verify_download_integrity(fn)
  if fn.file?
    ohai "Verifying #{fn.basename} checksum" if ARGV.verbose?
    fn.verify_checksum(checksum)
  end
rescue ChecksumMissingError
  opoo "Cannot verify integrity of #{fn.basename}"
  puts "A checksum was not provided for this resource"
  puts "For your reference the SHA256 is: #{fn.sha256}"
end