cartage 2.2 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +99 -80
- data/README.rdoc +13 -7
- data/Rakefile +52 -38
- data/lib/cartage/backport.rb +3 -3
- data/lib/cartage/cli.rb +76 -76
- data/lib/cartage/commands/echo.rb +6 -6
- data/lib/cartage/commands/info.rb +17 -17
- data/lib/cartage/commands/manifest.rb +46 -46
- data/lib/cartage/commands/metadata.rb +2 -2
- data/lib/cartage/commands/pack.rb +6 -6
- data/lib/cartage/config.rb +27 -25
- data/lib/cartage/core.rb +18 -18
- data/lib/cartage/gli_ext.rb +10 -10
- data/lib/cartage/minitest.rb +7 -7
- data/lib/cartage/plugin.rb +10 -9
- data/lib/cartage/plugins/build_tarball.rb +2 -2
- data/lib/cartage/plugins/manifest.rb +85 -85
- data/lib/cartage.rb +67 -67
- data/test/minitest_config.rb +8 -8
- data/test/test_cartage.rb +130 -130
- data/test/test_cartage_build_tarball.rb +22 -22
- data/test/test_cartage_config.rb +27 -27
- data/test/test_cartage_core.rb +36 -36
- data/test/test_cartage_manifest.rb +51 -53
- data/test/test_cartage_plugin.rb +21 -21
- metadata +37 -20
data/lib/cartage/cli.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require_relative
|
3
|
+
require "cartage"
|
4
|
+
require_relative "gli_ext"
|
5
5
|
|
6
6
|
::GLI::Commands::Help.skips_pre = false
|
7
7
|
|
@@ -14,7 +14,7 @@ class Cartage
|
|
14
14
|
class QuietExit < StandardError
|
15
15
|
include ::GLI::StandardException
|
16
16
|
|
17
|
-
def initialize(exit_code)
|
17
|
+
def initialize(exit_code) # :nodoc:
|
18
18
|
@exit_code = exit_code
|
19
19
|
end
|
20
20
|
|
@@ -38,7 +38,7 @@ class Cartage
|
|
38
38
|
|
39
39
|
Cartage::Plugin.load
|
40
40
|
|
41
|
-
include ::GLI::App
|
41
|
+
include ::GLI::App # :nodoc:
|
42
42
|
|
43
43
|
class << self
|
44
44
|
# When called with a block, this method reopens Cartage::CLI to add new
|
@@ -48,7 +48,7 @@ class Cartage
|
|
48
48
|
# +mods+ are the modules to extend onto Cartage::CLI. +block+ is the
|
49
49
|
# block that contains CLI command extensions (using the GLI DSL).
|
50
50
|
def extend(*mods, &block)
|
51
|
-
return super(*mods) unless
|
51
|
+
return super(*mods) unless block
|
52
52
|
cli.instance_eval(&block)
|
53
53
|
end
|
54
54
|
|
@@ -72,7 +72,7 @@ class Cartage
|
|
72
72
|
# +config+ (which must be a Cartage::Config object) may be provided.
|
73
73
|
def cartage(config = nil)
|
74
74
|
if defined?(@cartage) && @cartage && config
|
75
|
-
fail
|
75
|
+
fail "Cannot provide another configuration after initialization."
|
76
76
|
end
|
77
77
|
@cartage ||= Cartage.new(config)
|
78
78
|
end
|
@@ -90,11 +90,11 @@ class Cartage
|
|
90
90
|
Cartage::Config.load(value)
|
91
91
|
end
|
92
92
|
|
93
|
-
program_desc
|
94
|
-
program_long_desc
|
95
|
-
Cartage provides a repeatable means to create a package for a server-side
|
96
|
-
application that can be used in deployment with a configuration tool like
|
97
|
-
Ansible, Chef, Puppet, or Salt.
|
93
|
+
program_desc "Manage releaseable packages"
|
94
|
+
program_long_desc <<~'DESC'
|
95
|
+
Cartage provides a repeatable means to create a package for a server-side
|
96
|
+
application that can be used in deployment with a configuration tool like
|
97
|
+
Ansible, Chef, Puppet, or Salt.
|
98
98
|
DESC
|
99
99
|
version Cartage::VERSION
|
100
100
|
|
@@ -102,77 +102,77 @@ Ansible, Chef, Puppet, or Salt.
|
|
102
102
|
arguments :strict
|
103
103
|
synopsis_format :terminal
|
104
104
|
|
105
|
-
desc
|
106
|
-
switch %i
|
105
|
+
desc "Silence normal output."
|
106
|
+
switch %i[q quiet]
|
107
107
|
|
108
|
-
desc
|
109
|
-
switch %i
|
108
|
+
desc "Show verbose output."
|
109
|
+
switch %i[v verbose]
|
110
110
|
|
111
|
-
desc
|
112
|
-
switch %i
|
111
|
+
desc "Show the backtrace when an error occurs."
|
112
|
+
switch %i[T trace], negatable: false
|
113
113
|
|
114
|
-
desc
|
115
|
-
long_desc
|
116
|
-
Use the specified configuration file. If not specified, the configuration is
|
117
|
-
found relative to the current working directory (assumed to be the project
|
118
|
-
root) at one of the following locations:
|
119
|
-
|
120
|
-
1. config/cartage.yml
|
121
|
-
2. cartage.yml
|
122
|
-
3. .cartage.yml
|
114
|
+
desc "Use the specified Cartage configuration file."
|
115
|
+
long_desc <<~'DESC'
|
116
|
+
Use the specified configuration file. If not specified, the configuration is
|
117
|
+
found relative to the current working directory (assumed to be the project
|
118
|
+
root) at one of the following locations:
|
119
|
+
|
120
|
+
1. config/cartage.yml
|
121
|
+
2. cartage.yml
|
122
|
+
3. .cartage.yml
|
123
123
|
DESC
|
124
|
-
flag [
|
124
|
+
flag [:C, "config-file"],
|
125
125
|
type: Cartage::Config,
|
126
126
|
arg_name: :FILE,
|
127
127
|
default_value: :'<project-config>'
|
128
128
|
|
129
|
-
desc
|
130
|
-
long_desc
|
131
|
-
The name of the package is used with the timestamp to create the final package
|
132
|
-
name. Defaults to the last part of the repo URL.
|
129
|
+
desc "The name of the package."
|
130
|
+
long_desc <<~'DESC'
|
131
|
+
The name of the package is used with the timestamp to create the final package
|
132
|
+
name. Defaults to the last part of the repo URL.
|
133
133
|
DESC
|
134
|
-
flag %i
|
134
|
+
flag %i[n name], arg_name: :NAME, default_value: :'<repo-name>'
|
135
135
|
|
136
|
-
desc
|
137
|
-
long_desc
|
138
|
-
flag %i
|
136
|
+
desc "The destination of the created package."
|
137
|
+
long_desc "Where the final package will be written."
|
138
|
+
flag %i[t target], arg_name: :PATH, default_value: :tmp
|
139
139
|
|
140
|
-
desc
|
141
|
-
long_desc
|
142
|
-
Where the package is built from. Defaults to the root of the repository.
|
140
|
+
desc "The package source root path."
|
141
|
+
long_desc <<~'DESC'
|
142
|
+
Where the package is built from. Defaults to the root of the repository.
|
143
143
|
DESC
|
144
|
-
flag [
|
144
|
+
flag [:r, "root-path"], arg_name: :PATH, default_value: :'<repo-root-path>'
|
145
145
|
|
146
|
-
desc
|
147
|
-
long_desc
|
148
|
-
The timestamp is used with the name of the package is used to create the final
|
149
|
-
package name.
|
146
|
+
desc "The timestamp used for building the package."
|
147
|
+
long_desc <<~'DESC'
|
148
|
+
The timestamp is used with the name of the package is used to create the final
|
149
|
+
package name.
|
150
150
|
DESC
|
151
|
-
flag [
|
151
|
+
flag [:timestamp], arg_name: :TIMESTAMP
|
152
152
|
|
153
|
-
desc
|
154
|
-
switch [
|
153
|
+
desc "Disable the use of vendor dependency caching."
|
154
|
+
switch ["disable-dependency-cache"], negatable: false
|
155
155
|
|
156
|
-
desc
|
157
|
-
long_desc
|
158
|
-
Dependencies for deployable packages are vendored. To reduce network calls and
|
159
|
-
build time, Cartage will cache the vendored dependencies in a tarball
|
160
|
-
(dependency-cache.tar.bz2) in this path.
|
156
|
+
desc "The path where vendored dependencies will be cached between builds."
|
157
|
+
long_desc <<~'DESC'
|
158
|
+
Dependencies for deployable packages are vendored. To reduce network calls and
|
159
|
+
build time, Cartage will cache the vendored dependencies in a tarball
|
160
|
+
(dependency-cache.tar.bz2) in this path.
|
161
161
|
DESC
|
162
|
-
flag [
|
162
|
+
flag ["dependency-cache-path"],
|
163
163
|
arg_name: :PATH,
|
164
164
|
default_value: :'<default-dependency-cache-path>'
|
165
165
|
|
166
|
-
commands_from
|
166
|
+
commands_from "cartage/commands"
|
167
167
|
|
168
|
-
desc
|
168
|
+
desc "Save the computed configuration as a configuration file."
|
169
169
|
arg :'CONFIG-FILE'
|
170
|
-
command
|
170
|
+
command "_save" do |save|
|
171
171
|
save.hide!
|
172
172
|
|
173
173
|
save.action do |_global, _options, args|
|
174
174
|
name = args.first
|
175
|
-
name = "#{name}.yml" unless name ==
|
175
|
+
name = "#{name}.yml" unless name == "-" || name.end_with?(".yml")
|
176
176
|
|
177
177
|
Cartage::Config.new(cartage.config).tap do |config|
|
178
178
|
config.name ||= cartage.name
|
@@ -185,7 +185,7 @@ build time, Cartage will cache the vendored dependencies in a tarball
|
|
185
185
|
config.quiet = cartage.quiet || false
|
186
186
|
config.verbose = cartage.verbose || false
|
187
187
|
|
188
|
-
if name ==
|
188
|
+
if name == "-"
|
189
189
|
puts config.to_yaml
|
190
190
|
else
|
191
191
|
Pathname(name).write(config.to_yaml)
|
@@ -195,7 +195,7 @@ build time, Cartage will cache the vendored dependencies in a tarball
|
|
195
195
|
end
|
196
196
|
|
197
197
|
on_error do |ex|
|
198
|
-
unless ex.
|
198
|
+
unless ex.is_a?(Cartage::CLI::QuietExit)
|
199
199
|
output_error_message(ex)
|
200
200
|
ex.backtrace.each { |l| puts l } if backtrace?
|
201
201
|
end
|
@@ -206,26 +206,26 @@ build time, Cartage will cache the vendored dependencies in a tarball
|
|
206
206
|
|
207
207
|
clear_defaults_from(global)
|
208
208
|
|
209
|
-
config = case global[
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
209
|
+
config = case global["config-file"]
|
210
|
+
when Cartage::Config
|
211
|
+
global["config-file"]
|
212
|
+
when nil
|
213
|
+
Cartage::Config.load(:default)
|
214
|
+
else
|
215
|
+
fail "Invalid config-file"
|
216
|
+
end
|
217
217
|
|
218
218
|
# Configure Cartage from the config file and global switches.
|
219
|
-
config.disable_dependency_cache ||= global[
|
220
|
-
config.quiet ||= global[
|
221
|
-
config.verbose ||= global[
|
222
|
-
|
223
|
-
config.name = global[
|
224
|
-
config.target = global[
|
225
|
-
config.root_path = global[
|
226
|
-
config.timestamp = global[
|
227
|
-
if global[
|
228
|
-
config.dependency_cache_path = global[
|
219
|
+
config.disable_dependency_cache ||= global["disable-dependency-cache"]
|
220
|
+
config.quiet ||= global["quiet"]
|
221
|
+
config.verbose ||= global["verbose"]
|
222
|
+
|
223
|
+
config.name = global["name"] if global["name"]
|
224
|
+
config.target = global["target"] if global["target"]
|
225
|
+
config.root_path = global["root-path"] if global["root-path"]
|
226
|
+
config.timestamp = global["timestamp"] if global["timestamp"]
|
227
|
+
if global["dependency-cache-path"]
|
228
|
+
config.dependency_cache_path = global["dependency-cache-path"]
|
229
229
|
end
|
230
230
|
|
231
231
|
cartage(config)
|
@@ -3,16 +3,16 @@
|
|
3
3
|
##
|
4
4
|
# Call +extend+ Cartage::CLI to add the commands defined in the block.
|
5
5
|
Cartage::CLI.extend do
|
6
|
-
desc
|
6
|
+
desc "Echo the provided text"
|
7
7
|
arg :TEXT, :multiple
|
8
|
-
command
|
8
|
+
command "echo" do |echo|
|
9
9
|
echo.hide!
|
10
|
-
echo.desc
|
11
|
-
echo.switch [
|
10
|
+
echo.desc "Suppress newlines"
|
11
|
+
echo.switch [:c, "no-newlines"], negatable: false
|
12
12
|
echo.action do |_g, options, args|
|
13
13
|
unless cartage.quiet
|
14
|
-
message = args.join(
|
15
|
-
if options[
|
14
|
+
message = args.join(" ")
|
15
|
+
if options["no-newlines"] || cartage.config(for_command: "echo").no_newlines
|
16
16
|
puts message
|
17
17
|
else
|
18
18
|
print message
|
@@ -4,33 +4,33 @@
|
|
4
4
|
# Call +extend+ Cartage::CLI to add the commands defined in the block.
|
5
5
|
Cartage::CLI.extend do
|
6
6
|
# Use +desc+ to write a description about the next command.
|
7
|
-
desc
|
7
|
+
desc "Show information about Cartage itself"
|
8
8
|
|
9
9
|
# Use +long_desc+ to write a long description about the next command that can
|
10
10
|
# be included in a generated RDoc file.
|
11
|
-
long_desc
|
12
|
-
Shows various bits of information about Cartage based on the running instance.
|
13
|
-
Some plug-ins do run-time resolution of configuration values, so what is shown
|
14
|
-
through these subcommands will not represent that resolution.
|
11
|
+
long_desc <<~'DESC'
|
12
|
+
Shows various bits of information about Cartage based on the running instance.
|
13
|
+
Some plug-ins do run-time resolution of configuration values, so what is shown
|
14
|
+
through these subcommands will not represent that resolution.
|
15
15
|
DESC
|
16
16
|
|
17
17
|
# Declare a new command with +command+ and one or more names for the command.
|
18
18
|
# This command is available as both <tt>cartage info</tt> and <tt>cartage
|
19
19
|
# i</tt>. The block contains the definition of the switches, flags,
|
20
20
|
# subcommands, and actions for this command.
|
21
|
-
command %w
|
21
|
+
command %w[info i] do |info|
|
22
22
|
# Use this extension method to hide this command. GLI 2.13 does not support
|
23
23
|
# hiding subcommands.
|
24
24
|
info.hide!
|
25
25
|
|
26
26
|
# The same GLI::DSL works on the command being created, Here, we are
|
27
27
|
# creating <tt>cartage info plugins</tt>.
|
28
|
-
info.desc
|
29
|
-
info.long_desc
|
30
|
-
Only plug-ins using the class plug-in protocol are found this way. Plug-ins
|
31
|
-
that just provide commands are not reported as plugins.
|
28
|
+
info.desc "Show the plug-ins that have been found."
|
29
|
+
info.long_desc <<~'DESC'
|
30
|
+
Only plug-ins using the class plug-in protocol are found this way. Plug-ins
|
31
|
+
that just provide commands are not reported as plugins.
|
32
32
|
DESC
|
33
|
-
info.command
|
33
|
+
info.command "plugins" do |plugins|
|
34
34
|
# Implement the #action as a block. It accepts three parameters: the
|
35
35
|
# global options hash, the local command options hash, and any arguments
|
36
36
|
# passed on the command-line.
|
@@ -40,16 +40,16 @@ that just provide commands are not reported as plugins.
|
|
40
40
|
plugins.action do |_global, _options, _args|
|
41
41
|
plugs = cartage.plugins.enabled
|
42
42
|
if plugs.empty?
|
43
|
-
puts
|
43
|
+
puts "No active plug-ins."
|
44
44
|
else
|
45
45
|
plugs.map! do |plug|
|
46
46
|
"* #{plug.plugin_name} (#{plug.version})"
|
47
47
|
end
|
48
|
-
puts
|
49
|
-
Active Plug-ins:
|
50
|
-
|
51
|
-
#{plugs.sort.join("\n")}
|
52
|
-
|
48
|
+
puts <<~PLUGINS
|
49
|
+
Active Plug-ins:
|
50
|
+
|
51
|
+
#{plugs.sort.join("\n")}
|
52
|
+
PLUGINS
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
@@ -1,74 +1,74 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Cartage::CLI.extend do
|
4
|
-
desc
|
5
|
-
long_desc
|
6
|
-
Commands that manage the Cartage manifest (Manifest.txt) and ignore
|
7
|
-
(.cartignore) files for a project.
|
4
|
+
desc "Work with the Manifest.txt file"
|
5
|
+
long_desc <<~'DESC'
|
6
|
+
Commands that manage the Cartage manifest (Manifest.txt) and ignore
|
7
|
+
(.cartignore) files for a project.
|
8
8
|
DESC
|
9
|
-
command
|
10
|
-
manifest.desc
|
11
|
-
manifest.long_desc
|
12
|
-
Compares the current Cartage manifest against what would be calculated. If
|
13
|
-
there is a difference, it will be displayed in unified ('diff -u') format and a
|
14
|
-
non-zero exit status will be returned.
|
15
|
-
|
16
|
-
The diff output can be suppressed by specifying -q on cartage:
|
17
|
-
|
18
|
-
|
9
|
+
command "manifest" do |manifest|
|
10
|
+
manifest.desc "Check the Manifest.txt file against the current repository"
|
11
|
+
manifest.long_desc <<~'DESC'
|
12
|
+
Compares the current Cartage manifest against what would be calculated. If
|
13
|
+
there is a difference, it will be displayed in unified ('diff -u') format and a
|
14
|
+
non-zero exit status will be returned.
|
15
|
+
|
16
|
+
The diff output can be suppressed by specifying -q on cartage:
|
17
|
+
|
18
|
+
cartage -q manifest check
|
19
19
|
DESC
|
20
|
-
manifest.command
|
20
|
+
manifest.command "check" do |check|
|
21
21
|
check.action do |_global, _options, _args|
|
22
22
|
cartage.manifest.check or
|
23
23
|
fail Cartage::CLI::QuietExit, $?.exitstatus
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
manifest.desc
|
28
|
-
manifest.long_desc
|
29
|
-
Creates, replaces, or updates the Cartage ignore file (.cartignore). Will not
|
30
|
-
modify an existing .cartignore unless the --mode is overwrite or merge.
|
27
|
+
manifest.desc "Install or update the .cartignore file"
|
28
|
+
manifest.long_desc <<~'DESC'
|
29
|
+
Creates, replaces, or updates the Cartage ignore file (.cartignore). Will not
|
30
|
+
modify an existing .cartignore unless the --mode is overwrite or merge.
|
31
31
|
DESC
|
32
|
-
manifest.command
|
33
|
-
cartignore.desc
|
34
|
-
cartignore.long_desc
|
35
|
-
Sets the mode for updating the ignore file. When --mode overwrite, the ignore
|
36
|
-
file will be replaced with the default ignore file contents. When --mode merge,
|
37
|
-
the existing ignore file will be merged with the default ignore file contents.
|
32
|
+
manifest.command "cartignore" do |cartignore|
|
33
|
+
cartignore.desc "Overwrite or merge an existing .cartignore"
|
34
|
+
cartignore.long_desc <<~'DESC'
|
35
|
+
Sets the mode for updating the ignore file. When --mode overwrite, the ignore
|
36
|
+
file will be replaced with the default ignore file contents. When --mode merge,
|
37
|
+
the existing ignore file will be merged with the default ignore file contents.
|
38
38
|
DESC
|
39
|
-
cartignore.flag :mode, must_match: %w
|
39
|
+
cartignore.flag :mode, must_match: %w[overwrite merge], arg_name: :MODE
|
40
40
|
|
41
|
-
cartignore.desc
|
42
|
-
cartignore.switch %i
|
41
|
+
cartignore.desc "Overwrite an existing .cartignore (--mode overwrite)"
|
42
|
+
cartignore.switch %i[f force overwrite], negatable: false
|
43
43
|
|
44
|
-
cartignore.desc
|
45
|
-
cartignore.switch %i
|
44
|
+
cartignore.desc "Merge an existing .cartignore (--mode merge)"
|
45
|
+
cartignore.switch %i[m merge], negatable: false
|
46
46
|
|
47
47
|
cartignore.action do |_global, options, _args|
|
48
|
-
message = if options[
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
message = if options["merge"] && options["force"]
|
49
|
+
"Cannot mix options --force and --merge"
|
50
|
+
elsif options["merge"] && options["mode"] == "overwrite"
|
51
|
+
"Cannot mix option --merge and --mode overwrite"
|
52
|
+
elsif options["force"] && options["mode"] == "merge"
|
53
|
+
"Cannot mix option --force and --mode merge"
|
54
|
+
end
|
55
55
|
|
56
56
|
if message
|
57
57
|
fail Cartage::CLI::CommandException.new(message, cartignore.name_for_help, 64)
|
58
58
|
end
|
59
59
|
|
60
|
-
mode = if options[
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
mode = if options["merge"] || options["mode"] == "merge"
|
61
|
+
"merge"
|
62
|
+
elsif options["force"] || options["mode"] == "overwrite"
|
63
|
+
"overwrite"
|
64
|
+
end
|
65
65
|
|
66
66
|
cartage.manifest.install_default_ignore(mode: mode)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
manifest.desc
|
71
|
-
manifest.command
|
70
|
+
manifest.desc "Show the files that will be included in the package"
|
71
|
+
manifest.command "show" do |show|
|
72
72
|
show.action do |_global, _options, _args|
|
73
73
|
cartage.manifest.resolve do |tmpfile|
|
74
74
|
puts Pathname(tmpfile).read
|
@@ -76,8 +76,8 @@ the existing ignore file will be merged with the default ignore file contents.
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
manifest.desc
|
80
|
-
manifest.command %w
|
79
|
+
manifest.desc "Generate or update the Manifest.txt file"
|
80
|
+
manifest.command %w[generate update] do |generate|
|
81
81
|
generate.action do |_global, _options, _args|
|
82
82
|
cartage.manifest.generate
|
83
83
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Cartage::CLI.extend do
|
4
|
-
desc
|
5
|
-
command %w
|
4
|
+
desc "Create a release_metadata.json file in the current directory."
|
5
|
+
command %w[metadata] do |metadata|
|
6
6
|
metadata.action do |_global, _options, _args|
|
7
7
|
cartage.save_release_metadata(local: true)
|
8
8
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Cartage::CLI.extend do
|
4
|
-
desc
|
5
|
-
command %w
|
6
|
-
pack.desc
|
7
|
-
pack.switch
|
4
|
+
desc "Create a package with Cartage based on the Manifest."
|
5
|
+
command %w[pack build] do |pack|
|
6
|
+
pack.desc "Do not check the status of the Manifest file before packaging."
|
7
|
+
pack.switch "skip-check", negatable: false
|
8
8
|
|
9
9
|
pack.action do |_global, options, _args|
|
10
|
-
unless options[
|
10
|
+
unless options["skip-check"] || cartage.manifest.check
|
11
11
|
puts
|
12
|
-
fail Cartage::CLI::CustomExit.new
|
12
|
+
fail Cartage::CLI::CustomExit.new "Manifest.txt is not up-to-date.",
|
13
13
|
$?.exitstatus
|
14
14
|
end
|
15
15
|
cartage.build_package
|
data/lib/cartage/config.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
begin
|
4
|
-
require
|
4
|
+
require "psych"
|
5
5
|
rescue LoadError
|
6
6
|
nil # This has been intentionally suppressed.
|
7
7
|
end
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
8
|
+
require "ostruct"
|
9
|
+
require "pathname"
|
10
|
+
require "erb"
|
11
|
+
require "yaml"
|
12
12
|
|
13
13
|
class Cartage
|
14
14
|
# The Cartage configuration structure. The supported Cartage-wide
|
@@ -80,13 +80,15 @@ class Cartage
|
|
80
80
|
# The contents of the configuration file are evaluated through ERB and then
|
81
81
|
# parsed from YAML and converted to nested OpenStruct objects.
|
82
82
|
class Config < OpenStruct
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
83
|
+
# :stopdoc:
|
84
|
+
unless defined?(DEFAULT_CONFIG_FILES)
|
85
|
+
DEFAULT_CONFIG_FILES = %w[
|
86
|
+
./config/cartage.yml
|
87
|
+
./cartage.yml
|
88
|
+
./.cartage.yml
|
89
|
+
].each(&:freeze).freeze
|
90
|
+
end
|
91
|
+
# :startdoc:
|
90
92
|
|
91
93
|
class << self
|
92
94
|
# Load a Cartage configuration file as specified by +filename+. If
|
@@ -94,7 +96,7 @@ class Cartage
|
|
94
96
|
# configuration files will be located.
|
95
97
|
def load(filename)
|
96
98
|
config_file = resolve_config_file(filename)
|
97
|
-
config = ::YAML.
|
99
|
+
config = ::YAML.unsafe_load(ERB.new(config_file.read, trim_mode: "%-").result)
|
98
100
|
new(config)
|
99
101
|
end
|
100
102
|
|
@@ -112,10 +114,10 @@ class Cartage
|
|
112
114
|
filename = nil if filename == :default
|
113
115
|
|
114
116
|
files = if filename
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
117
|
+
[filename]
|
118
|
+
else
|
119
|
+
DEFAULT_CONFIG_FILES
|
120
|
+
end
|
119
121
|
|
120
122
|
file = files.find { |f| Pathname(f).expand_path.exist? }
|
121
123
|
|
@@ -124,7 +126,7 @@ class Cartage
|
|
124
126
|
elsif filename
|
125
127
|
fail ArgumentError, "Configuration file #{filename} does not exist."
|
126
128
|
else
|
127
|
-
StringIO.new(
|
129
|
+
StringIO.new("{}")
|
128
130
|
end
|
129
131
|
end
|
130
132
|
|
@@ -168,13 +170,13 @@ class Cartage
|
|
168
170
|
{}.tap { |h|
|
169
171
|
object.each_pair { |k, v|
|
170
172
|
k = case convert_keys
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
173
|
+
when :to_s
|
174
|
+
k.to_s
|
175
|
+
when :to_sym
|
176
|
+
k.to_sym
|
177
|
+
else
|
178
|
+
k
|
179
|
+
end
|
178
180
|
h[k.to_s] = hashify(v)
|
179
181
|
}
|
180
182
|
}
|