berkshelf 2.0.18 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby-version +1 -1
- data/.travis.yml +4 -1
- data/CHANGELOG.md +2 -26
- data/Gemfile +12 -2
- data/README.md +9 -1
- data/berkshelf.gemspec +9 -18
- data/bin/berks +3 -13
- data/features/apply_command.feature +11 -9
- data/features/berksfile.feature +8 -10
- data/features/config.feature +1 -2
- data/features/configure_command.feature +13 -14
- data/features/contingent_command.feature +13 -1
- data/features/cookbook_command.feature +2 -4
- data/features/groups_install.feature +10 -2
- data/features/help.feature +1 -1
- data/features/init_command.feature +5 -7
- data/features/install_command.feature +157 -228
- data/features/json_formatter.feature +27 -15
- data/features/licenses.feature +18 -12
- data/features/list_command.feature +6 -1
- data/features/lockfile.feature +116 -72
- data/features/outdated_command.feature +3 -47
- data/features/package_command.feature +10 -7
- data/features/shelf/show.feature +2 -2
- data/features/shelf/uninstall.feature +2 -2
- data/features/show_command.feature +10 -3
- data/features/step_definitions/chef/config_steps.rb +12 -0
- data/features/step_definitions/chef_server_steps.rb +16 -16
- data/features/step_definitions/cli_steps.rb +3 -79
- data/features/step_definitions/config_steps.rb +43 -0
- data/features/step_definitions/environment_steps.rb +7 -0
- data/features/step_definitions/filesystem_steps.rb +12 -57
- data/features/step_definitions/gem_steps.rb +1 -2
- data/features/step_definitions/json_steps.rb +3 -1
- data/features/step_definitions/lockfile_steps.rb +4 -0
- data/features/step_definitions/utility_steps.rb +0 -19
- data/features/support/aruba.rb +12 -0
- data/features/support/env.rb +52 -57
- data/features/update_command.feature +37 -23
- data/features/upload_command.feature +96 -160
- data/generator_files/Berksfile.erb +2 -1
- data/generator_files/Vagrantfile.erb +3 -0
- data/generator_files/default_test.rb.erb +1 -1
- data/generator_files/helpers.rb.erb +1 -1
- data/lib/berkshelf.rb +43 -24
- data/lib/berkshelf/api_client.rb +67 -0
- data/lib/berkshelf/api_client/remote_cookbook.rb +42 -0
- data/lib/berkshelf/berksfile.rb +232 -420
- data/lib/berkshelf/cached_cookbook.rb +22 -10
- data/lib/berkshelf/chef/config.rb +1 -0
- data/lib/berkshelf/cli.rb +66 -68
- data/lib/berkshelf/commands/shelf.rb +1 -1
- data/lib/berkshelf/community_rest.rb +10 -17
- data/lib/berkshelf/config.rb +23 -27
- data/lib/berkshelf/cookbook_generator.rb +3 -4
- data/lib/berkshelf/cookbook_store.rb +74 -17
- data/lib/berkshelf/core_ext/file.rb +2 -2
- data/lib/berkshelf/core_ext/pathname.rb +7 -5
- data/lib/berkshelf/{cookbook_source.rb → dependency.rb} +47 -67
- data/lib/berkshelf/downloader.rb +49 -106
- data/lib/berkshelf/errors.rb +64 -71
- data/lib/berkshelf/formatters.rb +11 -9
- data/lib/berkshelf/formatters/human_readable.rb +9 -9
- data/lib/berkshelf/formatters/json.rb +14 -4
- data/lib/berkshelf/init_generator.rb +3 -3
- data/lib/berkshelf/installer.rb +136 -0
- data/lib/berkshelf/location.rb +91 -131
- data/lib/berkshelf/locations/git_location.rb +9 -11
- data/lib/berkshelf/locations/github_location.rb +1 -1
- data/lib/berkshelf/locations/path_location.rb +10 -27
- data/lib/berkshelf/lockfile.rb +92 -70
- data/lib/berkshelf/logger.rb +4 -7
- data/lib/berkshelf/mixin/config.rb +21 -4
- data/lib/berkshelf/resolver.rb +60 -150
- data/lib/berkshelf/resolver/graph.rb +44 -0
- data/lib/berkshelf/source.rb +55 -0
- data/lib/berkshelf/source_uri.rb +38 -0
- data/lib/berkshelf/version.rb +1 -1
- data/spec/config/knife.rb +1 -1
- data/spec/fixtures/cassettes/Berkshelf_Resolver/_initialize/adds_the_dependencies_of_the_dependency_as_dependencies.yml +3694 -0
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile.lock +1 -1
- data/spec/fixtures/lockfiles/default.lock +1 -1
- data/spec/spec_helper.rb +20 -121
- data/spec/support/chef_api.rb +3 -4
- data/spec/support/chef_server.rb +20 -11
- data/spec/support/git.rb +127 -0
- data/spec/support/kitchen.rb +12 -0
- data/spec/support/path_helpers.rb +69 -0
- data/spec/unit/berkshelf/api_client/remote_cookbook_spec.rb +23 -0
- data/spec/unit/berkshelf/api_client_spec.rb +57 -0
- data/spec/unit/berkshelf/berksfile_spec.rb +206 -324
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +73 -38
- data/spec/unit/berkshelf/community_rest_spec.rb +30 -71
- data/spec/unit/berkshelf/config_spec.rb +3 -14
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +1 -2
- data/spec/unit/berkshelf/cookbook_store_spec.rb +12 -7
- data/spec/unit/berkshelf/dependency_spec.rb +285 -0
- data/spec/unit/berkshelf/downloader_spec.rb +4 -183
- data/spec/unit/berkshelf/formatters/null_spec.rb +1 -1
- data/spec/unit/berkshelf/formatters_spec.rb +4 -2
- data/spec/unit/berkshelf/git_spec.rb +15 -15
- data/spec/unit/berkshelf/installer_spec.rb +39 -0
- data/spec/unit/berkshelf/location_spec.rb +87 -114
- data/spec/unit/berkshelf/locations/git_location_spec.rb +41 -53
- data/spec/unit/berkshelf/locations/path_location_spec.rb +13 -23
- data/spec/unit/berkshelf/lockfile_spec.rb +38 -40
- data/spec/unit/berkshelf/resolver/graph_spec.rb +44 -0
- data/spec/unit/berkshelf/resolver_spec.rb +34 -83
- data/spec/unit/berkshelf/source_spec.rb +23 -0
- data/spec/unit/berkshelf/source_uri_spec.rb +29 -0
- metadata +149 -188
- checksums.yaml +0 -7
- data/features/default_locations.feature +0 -127
- data/features/step_definitions/berksfile_steps.rb +0 -8
- data/features/step_definitions/configure_cli_steps.rb +0 -19
- data/features/vendor_install.feature +0 -19
- data/lib/berkshelf/core_ext/openuri.rb +0 -36
- data/lib/berkshelf/core_ext/rbzip2.rb +0 -8
- data/lib/berkshelf/locations/chef_api_location.rb +0 -228
- data/lib/berkshelf/locations/site_location.rb +0 -92
- data/lib/berkshelf/test.rb +0 -35
- data/spec/knife.rb.sample +0 -12
- data/spec/support/test_generators.rb +0 -27
- data/spec/unit/berkshelf/cli_spec.rb +0 -16
- data/spec/unit/berkshelf/cookbook_source_spec.rb +0 -358
- data/spec/unit/berkshelf/core_ext/pathname_spec.rb +0 -46
- data/spec/unit/berkshelf/locations/chef_api_location_spec.rb +0 -139
- data/spec/unit/berkshelf/locations/site_location_spec.rb +0 -19
@@ -1,7 +1,5 @@
|
|
1
1
|
module Berkshelf
|
2
2
|
class CachedCookbook < Ridley::Chef::Cookbook
|
3
|
-
@loaded = Hash.new
|
4
|
-
|
5
3
|
class << self
|
6
4
|
# @param [#to_s] path
|
7
5
|
# a path on disk to the location of a Cookbook downloaded by the Downloader
|
@@ -14,12 +12,20 @@ module Berkshelf
|
|
14
12
|
cached_name = File.basename(path.to_s).slice(DIRNAME_REGEXP, 1)
|
15
13
|
return nil if cached_name.nil?
|
16
14
|
|
17
|
-
|
15
|
+
from_path(path, name: cached_name)
|
18
16
|
end
|
19
17
|
end
|
20
18
|
|
21
19
|
DIRNAME_REGEXP = /^(.+)-(.+)$/
|
22
20
|
|
21
|
+
extend Forwardable
|
22
|
+
|
23
|
+
def_delegator :metadata, :description
|
24
|
+
def_delegator :metadata, :maintainer
|
25
|
+
def_delegator :metadata, :maintainer_email
|
26
|
+
def_delegator :metadata, :license
|
27
|
+
def_delegator :metadata, :platforms
|
28
|
+
|
23
29
|
# @return [Hash]
|
24
30
|
def dependencies
|
25
31
|
metadata.recommendations.merge(metadata.dependencies)
|
@@ -38,19 +44,25 @@ module Berkshelf
|
|
38
44
|
end.join("\n")
|
39
45
|
end
|
40
46
|
|
47
|
+
# High-level information about this cached cookbook in JSON format
|
48
|
+
#
|
49
|
+
# @return [String]
|
41
50
|
def pretty_json
|
42
|
-
pretty_hash
|
51
|
+
JSON.pretty_generate(pretty_hash)
|
43
52
|
end
|
44
53
|
|
54
|
+
# High-level information about this cached cookbook in Hash format
|
55
|
+
#
|
56
|
+
# @return [Hash]
|
45
57
|
def pretty_hash
|
46
58
|
{}.tap do |h|
|
47
|
-
h[:name] = cookbook_name unless
|
59
|
+
h[:name] = cookbook_name unless cookbook_name.blank?
|
48
60
|
h[:version] = version unless version.blank?
|
49
|
-
h[:description] =
|
50
|
-
h[:author] =
|
51
|
-
h[:email] =
|
52
|
-
h[:license] =
|
53
|
-
h[:platforms] =
|
61
|
+
h[:description] = description unless description.blank?
|
62
|
+
h[:author] = maintainer unless maintainer.blank?
|
63
|
+
h[:email] = maintainer_email unless maintainer_email.blank?
|
64
|
+
h[:license] = license unless license.blank?
|
65
|
+
h[:platforms] = platforms.to_hash unless platforms.blank?
|
54
66
|
h[:dependencies] = dependencies.to_hash unless dependencies.blank?
|
55
67
|
end
|
56
68
|
end
|
data/lib/berkshelf/cli.rb
CHANGED
@@ -7,6 +7,37 @@ require_relative 'commands/test_command'
|
|
7
7
|
|
8
8
|
module Berkshelf
|
9
9
|
class Cli < Thor
|
10
|
+
# This is the main entry point for the CLI. It exposes the method {#execute!} to
|
11
|
+
# start the CLI.
|
12
|
+
#
|
13
|
+
# @note the arity of {#initialize} and {#execute!} are extremely important for testing purposes. It
|
14
|
+
# is a requirement to perform in-process testing with Aruba. In process testing is much faster
|
15
|
+
# than spawning a new Ruby process for each test.
|
16
|
+
class Runner
|
17
|
+
def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
|
18
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
19
|
+
end
|
20
|
+
|
21
|
+
def execute!
|
22
|
+
begin
|
23
|
+
$stdin = @stdin
|
24
|
+
$stdout = @stdout
|
25
|
+
$stderr = @stderr
|
26
|
+
|
27
|
+
Berkshelf::Cli.start(@argv)
|
28
|
+
@kernel.exit(0)
|
29
|
+
rescue Berkshelf::BerkshelfError => e
|
30
|
+
Berkshelf.ui.error e
|
31
|
+
Berkshelf.ui.error "\t" + e.backtrace.join("\n\t") if ENV['BERKSHELF_DEBUG']
|
32
|
+
@kernel.exit(e.status_code)
|
33
|
+
rescue Ridley::Errors::RidleyError => e
|
34
|
+
Berkshelf.ui.error "#{e.class} #{e}"
|
35
|
+
Berkshelf.ui.error "\t" + e.backtrace.join("\n\t") if ENV['BERKSHELF_DEBUG']
|
36
|
+
@kernel.exit(47)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
10
41
|
class << self
|
11
42
|
def dispatch(meth, given_args, given_opts, config)
|
12
43
|
unless (given_args & ['-h', '--help']).empty?
|
@@ -31,7 +62,8 @@ module Berkshelf
|
|
31
62
|
unless File.exist?(@options[:config])
|
32
63
|
raise ConfigNotFound.new(:berkshelf, @options[:config])
|
33
64
|
end
|
34
|
-
|
65
|
+
|
66
|
+
Berkshelf.config = Berkshelf::Config.from_file(@options[:config])
|
35
67
|
end
|
36
68
|
|
37
69
|
if @options[:debug]
|
@@ -85,7 +117,7 @@ module Berkshelf
|
|
85
117
|
desc: 'create a new configuration file even if one already exists.'
|
86
118
|
method_option :path,
|
87
119
|
type: :string,
|
88
|
-
default: Berkshelf
|
120
|
+
default: Berkshelf.config.path,
|
89
121
|
desc: 'The path to save the configuration file'
|
90
122
|
desc 'configure', 'Create a new Berkshelf configuration file'
|
91
123
|
def configure
|
@@ -95,7 +127,7 @@ module Berkshelf
|
|
95
127
|
raise Berkshelf::ConfigExists, 'A configuration file already exists. Re-run with the --force flag if you wish to overwrite it.'
|
96
128
|
end
|
97
129
|
|
98
|
-
|
130
|
+
config = Berkshelf::Config.new(path)
|
99
131
|
|
100
132
|
[
|
101
133
|
'chef.chef_server_url',
|
@@ -106,7 +138,7 @@ module Berkshelf
|
|
106
138
|
'vagrant.vm.box',
|
107
139
|
'vagrant.vm.box_url',
|
108
140
|
].each do |attribute|
|
109
|
-
default =
|
141
|
+
default = config.get_attribute(attribute)
|
110
142
|
|
111
143
|
message = "Enter value for #{attribute}"
|
112
144
|
message << " (default: '#{default}')" if default
|
@@ -115,15 +147,16 @@ module Berkshelf
|
|
115
147
|
input = Berkshelf.ui.ask(message)
|
116
148
|
|
117
149
|
if input.present?
|
118
|
-
|
150
|
+
config.set_attribute(attribute, input)
|
119
151
|
end
|
120
152
|
end
|
121
153
|
|
122
|
-
unless
|
123
|
-
raise InvalidConfiguration.new(
|
154
|
+
unless config.valid?
|
155
|
+
raise InvalidConfiguration.new(config.errors)
|
124
156
|
end
|
125
157
|
|
126
|
-
|
158
|
+
config.save
|
159
|
+
Berkshelf.config = config
|
127
160
|
|
128
161
|
Berkshelf.formatter.msg "Config written to: '#{path}'"
|
129
162
|
end
|
@@ -155,7 +188,7 @@ module Berkshelf
|
|
155
188
|
|
156
189
|
method_option :berksfile,
|
157
190
|
type: :string,
|
158
|
-
default:
|
191
|
+
default: Berkshelf::DEFAULT_FILENAME,
|
159
192
|
desc: 'Path to a Berksfile to operate off of.',
|
160
193
|
aliases: '-b',
|
161
194
|
banner: 'PATH'
|
@@ -180,7 +213,7 @@ module Berkshelf
|
|
180
213
|
|
181
214
|
method_option :berksfile,
|
182
215
|
type: :string,
|
183
|
-
default:
|
216
|
+
default: Berkshelf::DEFAULT_FILENAME,
|
184
217
|
desc: 'Path to a Berksfile to operate off of.',
|
185
218
|
aliases: '-b',
|
186
219
|
banner: 'PATH'
|
@@ -209,11 +242,6 @@ module Berkshelf
|
|
209
242
|
default: false,
|
210
243
|
desc: 'Skip Ruby syntax check when uploading cookbooks.',
|
211
244
|
aliases: '-s'
|
212
|
-
method_option :skip_dependencies,
|
213
|
-
type: :boolean,
|
214
|
-
desc: 'Skip uploading dependent cookbook(s).',
|
215
|
-
default: false,
|
216
|
-
aliases: '-D'
|
217
245
|
method_option :halt_on_frozen,
|
218
246
|
type: :boolean,
|
219
247
|
default: false,
|
@@ -225,14 +253,13 @@ module Berkshelf
|
|
225
253
|
upload_options = Hash[options.except(:no_freeze, :berksfile)].symbolize_keys
|
226
254
|
upload_options[:cookbooks] = cookbook_names
|
227
255
|
upload_options[:freeze] = false if options[:no_freeze]
|
228
|
-
upload_options[:validate] = false if options[:skip_syntax_check]
|
229
256
|
|
230
257
|
berksfile.upload(upload_options)
|
231
258
|
end
|
232
259
|
|
233
260
|
method_option :berksfile,
|
234
261
|
type: :string,
|
235
|
-
default:
|
262
|
+
default: Berkshelf::DEFAULT_FILENAME,
|
236
263
|
desc: 'Path to a Berksfile to operate off of.',
|
237
264
|
aliases: '-b',
|
238
265
|
banner: 'PATH'
|
@@ -240,11 +267,6 @@ module Berkshelf
|
|
240
267
|
type: :boolean,
|
241
268
|
default: nil,
|
242
269
|
desc: 'Disable/Enable SSL verification when locking cookbooks.'
|
243
|
-
method_option :from_file,
|
244
|
-
type: :string,
|
245
|
-
desc: 'overwrite environment attributes when using apply using local environment file',
|
246
|
-
aliases: '-f',
|
247
|
-
banner: 'PATH'
|
248
270
|
desc 'apply ENVIRONMENT', 'Apply the cookbook version locks from Berksfile.lock to a Chef environment'
|
249
271
|
def apply(environment_name)
|
250
272
|
berksfile = ::Berkshelf::Berksfile.from_file(options[:berksfile])
|
@@ -255,7 +277,7 @@ module Berkshelf
|
|
255
277
|
|
256
278
|
method_option :berksfile,
|
257
279
|
type: :string,
|
258
|
-
default:
|
280
|
+
default: Berkshelf::DEFAULT_FILENAME,
|
259
281
|
desc: 'Path to a Berksfile to operate off of.',
|
260
282
|
aliases: '-b',
|
261
283
|
banner: 'PATH'
|
@@ -267,36 +289,22 @@ module Berkshelf
|
|
267
289
|
type: :array,
|
268
290
|
desc: 'Only cookbooks that are in these groups.',
|
269
291
|
aliases: '-o'
|
270
|
-
desc 'outdated [COOKBOOKS]', '
|
292
|
+
desc 'outdated [COOKBOOKS]', 'List dependencies that have new versions available that satisfy their constraints'
|
271
293
|
def outdated(*cookbook_names)
|
272
|
-
berksfile =
|
294
|
+
berksfile = Berkshelf::Berksfile.from_file(options[:berksfile])
|
273
295
|
Berkshelf.formatter.msg 'Listing outdated cookbooks with newer versions available...'
|
274
|
-
Berkshelf.formatter.msg 'BETA: this feature will only pull differences from the community site and will'
|
275
|
-
Berkshelf.formatter.msg 'BETA: ignore all other sources you may have defined'
|
276
|
-
Berkshelf.formatter.msg ''
|
277
|
-
|
278
|
-
outdated_options = {
|
279
|
-
cookbooks: cookbook_names
|
280
|
-
}.merge(options).symbolize_keys
|
281
|
-
|
282
|
-
outdated = berksfile.outdated(outdated_options)
|
283
296
|
|
284
|
-
|
285
|
-
|
286
|
-
else
|
287
|
-
outdated.each do |cookbook, latest_version|
|
288
|
-
Berkshelf.formatter.msg "Cookbook '#{cookbook.name} (#{cookbook.version_constraint})' is outdated (#{latest_version})"
|
289
|
-
end
|
290
|
-
end
|
297
|
+
outdated_options = { cookbooks: cookbook_names }.merge(options).symbolize_keys
|
298
|
+
berksfile.outdated(outdated_options)
|
291
299
|
end
|
292
300
|
|
293
301
|
desc 'init [PATH]', 'Initialize Berkshelf in the given directory'
|
294
|
-
def init(path =
|
302
|
+
def init(path = '.')
|
295
303
|
Berkshelf.formatter.deprecation '--git is now the default' if options[:git]
|
296
304
|
Berkshelf.formatter.deprecation '--vagrant is now the default' if options[:vagrant]
|
297
305
|
|
298
306
|
if File.chef_cookbook?(path)
|
299
|
-
options[:chefignore]
|
307
|
+
options[:chefignore] = true
|
300
308
|
options[:metadata_entry] = true
|
301
309
|
end
|
302
310
|
|
@@ -311,16 +319,16 @@ module Berkshelf
|
|
311
319
|
desc: 'Path to a Berksfile to operate off of.',
|
312
320
|
aliases: '-b',
|
313
321
|
banner: 'PATH'
|
314
|
-
desc 'list', 'List all cookbooks
|
322
|
+
desc 'list', 'List all cookbooks and their dependencies specified by your Berksfile'
|
315
323
|
def list
|
316
|
-
berksfile
|
317
|
-
|
324
|
+
berksfile = Berksfile.from_file(options[:berksfile])
|
325
|
+
dependencies = Berkshelf.ui.mute { berksfile.install }.sort
|
318
326
|
|
319
|
-
if
|
327
|
+
if dependencies.empty?
|
320
328
|
Berkshelf.formatter.msg 'There are no cookbooks installed by your Berksfile'
|
321
329
|
else
|
322
330
|
Berkshelf.formatter.msg 'Cookbooks installed by your Berksfile:'
|
323
|
-
print_list(
|
331
|
+
print_list(dependencies)
|
324
332
|
end
|
325
333
|
end
|
326
334
|
|
@@ -333,12 +341,11 @@ module Berkshelf
|
|
333
341
|
desc "show [COOKBOOK]", "Display name, author, copyright, and dependency information about a cookbook"
|
334
342
|
def show(name)
|
335
343
|
berksfile = Berksfile.from_file(options[:berksfile])
|
344
|
+
cookbook = Berkshelf.ui.mute { berksfile.install(cookbooks: name) }.first
|
336
345
|
|
337
|
-
cookbook
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
raise CookbookNotFound, "Cookbook '#{name}' is not installed by your Berksfile" unless cookbook
|
346
|
+
unless cookbook
|
347
|
+
raise CookbookNotFound, "Cookbook '#{name}' is not installed by your Berksfile"
|
348
|
+
end
|
342
349
|
|
343
350
|
Berkshelf.formatter.show(cookbook)
|
344
351
|
end
|
@@ -351,10 +358,9 @@ module Berkshelf
|
|
351
358
|
banner: 'PATH'
|
352
359
|
desc 'contingent COOKBOOK', 'List all cookbooks that depend on the given cookbook'
|
353
360
|
def contingent(name)
|
354
|
-
berksfile
|
355
|
-
|
356
|
-
|
357
|
-
dependencies = sources.select { |cookbook| cookbook.dependencies.include?(name) }
|
361
|
+
berksfile = Berksfile.from_file(options[:berksfile])
|
362
|
+
dependencies = Berkshelf.ui.mute { berksfile.install }.sort
|
363
|
+
dependencies = dependencies.select { |cookbook| cookbook.dependencies.include?(name) }
|
358
364
|
|
359
365
|
if dependencies.empty?
|
360
366
|
Berkshelf.formatter.msg "There are no cookbooks contingent upon '#{name}' defined in this Berksfile"
|
@@ -366,25 +372,21 @@ module Berkshelf
|
|
366
372
|
|
367
373
|
method_option :berksfile,
|
368
374
|
type: :string,
|
369
|
-
default:
|
375
|
+
default: Berkshelf::DEFAULT_FILENAME,
|
370
376
|
desc: 'Path to a Berksfile to operate off of.',
|
371
377
|
aliases: '-b',
|
372
378
|
banner: 'PATH'
|
373
379
|
method_option :output,
|
374
380
|
type: :string,
|
375
|
-
default:
|
381
|
+
default: '.',
|
376
382
|
desc: 'Path to output the tarball',
|
377
383
|
aliases: '-o',
|
378
384
|
banner: 'PATH'
|
379
|
-
method_option :skip_dependencies,
|
380
|
-
type: :boolean,
|
381
|
-
desc: 'Skip packaging dependent cookbook(s).',
|
382
|
-
default: false
|
383
385
|
method_option :ignore_chefignore,
|
384
386
|
type: :boolean,
|
385
387
|
desc: 'Do not apply the chefignore to the packaged contents',
|
386
388
|
default: false
|
387
|
-
desc
|
389
|
+
desc "package [COOKBOOK]", "Package a cookbook and it's dependencies as a tarball"
|
388
390
|
def package(name = nil)
|
389
391
|
berksfile = Berkshelf::Berksfile.from_file(options[:berksfile])
|
390
392
|
berksfile.package(name, options)
|
@@ -402,10 +404,6 @@ module Berkshelf
|
|
402
404
|
Berkshelf.formatter.deprecation '--git is now the default' if options[:git]
|
403
405
|
Berkshelf.formatter.deprecation '--vagrant is now the default' if options[:vagrant]
|
404
406
|
|
405
|
-
unless Config.instance.valid?
|
406
|
-
raise InvalidConfiguration.new(Config.instance.errors)
|
407
|
-
end
|
408
|
-
|
409
407
|
::Berkshelf::CookbookGenerator.new([File.join(Dir.pwd, name), name], options).invoke_all
|
410
408
|
end
|
411
409
|
tasks['cookbook'].options = Berkshelf::CookbookGenerator.class_options
|
@@ -102,7 +102,7 @@ module Berkshelf
|
|
102
102
|
contingent = contingent.map { |c| "#{c.cookbook_name} (#{c.version})" }.join(', ')
|
103
103
|
confirm = Berkshelf.ui.ask("[#{contingent}] depend on #{cookbook.cookbook_name}.\n\nAre you sure you want to continue? (y/N)")
|
104
104
|
|
105
|
-
exit unless confirm.upcase[0] == 'Y'
|
105
|
+
exit unless confirm.to_s.upcase[0] == 'Y'
|
106
106
|
end
|
107
107
|
|
108
108
|
FileUtils.rm_rf(cookbook.path)
|
@@ -2,8 +2,6 @@ require 'open-uri'
|
|
2
2
|
require 'retryable'
|
3
3
|
require 'addressable/uri'
|
4
4
|
|
5
|
-
require_relative 'core_ext/openuri'
|
6
|
-
|
7
5
|
module Berkshelf
|
8
6
|
class CommunityREST < Faraday::Connection
|
9
7
|
class << self
|
@@ -18,8 +16,6 @@ module Berkshelf
|
|
18
16
|
Archive::Tar::Minitar.unpack(Zlib::GzipReader.new(File.open(target, 'rb')), destination)
|
19
17
|
elsif is_tar_file(target)
|
20
18
|
Archive::Tar::Minitar.unpack(target, destination)
|
21
|
-
elsif is_bzip2_file(target)
|
22
|
-
Archive::Tar::Minitar.unpack(RBzip2::Decompressor.new(File.open(target, 'rb')), destination)
|
23
19
|
else
|
24
20
|
raise Berkshelf::UnknownCompressionType.new(target)
|
25
21
|
end
|
@@ -41,6 +37,7 @@ module Berkshelf
|
|
41
37
|
end
|
42
38
|
|
43
39
|
private
|
40
|
+
|
44
41
|
def is_gzip_file(path)
|
45
42
|
# You cannot write "\x1F\x8B" because the default encoding of
|
46
43
|
# ruby >= 1.9.3 is UTF-8 and 8B is an invalid in UTF-8.
|
@@ -50,13 +47,9 @@ module Berkshelf
|
|
50
47
|
def is_tar_file(path)
|
51
48
|
IO.binread(path, 8, 257).to_s == "ustar\x0000"
|
52
49
|
end
|
53
|
-
|
54
|
-
def is_bzip2_file(path)
|
55
|
-
IO.binread(path, 3) == 'BZh'
|
56
|
-
end
|
57
50
|
end
|
58
51
|
|
59
|
-
V1_API = 'http://cookbooks.opscode.com/api/v1
|
52
|
+
V1_API = 'http://cookbooks.opscode.com/api/v1'.freeze
|
60
53
|
|
61
54
|
# @return [String]
|
62
55
|
attr_reader :api_uri
|
@@ -82,8 +75,7 @@ module Berkshelf
|
|
82
75
|
|
83
76
|
builder = Faraday::Builder.new do |b|
|
84
77
|
b.response :parse_json
|
85
|
-
b.response :
|
86
|
-
|
78
|
+
b.response :gzip
|
87
79
|
b.request :retry,
|
88
80
|
max: @retries,
|
89
81
|
interval: @retry_interval,
|
@@ -100,20 +92,21 @@ module Berkshelf
|
|
100
92
|
#
|
101
93
|
# @return [String]
|
102
94
|
def download(name, version)
|
103
|
-
archive
|
104
|
-
self.class.unpack(archive.path)
|
95
|
+
archive = stream(find(name, version)[:file])
|
96
|
+
extracted = self.class.unpack(archive.path)
|
97
|
+
Dir.glob(File.join(extracted, "*")).first
|
105
98
|
ensure
|
106
99
|
archive.unlink unless archive.nil?
|
107
100
|
end
|
108
101
|
|
109
102
|
def find(name, version)
|
110
|
-
response = get("
|
103
|
+
response = get("cookbooks/#{name}/versions/#{self.class.uri_escape_version(version)}")
|
111
104
|
|
112
105
|
case response.status
|
113
106
|
when (200..299)
|
114
107
|
response.body
|
115
108
|
when 404
|
116
|
-
raise CookbookNotFound, "Cookbook '#{name}' not found at site: '#{api_uri}'"
|
109
|
+
raise CookbookNotFound, "Cookbook '#{name}' (#{version}) not found at site: '#{api_uri}'"
|
117
110
|
else
|
118
111
|
raise CommunitySiteError, "Error finding cookbook '#{name}' (#{version}) at site: '#{api_uri}'"
|
119
112
|
end
|
@@ -123,7 +116,7 @@ module Berkshelf
|
|
123
116
|
#
|
124
117
|
# @return [String]
|
125
118
|
def latest_version(name)
|
126
|
-
response = get(name)
|
119
|
+
response = get("cookbooks/#{name}")
|
127
120
|
|
128
121
|
case response.status
|
129
122
|
when (200..299)
|
@@ -139,7 +132,7 @@ module Berkshelf
|
|
139
132
|
#
|
140
133
|
# @return [Array]
|
141
134
|
def versions(name)
|
142
|
-
response = get(name)
|
135
|
+
response = get("cookbooks/#{name}")
|
143
136
|
|
144
137
|
case response.status
|
145
138
|
when (200..299)
|