buildpack-support 1.0.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.
- data/LICENSE +202 -0
- data/NOTICE +2 -0
- data/docs/cache.md +77 -0
- data/docs/component.md +1 -0
- data/docs/configuration.md +27 -0
- data/docs/logging.md +54 -0
- data/docs/other.md +1 -0
- data/docs/rake.md +1 -0
- data/docs/repository.md +116 -0
- data/docs/test.md +1 -0
- data/lib/buildpack_support.rb +18 -0
- data/lib/buildpack_support/base_buildpack.rb +166 -0
- data/lib/buildpack_support/buildpack_version.rb +124 -0
- data/lib/buildpack_support/cache.rb +24 -0
- data/lib/buildpack_support/cache/application_cache.rb +41 -0
- data/lib/buildpack_support/cache/cached_file.rb +103 -0
- data/lib/buildpack_support/cache/download_cache.rb +280 -0
- data/lib/buildpack_support/cache/inferred_network_failure.rb +26 -0
- data/lib/buildpack_support/cache/internet_availability.rb +64 -0
- data/lib/buildpack_support/component.rb +24 -0
- data/lib/buildpack_support/component/application.rb +76 -0
- data/lib/buildpack_support/component/base_component.rb +78 -0
- data/lib/buildpack_support/component/base_droplet.rb +96 -0
- data/lib/buildpack_support/component/downloads.rb +88 -0
- data/lib/buildpack_support/component/services.rb +84 -0
- data/lib/buildpack_support/component/versioned_dependency_component.rb +71 -0
- data/lib/buildpack_support/component/versioned_downloads.rb +57 -0
- data/lib/buildpack_support/component/with_timing.rb +40 -0
- data/lib/buildpack_support/configuration_utils.rb +58 -0
- data/lib/buildpack_support/constantize.rb +46 -0
- data/lib/buildpack_support/dash_case.rb +29 -0
- data/lib/buildpack_support/directory_finder.rb +45 -0
- data/lib/buildpack_support/filtering_pathname.rb +227 -0
- data/lib/buildpack_support/format_duration.rb +57 -0
- data/lib/buildpack_support/logging.rb +22 -0
- data/lib/buildpack_support/logging/delegating_logger.rb +48 -0
- data/lib/buildpack_support/logging/logger_factory.rb +148 -0
- data/lib/buildpack_support/qualify_path.rb +36 -0
- data/lib/buildpack_support/rake.rb +22 -0
- data/lib/buildpack_support/rake/buildpack_stage_task.rb +86 -0
- data/lib/buildpack_support/rake/cached_artifact_finder.rb +99 -0
- data/lib/buildpack_support/rake/check_api_doc_task.rb +70 -0
- data/lib/buildpack_support/rake/dependency_cache_task.rb +87 -0
- data/lib/buildpack_support/rake/disable_remote_downloads_task.rb +80 -0
- data/lib/buildpack_support/rake/package_task.rb +133 -0
- data/lib/buildpack_support/rake/package_zip_task.rb +80 -0
- data/lib/buildpack_support/rake/repository_configuration_finder.rb +66 -0
- data/lib/buildpack_support/rake/write_version_file_task.rb +82 -0
- data/lib/buildpack_support/repository.rb +24 -0
- data/lib/buildpack_support/repository/configured_item.rb +81 -0
- data/lib/buildpack_support/repository/repository_index.rb +98 -0
- data/lib/buildpack_support/repository/wildcard_version_resolver.rb +75 -0
- data/lib/buildpack_support/shell.rb +41 -0
- data/lib/buildpack_support/snake_case.rb +30 -0
- data/lib/buildpack_support/space_case.rb +29 -0
- data/lib/buildpack_support/test/application_helper.rb +41 -0
- data/lib/buildpack_support/test/base_component_helper.rb +59 -0
- data/lib/buildpack_support/test/base_droplet_helper.rb +36 -0
- data/lib/buildpack_support/test/console_helper.rb +57 -0
- data/lib/buildpack_support/test/environment_helper.rb +32 -0
- data/lib/buildpack_support/test/internet_availability_helper.rb +29 -0
- data/lib/buildpack_support/test/logging_helper.rb +50 -0
- data/lib/buildpack_support/test/scratch_helper.rb +32 -0
- data/lib/buildpack_support/test/versioned_dependency_component_helper.rb +32 -0
- data/lib/buildpack_support/test/with_load_path_helper.rb +27 -0
- data/lib/buildpack_support/to_b.rb +38 -0
- data/lib/buildpack_support/tokenized_version.rb +157 -0
- data/lib/buildpack_support/version.rb +23 -0
- data/spec/buildpack_support/base_buildpack_spec.rb +112 -0
- data/spec/buildpack_support/buildpack_version_spec.rb +122 -0
- data/spec/buildpack_support/cache/application_cache_spec.rb +56 -0
- data/spec/buildpack_support/cache/cached_file_spec.rb +94 -0
- data/spec/buildpack_support/cache/download_cache_spec.rb +293 -0
- data/spec/buildpack_support/cache/internet_availability_spec.rb +57 -0
- data/spec/buildpack_support/cache/yield_file_with_content.rb +30 -0
- data/spec/buildpack_support/component/application_spec.rb +81 -0
- data/spec/buildpack_support/component/base_component_spec.rb +81 -0
- data/spec/buildpack_support/component/base_droplet_spec.rb +72 -0
- data/spec/buildpack_support/component/downloads_spec.rb +63 -0
- data/spec/buildpack_support/component/services_spec.rb +80 -0
- data/spec/buildpack_support/component/versioned_dependency_component_spec.rb +58 -0
- data/spec/buildpack_support/component/versioned_downloads_spec.rb +58 -0
- data/spec/buildpack_support/component/with_timing_spec.rb +30 -0
- data/spec/buildpack_support/configuration_utils_spec.rb +39 -0
- data/spec/buildpack_support/constantize_spec.rb +34 -0
- data/spec/buildpack_support/dash_case_spec.rb +41 -0
- data/spec/buildpack_support/directory_finder_spec.rb +41 -0
- data/spec/buildpack_support/filtering_pathname_spec.rb +443 -0
- data/spec/buildpack_support/format_duration_spec.rb +60 -0
- data/spec/buildpack_support/logging/delegating_logger_spec.rb +62 -0
- data/spec/buildpack_support/logging/logger_factory_spec.rb +262 -0
- data/spec/buildpack_support/qualify_path_spec.rb +42 -0
- data/spec/buildpack_support/rake/buildpack_stage_task_spec.rb +88 -0
- data/spec/buildpack_support/rake/cached_artifact_finder_spec.rb +73 -0
- data/spec/buildpack_support/rake/check_api_doc_task_spec.rb +69 -0
- data/spec/buildpack_support/rake/dependency_cache_task_spec.rb +133 -0
- data/spec/buildpack_support/rake/disable_remote_downloads_task_spec.rb +91 -0
- data/spec/buildpack_support/rake/package_task_spec.rb +335 -0
- data/spec/buildpack_support/rake/package_zip_task_spec.rb +91 -0
- data/spec/buildpack_support/rake/repository_configuration_finder_spec.rb +61 -0
- data/spec/buildpack_support/rake/write_version_file_task_spec.rb +96 -0
- data/spec/buildpack_support/repository/configured_item_spec.rb +78 -0
- data/spec/buildpack_support/repository/repository_index_spec.rb +118 -0
- data/spec/buildpack_support/repository/wildcard_version_resolver_spec.rb +73 -0
- data/spec/buildpack_support/shell_spec.rb +32 -0
- data/spec/buildpack_support/snake_case_spec.rb +45 -0
- data/spec/buildpack_support/space_case_spec.rb +41 -0
- data/spec/buildpack_support/to_b_spec.rb +41 -0
- data/spec/buildpack_support/tokenized_version_spec.rb +132 -0
- data/spec/fixtures/application/test-file +0 -0
- data/spec/fixtures/config/found-config.yml +2 -0
- data/spec/fixtures/droplet-resources/droplet-resource +0 -0
- data/spec/fixtures/stub-download-with-top-level.zip +0 -0
- data/spec/fixtures/stub-download.tar.gz +0 -0
- data/spec/fixtures/stub-download.zip +0 -0
- data/spec/fixtures/test-cache.yml +18 -0
- data/spec/fixtures/test-index.yml +2 -0
- data/spec/fixtures/test_component.rb +0 -0
- data/spec/fixtures/zip-contents/test-directory/test-deep-file +0 -0
- data/spec/fixtures/zip-contents/test-file +0 -0
- data/spec/spec_helper.rb +30 -0
- metadata +416 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
# A mixin that adds the ability to format a +Numeric+ as a user-readable duration
|
|
17
|
+
class Numeric
|
|
18
|
+
|
|
19
|
+
# Formats a number as a user-readable duration
|
|
20
|
+
#
|
|
21
|
+
# @return [String] a user-readable duration. Follows the following algorithm
|
|
22
|
+
# 1. If more than an hour, print hours and minutes
|
|
23
|
+
# 2. If less than an hour and more than a minute, print minutes and seconds
|
|
24
|
+
# 3. If less than a minute and more than a second, print seconds.tenths
|
|
25
|
+
def duration
|
|
26
|
+
remainder = self
|
|
27
|
+
|
|
28
|
+
hours = (remainder / HOUR).to_int
|
|
29
|
+
remainder -= HOUR * hours
|
|
30
|
+
|
|
31
|
+
minutes = (remainder / MINUTE).to_int
|
|
32
|
+
remainder -= MINUTE * minutes
|
|
33
|
+
|
|
34
|
+
return "#{hours}h #{minutes}m" if hours > 0
|
|
35
|
+
|
|
36
|
+
seconds = (remainder / SECOND).to_int
|
|
37
|
+
remainder -= SECOND * seconds
|
|
38
|
+
|
|
39
|
+
return "#{minutes}m #{seconds}s" if minutes > 0
|
|
40
|
+
|
|
41
|
+
tenths = (remainder / TENTH).to_int
|
|
42
|
+
"#{seconds}.#{tenths}s"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
MILLISECOND = 0.001.freeze
|
|
46
|
+
|
|
47
|
+
TENTH = (100 * MILLISECOND).freeze
|
|
48
|
+
|
|
49
|
+
SECOND = (10 * TENTH).freeze
|
|
50
|
+
|
|
51
|
+
MINUTE = (60 * SECOND).freeze
|
|
52
|
+
|
|
53
|
+
HOUR = (60 * MINUTE).freeze
|
|
54
|
+
|
|
55
|
+
private_constant :MILLISECOND, :TENTH, :SECOND, :MINUTE, :HOUR
|
|
56
|
+
|
|
57
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
module BuildpackSupport
|
|
17
|
+
|
|
18
|
+
# A module encapsulating all of the code for the logging utilities
|
|
19
|
+
module Logging
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'buildpack_support/logging'
|
|
17
|
+
require 'logger'
|
|
18
|
+
|
|
19
|
+
module BuildpackSupport
|
|
20
|
+
module Logging
|
|
21
|
+
|
|
22
|
+
# A +Logger+ subclass that forwards all messages to a collection of delegates
|
|
23
|
+
class DelegatingLogger < ::Logger
|
|
24
|
+
|
|
25
|
+
# Creates an instance
|
|
26
|
+
#
|
|
27
|
+
# @param [Class] klass the class to use as the +progname+ for log messages
|
|
28
|
+
# @param [Array<Logger>] delegates the +Logger+ instances to delegate to
|
|
29
|
+
def initialize(klass, delegates)
|
|
30
|
+
@klass = klass
|
|
31
|
+
@delegates = delegates
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Adds a message to the delegate +Logger+ instances
|
|
35
|
+
#
|
|
36
|
+
# @param [Logger::Severity] severity the severity of the message
|
|
37
|
+
# @param [String] message the message
|
|
38
|
+
# @param [String] progname the message when passed in as a parameter
|
|
39
|
+
# @yield evaluated for the message
|
|
40
|
+
# @return [Void]
|
|
41
|
+
def add(severity, message = nil, progname = nil, &block)
|
|
42
|
+
@delegates.each { |delegate| delegate.add severity, message || progname, @klass, &block }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'buildpack_support/logging'
|
|
17
|
+
require 'buildpack_support/logging/delegating_logger'
|
|
18
|
+
require 'buildpack_support/configuration_utils'
|
|
19
|
+
require 'buildpack_support/constantize'
|
|
20
|
+
require 'fileutils'
|
|
21
|
+
require 'logger'
|
|
22
|
+
require 'monitor'
|
|
23
|
+
require 'singleton'
|
|
24
|
+
|
|
25
|
+
module BuildpackSupport
|
|
26
|
+
module Logging
|
|
27
|
+
|
|
28
|
+
# Responsible for configuring and creating all +Logger+ instances. +Logger+s created by the factory log all messages
|
|
29
|
+
# to a file located at +app_dir/.buildpack.log+. They also log all messages, filtered by the configured
|
|
30
|
+
# severity, to +$stderr+. Severity can be configured (in decreasing priority) by using the +JBP_LOG_LEVEL+
|
|
31
|
+
# environment variable, the Ruby +$DEBUG+ and +$VERBOSE+ flags, and the +config/logging.yml+ file. If none of these
|
|
32
|
+
# is set, then the severity defaults to +INFO+.
|
|
33
|
+
class LoggerFactory
|
|
34
|
+
include ::Singleton
|
|
35
|
+
|
|
36
|
+
attr_reader :initialized
|
|
37
|
+
|
|
38
|
+
def initialize
|
|
39
|
+
@configuration_utils = BuildpackSupport::ConfigurationUtils.new false
|
|
40
|
+
@monitor = Monitor.new
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Sets up the logger factory
|
|
44
|
+
#
|
|
45
|
+
# @param [Pathname] app_dir the application directory
|
|
46
|
+
# @return [Void]
|
|
47
|
+
def setup(app_dir)
|
|
48
|
+
@monitor.synchronize do
|
|
49
|
+
@log_file = app_dir + '.buildpack.log'
|
|
50
|
+
@delegates = [file_logger, console_logger]
|
|
51
|
+
@initialized = true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns a configured logger for a given +Class+. The +Class+ that is passed in is used as the +progname+, for all
|
|
56
|
+
# messages logged by the logger. If this is called before the +setup()+ method, a failure will be generated.
|
|
57
|
+
#
|
|
58
|
+
# @param [Class] klass the class that the logger is created for
|
|
59
|
+
# @return [Logger] the logger that was requested
|
|
60
|
+
def get_logger(klass)
|
|
61
|
+
@monitor.synchronize do
|
|
62
|
+
fail "Attempted to get Logger for #{short_class(klass)} before initialization" unless @initialized
|
|
63
|
+
DelegatingLogger.new wrapped_short_class(klass), @delegates
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns the location of the log file. If this is called before the +setup()+ method, a failure will be generated.
|
|
68
|
+
#
|
|
69
|
+
# @return [Pathname] the location of the log file
|
|
70
|
+
def log_file
|
|
71
|
+
@monitor.synchronize do
|
|
72
|
+
fail 'Attempted to get log file before initialization' unless @initialized
|
|
73
|
+
@log_file
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Resets the configuration of the factory
|
|
78
|
+
#
|
|
79
|
+
# @return [Void]
|
|
80
|
+
def reset
|
|
81
|
+
@monitor.synchronize do
|
|
82
|
+
@initialized = false
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
class << self
|
|
87
|
+
|
|
88
|
+
# Returns a configured logger for a given +Class+. The +Class+ that is passed in is used as the +progname+, for all
|
|
89
|
+
# messages logged by the logger. If this is called before the +setup()+ method, a failure will be generated. Note this
|
|
90
|
+
#
|
|
91
|
+
# @param [Class] klass the class that the logger is created for
|
|
92
|
+
# @return [Logger] the logger that was requested
|
|
93
|
+
# @deprecated use +LoggerFactory.instance.get_logger(klass)+ instead
|
|
94
|
+
def get_logger(klass)
|
|
95
|
+
LoggerFactory.instance.get_logger(klass)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
def console_logger
|
|
103
|
+
logger = Logger.new($stderr)
|
|
104
|
+
logger.level = severity
|
|
105
|
+
logger.formatter = lambda do |severity, _datetime, klass, message|
|
|
106
|
+
"#{klass.ljust(32)} #{severity.ljust(5)} #{message}\n"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
logger
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def file_logger
|
|
113
|
+
FileUtils.mkdir_p File.dirname(@log_file)
|
|
114
|
+
|
|
115
|
+
logger = Logger.new(@log_file)
|
|
116
|
+
logger.level = ::Logger::DEBUG
|
|
117
|
+
logger.formatter = lambda do |severity, datetime, klass, message|
|
|
118
|
+
"#{datetime.strftime('%FT%T.%2N%z')} #{klass.ljust(32)} #{severity.ljust(5)} #{message}\n"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
logger
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def ruby_mode
|
|
125
|
+
$VERBOSE || $DEBUG ? 'DEBUG' : nil
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def severity
|
|
129
|
+
severity = ENV['BP_LOG_LEVEL']
|
|
130
|
+
severity = ruby_mode unless severity
|
|
131
|
+
severity = @configuration_utils.load('logging')['default_log_level'] unless severity
|
|
132
|
+
severity = 'INFO' unless severity
|
|
133
|
+
|
|
134
|
+
"::Logger::Severity::#{severity.upcase}".constantize
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def short_class(klass)
|
|
138
|
+
klass.to_s.split('::').last
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def wrapped_short_class(klass)
|
|
142
|
+
"[#{short_class(klass)}]"
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License. language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
require 'buildpack_support'
|
|
18
|
+
|
|
19
|
+
module BuildpackSupport
|
|
20
|
+
|
|
21
|
+
# Mixin with a method for qualifying a given path relative to a root
|
|
22
|
+
module QualifyPath
|
|
23
|
+
|
|
24
|
+
# Qualifies the path such that is is formatted as +$PWD/<path>+. Also ensures that the path is relative to a root,
|
|
25
|
+
# which defaults to the +@droplet_root+ of the class.
|
|
26
|
+
#
|
|
27
|
+
# @param [Pathname] path the path to qualify
|
|
28
|
+
# @param [Pathname] root the root to make relative to
|
|
29
|
+
# @return [String] the qualified path
|
|
30
|
+
def qualify_path(path, root = @droplet_root)
|
|
31
|
+
"$PWD/#{path.relative_path_from(root)}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
module BuildpackSupport
|
|
17
|
+
|
|
18
|
+
# A module encapsulating all of the code for the Rake utilities
|
|
19
|
+
module Rake
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'buildpack_support/rake'
|
|
17
|
+
require 'rake'
|
|
18
|
+
require 'rake/tasklib'
|
|
19
|
+
require 'yaml'
|
|
20
|
+
|
|
21
|
+
module BuildpackSupport
|
|
22
|
+
module Rake
|
|
23
|
+
|
|
24
|
+
# A task generator for the tasks that copy files to the staging directory
|
|
25
|
+
class BuildpackStageTask < ::Rake::TaskLib
|
|
26
|
+
|
|
27
|
+
# @!attribute [rw] files
|
|
28
|
+
# @return [Array<String>] the files to copy to the +staging_dir+
|
|
29
|
+
attr_accessor :files
|
|
30
|
+
|
|
31
|
+
# @!attribute [rw] package_name
|
|
32
|
+
# @return [String] the name of the package
|
|
33
|
+
attr_accessor :package_name
|
|
34
|
+
|
|
35
|
+
# @!attribute [rw] staging_dir
|
|
36
|
+
# @return [String] the directory to zip the contents of
|
|
37
|
+
attr_accessor :staging_dir
|
|
38
|
+
|
|
39
|
+
# @!attribute [rw] verbose
|
|
40
|
+
# @return [Boolean] the verbosity of the task. Defaults to +false+.
|
|
41
|
+
attr_accessor :verbose
|
|
42
|
+
|
|
43
|
+
# Creates an instance
|
|
44
|
+
def initialize(&task_block)
|
|
45
|
+
@verbose = false
|
|
46
|
+
|
|
47
|
+
task_block.call(*[self].slice(0, task_block.arity)) if task_block
|
|
48
|
+
abort 'files must be configured' unless files
|
|
49
|
+
abort 'package_name must be configured' unless package_name
|
|
50
|
+
abort 'staging_dir must be configured' unless staging_dir
|
|
51
|
+
|
|
52
|
+
create_copy_tasks files, package_name, staging_dir, verbose
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Runs the task
|
|
56
|
+
#
|
|
57
|
+
# @param [String] source the file to copy
|
|
58
|
+
# @param [String] target where to copy the file to
|
|
59
|
+
# @param [Boolean] verbose whether to print messages to the console
|
|
60
|
+
# @return [void]
|
|
61
|
+
def run_task(source, target, verbose)
|
|
62
|
+
RakeFileUtils.verbose(verbose) do
|
|
63
|
+
mkdir_p File.dirname(target)
|
|
64
|
+
cp source, target
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def create_copy_tasks(files, package_name, staging_dir, verbose)
|
|
71
|
+
files.reject { |f| File.directory? f }.each do |source|
|
|
72
|
+
target = target(source, staging_dir)
|
|
73
|
+
|
|
74
|
+
task package_name => target
|
|
75
|
+
file(target => source) { |t| run_task t.source, t.name, verbose }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def target(file, staging_dir)
|
|
80
|
+
"#{staging_dir}/#{file}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# # Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'buildpack_support/cache/download_cache'
|
|
17
|
+
require 'buildpack_support/configuration_utils'
|
|
18
|
+
require 'buildpack_support/rake'
|
|
19
|
+
require 'buildpack_support/repository/wildcard_version_resolver'
|
|
20
|
+
require 'buildpack_support/tokenized_version'
|
|
21
|
+
require 'yaml'
|
|
22
|
+
|
|
23
|
+
module BuildpackSupport
|
|
24
|
+
module Rake
|
|
25
|
+
|
|
26
|
+
# A class that finds all artifacts eligible to be cached
|
|
27
|
+
class CachedArtifactFinder
|
|
28
|
+
|
|
29
|
+
# Creates a new instance
|
|
30
|
+
def initialize
|
|
31
|
+
@cache = BuildpackSupport::Cache::DownloadCache.new
|
|
32
|
+
@configuration_utils = BuildpackSupport::ConfigurationUtils.new
|
|
33
|
+
@default_repository_root = @configuration_utils.load('repository')['default_repository_root'].chomp('/')
|
|
34
|
+
@version_resolver = BuildpackSupport::Repository::WildcardVersionResolver.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Returns a collection of URIs to be cached
|
|
38
|
+
#
|
|
39
|
+
# @param [Array<Hash>] configurations a collection of hashes that contain repository configurations
|
|
40
|
+
# @return [Array<String>] a collection of uris to be cached
|
|
41
|
+
def find(configurations)
|
|
42
|
+
configurations.map do |configuration|
|
|
43
|
+
index_uris(configuration).map do |index_uri|
|
|
44
|
+
[index_uri, cached_artifact(configuration, index_uri)]
|
|
45
|
+
end
|
|
46
|
+
end.flatten
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
ARCHITECTURES = %w(x86_64).freeze
|
|
52
|
+
|
|
53
|
+
PLATFORMS = %w(centos6 lucid mountainlion precise trusty).freeze
|
|
54
|
+
|
|
55
|
+
private_constant :ARCHITECTURES, :PLATFORMS
|
|
56
|
+
|
|
57
|
+
def augment(raw, pattern, candidates)
|
|
58
|
+
raw =~ pattern ? candidates.map { |p| raw.gsub pattern, p } : raw
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def augment_architecture(raw)
|
|
62
|
+
augment(raw, /\{architecture\}/, ARCHITECTURES)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def augment_path(raw)
|
|
66
|
+
"#{raw.chomp('/')}/index.yml"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def augment_platform(raw)
|
|
70
|
+
augment(raw, /\{platform\}/, PLATFORMS)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def augment_repository_root(raw)
|
|
74
|
+
raw.gsub(/\{default.repository.root\}/, @default_repository_root)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def cached_artifact(configuration, index_uri)
|
|
78
|
+
@cache.get(index_uri) do |f|
|
|
79
|
+
index = YAML.load f
|
|
80
|
+
index[resolved_version(configuration, index).to_s]
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def index_uris(configuration)
|
|
85
|
+
[configuration['repository_root']]
|
|
86
|
+
.map { |r| augment_repository_root r }
|
|
87
|
+
.map { |r| augment_platform r }.flatten
|
|
88
|
+
.map { |r| augment_architecture r }.flatten
|
|
89
|
+
.map { |r| augment_path r }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def resolved_version(configuration, index)
|
|
93
|
+
@version_resolver.resolve(BuildpackSupport::TokenizedVersion.new(configuration['version']), index.keys)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
end
|