vanagon 0.11.3 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/bin/build +1 -1
- data/bin/build_host_info +2 -2
- data/bin/devkit +1 -1
- data/bin/inspect +2 -2
- data/bin/render +1 -1
- data/lib/vanagon/component.rb +69 -10
- data/lib/vanagon/component/dsl.rb +13 -4
- data/lib/vanagon/component/source.rb +5 -64
- data/lib/vanagon/component/source/git.rb +6 -6
- data/lib/vanagon/component/source/http.rb +2 -2
- data/lib/vanagon/component/source/local.rb +1 -2
- data/lib/vanagon/component/source/rewrite.rb +85 -0
- data/lib/vanagon/driver.rb +9 -9
- data/lib/vanagon/engine/ec2.rb +4 -4
- data/lib/vanagon/engine/hardware.rb +3 -3
- data/lib/vanagon/engine/pooler.rb +3 -3
- data/lib/vanagon/optparse.rb +1 -1
- data/lib/vanagon/platform.rb +18 -5
- data/lib/vanagon/platform/deb.rb +6 -1
- data/lib/vanagon/platform/dsl.rb +4 -0
- data/lib/vanagon/platform/rpm.rb +19 -3
- data/lib/vanagon/project.rb +8 -5
- data/lib/vanagon/project/dsl.rb +11 -2
- data/lib/vanagon/utilities.rb +3 -3
- data/spec/lib/vanagon/component/source/rewrite_spec.rb +55 -0
- data/spec/lib/vanagon/component/source_spec.rb +0 -72
- data/spec/lib/vanagon/component_spec.rb +53 -3
- data/spec/lib/vanagon/platform/rpm_spec.rb +6 -0
- data/spec/lib/vanagon/platform_spec.rb +62 -25
- data/spec/lib/vanagon/project/dsl_spec.rb +22 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db5e799055a41530a8526f5b169598bd3d158f01
|
4
|
+
data.tar.gz: 541a9c6a444f670d0101b191cb6511108429d782
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6782736f6b1733dab4b193dc3f1364591c41c5d5681e415f6f9b32d9fc6553ab59b18bce081ec90e7e960e2f65e50d0c7a2c3cd18bc9fd88907ad63fd1b09bd7
|
7
|
+
data.tar.gz: 622a7d7b4b5060eb1ccfc5ba0b5e4d9b5128e5a34b665868a090d312280d79bb546ba243a091efbeba3a4599abb6300275750f4c8807a49e6e0ce7e0d294797e
|
data/README.md
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
<!-- MarkdownTOC -->
|
5
5
|
|
6
6
|
- [What is Vanagon?](#what-is-vanagon)
|
7
|
+
- [How is it pronounced?](#how-is-it-pronounced)
|
7
8
|
- [Runtime Requirements](#runtime-requirements)
|
8
9
|
- [Local Host:](#local-host)
|
9
10
|
- [Remote Build Target:](#remote-build-target)
|
@@ -39,6 +40,10 @@ creates a master makefile for the project, and configures, builds, and installs
|
|
39
40
|
all components. The result is an environment where you can work on individual
|
40
41
|
components, then rebuild the project and test the installed artifacts.
|
41
42
|
|
43
|
+
### How is it pronounced?
|
44
|
+
|
45
|
+
Vanagon (/ˈvænəgɪn/) sounds like "van again." It does not sound like "van wagon" or "van and gone."
|
46
|
+
|
42
47
|
## Runtime Requirements
|
43
48
|
|
44
49
|
Vanagon carries two sets of requirements: requirements for the local host where Vanagon is run, and for the remote target where compilation and packaging happens.
|
data/bin/build
CHANGED
data/bin/build_host_info
CHANGED
@@ -11,11 +11,11 @@ platforms = ARGV[1]
|
|
11
11
|
|
12
12
|
if project.nil? or platforms.nil?
|
13
13
|
warn "project and platform are both required arguments."
|
14
|
-
puts optparse
|
14
|
+
$stderr.puts optparse
|
15
15
|
exit 1
|
16
16
|
end
|
17
17
|
|
18
18
|
platforms.split(',').each do |platform|
|
19
19
|
driver = Vanagon::Driver.new(platform, project, options)
|
20
|
-
puts JSON.generate(driver.build_host_info)
|
20
|
+
$stdout.puts JSON.generate(driver.build_host_info)
|
21
21
|
end
|
data/bin/devkit
CHANGED
data/bin/inspect
CHANGED
@@ -14,12 +14,12 @@ platforms = ARGV[1]
|
|
14
14
|
|
15
15
|
unless project or platforms
|
16
16
|
warn "project and platform are both required arguments."
|
17
|
-
puts optparse
|
17
|
+
$stderr.puts optparse
|
18
18
|
exit 1
|
19
19
|
end
|
20
20
|
|
21
21
|
platforms.split(',').each do |platform|
|
22
22
|
driver = Vanagon::Driver.new(platform, project, options)
|
23
23
|
components = driver.project.components.map(&:to_hash)
|
24
|
-
puts JSON.pretty_generate(components)
|
24
|
+
$stdout.puts JSON.pretty_generate(components)
|
25
25
|
end
|
data/bin/render
CHANGED
data/lib/vanagon/component.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require 'vanagon/component/source'
|
2
1
|
require 'vanagon/component/dsl'
|
3
2
|
require 'vanagon/component/rules'
|
3
|
+
require 'vanagon/component/source'
|
4
|
+
require 'vanagon/component/source/rewrite'
|
4
5
|
|
5
6
|
class Vanagon
|
6
7
|
class Component
|
@@ -18,6 +19,7 @@ class Vanagon
|
|
18
19
|
attr_accessor :sources
|
19
20
|
attr_accessor :patches
|
20
21
|
attr_accessor :url
|
22
|
+
attr_accessor :mirrors
|
21
23
|
attr_accessor :license
|
22
24
|
|
23
25
|
# holds an OpenStruct describing all of the particular details about
|
@@ -114,14 +116,13 @@ class Vanagon
|
|
114
116
|
# @raise if the instance_eval on Component fails, the exception is reraised
|
115
117
|
def self.load_component(name, configdir, settings, platform)
|
116
118
|
compfile = File.join(configdir, "#{name}.rb")
|
117
|
-
code = File.read(compfile)
|
118
119
|
dsl = Vanagon::Component::DSL.new(name, settings, platform)
|
119
|
-
dsl.instance_eval(
|
120
|
+
dsl.instance_eval(File.read(compfile), compfile, 1)
|
120
121
|
dsl._component
|
121
122
|
rescue => e
|
122
|
-
puts "Error loading project '#{name}' using '#{compfile}':"
|
123
|
-
puts e
|
124
|
-
puts e.backtrace.join("\n")
|
123
|
+
$stderr.puts "Error loading project '#{name}' using '#{compfile}':"
|
124
|
+
$stderr.puts e
|
125
|
+
$stderr.puts e.backtrace.join("\n")
|
125
126
|
raise e
|
126
127
|
end
|
127
128
|
|
@@ -190,16 +191,74 @@ class Vanagon
|
|
190
191
|
@files.select(&:configfile?)
|
191
192
|
end
|
192
193
|
|
194
|
+
# @return [Set] a list of unique mirror URIs that should be used to
|
195
|
+
# retrieve the upstream source before attempting to retrieve from
|
196
|
+
# whatever URI was defined for #uri.
|
197
|
+
def mirrors
|
198
|
+
@mirrors ||= Set.new [deprecated_rewrite_url].compact
|
199
|
+
end
|
200
|
+
|
201
|
+
# Retrieve upstream source file from a mirror, by randomly iterating
|
202
|
+
# through #mirrors until there's no more mirrors left. Will #warn
|
203
|
+
# if the mirror's URI cannot be resolved or if the URI cannot
|
204
|
+
# be retrieved. Does not suppress any errors from
|
205
|
+
# Vanagon::Component::Source.
|
206
|
+
#
|
207
|
+
# @return [Boolean] return True if the source can be retrieved,
|
208
|
+
# or False otherwise. This is because because each subclass of
|
209
|
+
# Vanagon::Component::Source returns an inconsistent value
|
210
|
+
# if #fetch is successful.
|
211
|
+
def fetch_mirrors(options)
|
212
|
+
mirrors.to_a.shuffle.each do |mirror|
|
213
|
+
begin
|
214
|
+
$stderr.puts %(Attempting to fetch from mirror URL "#{mirror}")
|
215
|
+
@source = Vanagon::Component::Source.source(mirror, options)
|
216
|
+
return true if source.fetch
|
217
|
+
rescue SocketError
|
218
|
+
# SocketError means that there was no DNS/name resolution
|
219
|
+
# for whatever remote protocol the mirror tried to use.
|
220
|
+
warn %(Unable to resolve mirror URL "#{mirror}")
|
221
|
+
rescue RuntimeError
|
222
|
+
# Source retrieval does not consistently return a meaningful
|
223
|
+
# namespaced error message, which means we're brute-force rescuing
|
224
|
+
# RuntimeError. Not a good look, and we should fix this.
|
225
|
+
warn %(Unable to retrieve mirror URL "#{mirror}")
|
226
|
+
end
|
227
|
+
end
|
228
|
+
false
|
229
|
+
end
|
230
|
+
|
231
|
+
# Retrieve upstream source file from the canonical URL.
|
232
|
+
# Does not suppress any errors from Vanagon::Component::Source.
|
233
|
+
#
|
234
|
+
# @return [Boolean] return True if the source can be retrieved,
|
235
|
+
# or False otherwise
|
236
|
+
def fetch_url(options)
|
237
|
+
$stderr.puts %(Attempting to fetch from canonical URL "#{url}")
|
238
|
+
@source = Vanagon::Component::Source.source(url, options)
|
239
|
+
# Explicitly coerce the return value of #source.fetch,
|
240
|
+
# because each subclass of Vanagon::Component::Source returns
|
241
|
+
# an inconsistent value if #fetch is successful.
|
242
|
+
!!source.fetch
|
243
|
+
end
|
244
|
+
|
245
|
+
# This method is deprecated and private. It will return
|
246
|
+
# a rewritten URL if there's any value for #url.
|
247
|
+
def deprecated_rewrite_url
|
248
|
+
return nil unless url
|
249
|
+
Vanagon::Component::Source::Rewrite.parse_and_rewrite(url)
|
250
|
+
end
|
251
|
+
private :deprecated_rewrite_url
|
252
|
+
|
193
253
|
# Fetches the primary source for the component. As a side effect, also sets
|
194
254
|
# @extract_with, @dirname and @version for the component for use in the
|
195
255
|
# makefile template
|
196
256
|
#
|
197
257
|
# @param workdir [String] working directory to put the source into
|
198
|
-
def get_source(workdir) # rubocop:disable Metrics/AbcSize
|
258
|
+
def get_source(workdir) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
|
199
259
|
opts = options.merge({ workdir: workdir })
|
200
|
-
if url
|
201
|
-
|
202
|
-
source.fetch
|
260
|
+
if url || !mirrors.empty?
|
261
|
+
fetch_mirrors(opts) || fetch_url(opts)
|
203
262
|
source.verify
|
204
263
|
extract_with << source.extract(platform.tar) if source.respond_to? :extract
|
205
264
|
|
@@ -276,11 +276,20 @@ class Vanagon
|
|
276
276
|
@component.version = ver
|
277
277
|
end
|
278
278
|
|
279
|
-
# Sets the
|
279
|
+
# Sets the canonical URL or URI for the upstream source of this component
|
280
280
|
#
|
281
|
-
# @param
|
282
|
-
|
283
|
-
|
281
|
+
# @param uri [String, URI] a URL or URI describing a canonical location
|
282
|
+
# for a component's source code or artifact
|
283
|
+
def url(uri)
|
284
|
+
@component.url = uri.to_s
|
285
|
+
end
|
286
|
+
|
287
|
+
# Sets a mirror url for the source of this component
|
288
|
+
#
|
289
|
+
# @param url [String] a mirror url to use as the source for this component.
|
290
|
+
# Can be called more than once to add multiple mirror URLs.
|
291
|
+
def mirror(url)
|
292
|
+
@component.mirrors << url
|
284
293
|
end
|
285
294
|
|
286
295
|
def sum(value)
|
@@ -7,85 +7,26 @@ class Vanagon
|
|
7
7
|
class Component
|
8
8
|
class Source
|
9
9
|
SUPPORTED_PROTOCOLS = %w[file http https git].freeze
|
10
|
-
@rewrite_rules = {}
|
11
10
|
|
12
11
|
class << self
|
13
|
-
attr_reader :rewrite_rules
|
14
|
-
|
15
|
-
def register_rewrite_rule(protocol, rule)
|
16
|
-
if rule.is_a?(String) || rule.is_a?(Proc)
|
17
|
-
if SUPPORTED_PROTOCOLS.include?(protocol)
|
18
|
-
@rewrite_rules[protocol] = rule
|
19
|
-
else
|
20
|
-
raise Vanagon::Error, "#{protocol} is not a supported protocol for rewriting"
|
21
|
-
end
|
22
|
-
else
|
23
|
-
raise Vanagon::Error, "String or Proc is required as a rewrite_rule."
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def rewrite(url, protocol)
|
28
|
-
# Vanagon did not originally distinguish between http and https
|
29
|
-
# when looking up rewrite rules; this is no longer true, but it
|
30
|
-
# means that we should try to preserve old, dumb behavior until
|
31
|
-
# the rewrite engine is removed.
|
32
|
-
return rewrite(url, "http") if protocol == "https"
|
33
|
-
|
34
|
-
rule = @rewrite_rules[protocol]
|
35
|
-
if rule
|
36
|
-
if rule.is_a?(Proc)
|
37
|
-
return proc_rewrite(rule, url)
|
38
|
-
elsif rule.is_a?(String)
|
39
|
-
return string_rewrite(rule, url)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
return url
|
44
|
-
end
|
45
|
-
|
46
|
-
def proc_rewrite(rule, url)
|
47
|
-
if rule.arity == 1
|
48
|
-
rule.call(url)
|
49
|
-
else
|
50
|
-
raise Vanagon::Error, "Unable to use provided rewrite rule. Expected Proc with one argument, Proc has #{rule.arity} arguments"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def string_rewrite(rule, original_url)
|
55
|
-
url = original_url.to_s
|
56
|
-
target_match = url.match(/.*\/([^\/]*)$/)
|
57
|
-
if target_match
|
58
|
-
target = target_match[1]
|
59
|
-
return File.join(rule, target)
|
60
|
-
else
|
61
|
-
raise Vanagon::Error, "Unable to apply url rewrite to '#{url}', expected to find at least one '/' in the url."
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def parse_and_rewrite(uri)
|
66
|
-
url = URI.parse(uri)
|
67
|
-
return url unless url.scheme
|
68
|
-
rewrite(url.to_s, url.scheme)
|
69
|
-
end
|
70
|
-
|
71
12
|
# Basic factory to hand back the correct {Vanagon::Component::Source} subtype to the component
|
72
13
|
#
|
73
14
|
# @param url [String] URI of the source file (includes git@... style links)
|
74
15
|
# @param options [Hash] hash of the options needed for the subtype
|
75
16
|
# @param workdir [String] working directory to fetch the source into
|
76
17
|
# @return [Vanagon::Component::Source] the correct subtype for the given source
|
77
|
-
def source(uri, **options)
|
18
|
+
def source(uri, **options)
|
78
19
|
# First we try git
|
79
|
-
if Vanagon::Component::Source::Git.valid_remote?(
|
80
|
-
return Vanagon::Component::Source::Git.new
|
20
|
+
if Vanagon::Component::Source::Git.valid_remote?(uri)
|
21
|
+
return Vanagon::Component::Source::Git.new uri,
|
81
22
|
sum: options[:sum],
|
82
23
|
ref: options[:ref],
|
83
24
|
workdir: options[:workdir]
|
84
25
|
end
|
85
26
|
|
86
27
|
# Then we try HTTP
|
87
|
-
if Vanagon::Component::Source::Http.valid_url?(
|
88
|
-
return Vanagon::Component::Source::Http.new
|
28
|
+
if Vanagon::Component::Source::Http.valid_url?(uri)
|
29
|
+
return Vanagon::Component::Source::Http.new uri,
|
89
30
|
sum: options[:sum],
|
90
31
|
workdir: options[:workdir],
|
91
32
|
# Default sum_type is md5 if unspecified:
|
@@ -71,7 +71,7 @@ class Vanagon
|
|
71
71
|
# There is no md5 to manually verify here, so this is a noop.
|
72
72
|
def verify
|
73
73
|
# nothing to do here, so just tell users that and return
|
74
|
-
puts "Nothing to verify for '#{dirname}' (using Git reference '#{ref}')"
|
74
|
+
$stderr.puts "Nothing to verify for '#{dirname}' (using Git reference '#{ref}')"
|
75
75
|
end
|
76
76
|
|
77
77
|
# The dirname to reference when building from the repo
|
@@ -117,9 +117,9 @@ class Vanagon
|
|
117
117
|
# Clone a remote repo, make noise about it, and fail entirely
|
118
118
|
# if we're unable to retrieve the remote repo
|
119
119
|
def clone!
|
120
|
-
puts "Cloning Git repo '#{url}'"
|
121
|
-
puts "Successfully cloned '#{dirname}'" if clone
|
122
|
-
rescue Git::GitExecuteError
|
120
|
+
$stderr.puts "Cloning Git repo '#{url}'"
|
121
|
+
$stderr.puts "Successfully cloned '#{dirname}'" if clone
|
122
|
+
rescue ::Git::GitExecuteError
|
123
123
|
raise Vanagon::InvalidRepo, "Unable to clone from '#{url}'"
|
124
124
|
end
|
125
125
|
private :clone!
|
@@ -127,7 +127,7 @@ class Vanagon
|
|
127
127
|
# Checkout desired ref/sha, make noise about it, and fail
|
128
128
|
# entirely if we're unable to checkout that given ref/sha
|
129
129
|
def checkout!
|
130
|
-
puts "Checking out '#{ref}'' from Git repo '#{dirname}'"
|
130
|
+
$stderr.puts "Checking out '#{ref}'' from Git repo '#{dirname}'"
|
131
131
|
clone.checkout(ref)
|
132
132
|
rescue ::Git::GitExecuteError
|
133
133
|
raise Vanagon::CheckoutFailed, "unable to checkout #{ref} from '#{url}'"
|
@@ -137,7 +137,7 @@ class Vanagon
|
|
137
137
|
# Attempt to update submodules, and do not panic
|
138
138
|
# if there are no submodules to initialize
|
139
139
|
def update_submodules
|
140
|
-
puts "Attempting to update submodules for repo '#{dirname}'"
|
140
|
+
$stderr.puts "Attempting to update submodules for repo '#{dirname}'"
|
141
141
|
clone.update_submodules(init: true)
|
142
142
|
end
|
143
143
|
private :update_submodules
|
@@ -78,7 +78,7 @@ class Vanagon
|
|
78
78
|
#
|
79
79
|
# @raise [RuntimeError] an exception is raised if the sum does not match the sum of the file
|
80
80
|
def verify # rubocop:disable Metrics/AbcSize
|
81
|
-
puts "Verifying file: #{file} against sum: '#{sum}'"
|
81
|
+
$stderr.puts "Verifying file: #{file} against sum: '#{sum}'"
|
82
82
|
actual = get_sum(File.join(workdir, file), sum_type)
|
83
83
|
return true if sum == actual
|
84
84
|
|
@@ -92,7 +92,7 @@ class Vanagon
|
|
92
92
|
uri = URI.parse(target_url.to_s)
|
93
93
|
target_file ||= File.basename(uri.path)
|
94
94
|
|
95
|
-
puts "Downloading file '#{target_file}' from url '#{target_url}'"
|
95
|
+
$stderr.puts "Downloading file '#{target_file}' from url '#{target_url}'"
|
96
96
|
|
97
97
|
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
98
98
|
http.request(Net::HTTP::Get.new(uri, headers)) do |response|
|
@@ -39,7 +39,6 @@ class Vanagon
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
42
|
# Constructor for the File source type
|
44
43
|
#
|
45
44
|
# @param path [String] path of the local file to copy
|
@@ -58,7 +57,7 @@ class Vanagon
|
|
58
57
|
#
|
59
58
|
# @raise [RuntimeError, Vanagon::Error] an exception is raised if the URI scheme cannot be handled
|
60
59
|
def copy
|
61
|
-
puts "Copying file '#{url.basename}' to workdir"
|
60
|
+
$stderr.puts "Copying file '#{url.basename}' to workdir"
|
62
61
|
|
63
62
|
FileUtils.cp_r(url, file)
|
64
63
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'vanagon/component/source'
|
2
|
+
|
3
|
+
class Vanagon
|
4
|
+
class Component
|
5
|
+
class Source
|
6
|
+
# This class has been extracted from Vanagon::Component::Source for the
|
7
|
+
# sake of isolation and in service of its pending removal. Rewrite rules
|
8
|
+
# should be considered deprecated. The removal will be carried out before
|
9
|
+
# Vanagon 1.0.0 is released.
|
10
|
+
class Rewrite
|
11
|
+
@rewrite_rules = {}
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_reader :rewrite_rules
|
15
|
+
|
16
|
+
# @deprecated Please use the component DSL method #mirror(<URI>)
|
17
|
+
# instead. This method will be removed before Vanagon 1.0.0.
|
18
|
+
def register_rewrite_rule(protocol, rule)
|
19
|
+
warn <<-HERE.undent
|
20
|
+
rewrite rule support is deprecated and will be removed before Vanagon 1.0.0.
|
21
|
+
Rewritten URLs will be automatically converted into mirror URLs for now but
|
22
|
+
please use the component DSL method '#mirror url' to define new mirror URL
|
23
|
+
sources for a given component.
|
24
|
+
HERE
|
25
|
+
if rule.is_a?(String) || rule.is_a?(Proc)
|
26
|
+
if Vanagon::Component::Source::SUPPORTED_PROTOCOLS.include?(protocol)
|
27
|
+
@rewrite_rules[protocol] = rule
|
28
|
+
else
|
29
|
+
raise Vanagon::Error, "#{protocol} is not a supported protocol for rewriting"
|
30
|
+
end
|
31
|
+
else
|
32
|
+
raise Vanagon::Error, "String or Proc is required as a rewrite_rule."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def rewrite(url, protocol)
|
37
|
+
# Vanagon did not originally distinguish between http and https
|
38
|
+
# when looking up rewrite rules; this is no longer true, but it
|
39
|
+
# means that we should try to preserve old, dumb behavior until
|
40
|
+
# the rewrite engine is removed.
|
41
|
+
return rewrite(url, "http") if protocol == "https"
|
42
|
+
|
43
|
+
rule = @rewrite_rules[protocol]
|
44
|
+
if rule
|
45
|
+
if rule.is_a?(Proc)
|
46
|
+
return proc_rewrite(rule, url)
|
47
|
+
elsif rule.is_a?(String)
|
48
|
+
return string_rewrite(rule, url)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
return url
|
53
|
+
end
|
54
|
+
|
55
|
+
def proc_rewrite(rule, url)
|
56
|
+
if rule.arity == 1
|
57
|
+
rule.call(url)
|
58
|
+
else
|
59
|
+
raise Vanagon::Error, "Unable to use provided rewrite rule. Expected Proc with one argument, Proc has #{rule.arity} arguments"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def string_rewrite(rule, original_url)
|
64
|
+
url = original_url.to_s
|
65
|
+
target_match = url.match(/.*\/([^\/]*)$/)
|
66
|
+
if target_match
|
67
|
+
target = target_match[1]
|
68
|
+
return File.join(rule, target)
|
69
|
+
else
|
70
|
+
raise Vanagon::Error, "Unable to apply url rewrite to '#{url}', expected to find at least one '/' in the url."
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# @deprecated Please use the component DSL method #mirror(<URI>)
|
75
|
+
# instead. This method will be removed before Vanagon 1.0.0.
|
76
|
+
def parse_and_rewrite(uri)
|
77
|
+
url = URI.parse(uri)
|
78
|
+
return url unless url.scheme
|
79
|
+
rewrite(url.to_s, url.scheme)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|