berkshelf 3.0.0.beta6 → 3.0.0.beta7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/berksfile.feature +2 -0
- data/features/commands/apply.feature +1 -1
- data/features/commands/contingent.feature +5 -3
- data/features/commands/install.feature +40 -40
- data/features/commands/list.feature +42 -20
- data/features/commands/outdated.feature +60 -16
- data/features/commands/show.feature +51 -8
- data/features/commands/update.feature +43 -15
- data/features/commands/upload.feature +4 -1
- data/features/commands/vendor.feature +27 -0
- data/features/json_formatter.feature +20 -8
- data/features/lockfile.feature +192 -71
- data/generator_files/CHANGELOG.md.erb +5 -0
- data/lib/berkshelf/berksfile.rb +166 -139
- data/lib/berkshelf/cli.rb +33 -30
- data/lib/berkshelf/cookbook_generator.rb +1 -0
- data/lib/berkshelf/dependency.rb +64 -14
- data/lib/berkshelf/downloader.rb +7 -10
- data/lib/berkshelf/errors.rb +59 -11
- data/lib/berkshelf/formatters/human_readable.rb +23 -36
- data/lib/berkshelf/formatters/json.rb +25 -29
- data/lib/berkshelf/installer.rb +111 -122
- data/lib/berkshelf/locations/git_location.rb +22 -9
- data/lib/berkshelf/locations/mercurial_location.rb +20 -5
- data/lib/berkshelf/locations/path_location.rb +22 -7
- data/lib/berkshelf/lockfile.rb +435 -203
- data/lib/berkshelf/resolver.rb +4 -2
- data/lib/berkshelf/source.rb +10 -1
- data/lib/berkshelf/version.rb +1 -1
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile.lock +3 -4
- data/spec/fixtures/lockfiles/2.0.lock +17 -0
- data/spec/fixtures/lockfiles/blank.lock +0 -0
- data/spec/fixtures/lockfiles/default.lock +18 -10
- data/spec/fixtures/lockfiles/empty.lock +3 -0
- data/spec/unit/berkshelf/berksfile_spec.rb +31 -74
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +4 -0
- data/spec/unit/berkshelf/installer_spec.rb +4 -7
- data/spec/unit/berkshelf/lockfile_parser_spec.rb +124 -0
- data/spec/unit/berkshelf/lockfile_spec.rb +140 -163
- metadata +11 -6
- data/features/licenses.feature +0 -79
- data/features/step_definitions/lockfile_steps.rb +0 -57
data/lib/berkshelf/cli.rb
CHANGED
@@ -139,8 +139,8 @@ module Berkshelf
|
|
139
139
|
exit(1)
|
140
140
|
end
|
141
141
|
|
142
|
-
berksfile =
|
143
|
-
berksfile.install
|
142
|
+
berksfile = Berksfile.from_options(options)
|
143
|
+
berksfile.install
|
144
144
|
end
|
145
145
|
|
146
146
|
method_option :berksfile,
|
@@ -159,13 +159,8 @@ module Berkshelf
|
|
159
159
|
aliases: '-o'
|
160
160
|
desc 'update [COOKBOOKS]', 'Update the cookbooks (and dependencies) specified in the Berksfile'
|
161
161
|
def update(*cookbook_names)
|
162
|
-
berksfile = Berksfile.
|
163
|
-
|
164
|
-
update_options = {
|
165
|
-
cookbooks: cookbook_names
|
166
|
-
}.merge(options).symbolize_keys
|
167
|
-
|
168
|
-
berksfile.update(update_options)
|
162
|
+
berksfile = Berksfile.from_options(options)
|
163
|
+
berksfile.update(*cookbook_names)
|
169
164
|
end
|
170
165
|
|
171
166
|
method_option :berksfile,
|
@@ -205,7 +200,7 @@ module Berkshelf
|
|
205
200
|
desc: 'Halt uploading and exit if the Chef Server has a frozen version of the cookbook(s).'
|
206
201
|
desc 'upload [COOKBOOKS]', 'Upload the cookbook specified in the Berksfile to the Chef Server'
|
207
202
|
def upload(*cookbook_names)
|
208
|
-
berksfile =
|
203
|
+
berksfile = Berksfile.from_options(options)
|
209
204
|
|
210
205
|
options[:cookbooks] = cookbook_names
|
211
206
|
options[:freeze] = !options[:no_freeze]
|
@@ -230,7 +225,7 @@ module Berkshelf
|
|
230
225
|
raise LockfileNotFound, "No lockfile found at #{options[:lockfile]}"
|
231
226
|
end
|
232
227
|
|
233
|
-
lockfile =
|
228
|
+
lockfile = Lockfile.from_file(options[:lockfile])
|
234
229
|
lock_options = Hash[options].symbolize_keys
|
235
230
|
|
236
231
|
lockfile.apply(environment_name, lock_options)
|
@@ -251,10 +246,9 @@ module Berkshelf
|
|
251
246
|
desc: 'Only cookbooks that are in these groups.',
|
252
247
|
aliases: '-o'
|
253
248
|
desc 'outdated [COOKBOOKS]', 'List dependencies that have new versions available that satisfy their constraints'
|
254
|
-
def outdated(*
|
255
|
-
berksfile =
|
256
|
-
|
257
|
-
outdated = berksfile.outdated(options.symbolize_keys)
|
249
|
+
def outdated(*names)
|
250
|
+
berksfile = Berksfile.from_options(options)
|
251
|
+
outdated = berksfile.outdated(*names)
|
258
252
|
|
259
253
|
if outdated.empty?
|
260
254
|
Berkshelf.formatter.msg "All cookbooks up to date!"
|
@@ -281,9 +275,17 @@ module Berkshelf
|
|
281
275
|
desc: 'Path to a Berksfile to operate off of.',
|
282
276
|
aliases: '-b',
|
283
277
|
banner: 'PATH'
|
284
|
-
|
278
|
+
method_option :except,
|
279
|
+
type: :array,
|
280
|
+
desc: 'Exclude cookbooks that are in these groups.',
|
281
|
+
aliases: '-e'
|
282
|
+
method_option :only,
|
283
|
+
type: :array,
|
284
|
+
desc: 'Only cookbooks that are in these groups.',
|
285
|
+
aliases: '-o'
|
286
|
+
desc 'list', 'List cookbooks and their dependencies specified by your Berksfile'
|
285
287
|
def list
|
286
|
-
berksfile = Berksfile.
|
288
|
+
berksfile = Berksfile.from_options(options)
|
287
289
|
Berkshelf.formatter.list(berksfile.list)
|
288
290
|
end
|
289
291
|
|
@@ -295,8 +297,8 @@ module Berkshelf
|
|
295
297
|
banner: "PATH"
|
296
298
|
desc "show [COOKBOOK]", "Display name, author, copyright, and dependency information about a cookbook"
|
297
299
|
def show(name)
|
298
|
-
berksfile = Berksfile.
|
299
|
-
cookbook
|
300
|
+
berksfile = Berksfile.from_options(options)
|
301
|
+
cookbook = berksfile.retrieve_locked(name)
|
300
302
|
Berkshelf.formatter.show(cookbook)
|
301
303
|
end
|
302
304
|
|
@@ -306,16 +308,17 @@ module Berkshelf
|
|
306
308
|
desc: 'Path to a Berksfile to operate off of.',
|
307
309
|
aliases: '-b',
|
308
310
|
banner: 'PATH'
|
309
|
-
desc 'contingent COOKBOOK', 'List all cookbooks that depend on the given cookbook'
|
311
|
+
desc 'contingent COOKBOOK', 'List all cookbooks that depend on the given cookbook in your Berksfile'
|
310
312
|
def contingent(name)
|
311
|
-
berksfile = Berksfile.
|
312
|
-
dependencies =
|
313
|
-
|
313
|
+
berksfile = Berksfile.from_options(options)
|
314
|
+
dependencies = berksfile.cookbooks.select do |cookbook|
|
315
|
+
cookbook.dependencies.include?(name)
|
316
|
+
end
|
314
317
|
|
315
318
|
if dependencies.empty?
|
316
|
-
Berkshelf.formatter.msg "There are no cookbooks contingent upon '#{name}'
|
319
|
+
Berkshelf.formatter.msg "There are no cookbooks in this Berksfile contingent upon '#{name}'."
|
317
320
|
else
|
318
|
-
Berkshelf.formatter.msg "Cookbooks in this Berksfile contingent upon #{name}:"
|
321
|
+
Berkshelf.formatter.msg "Cookbooks in this Berksfile contingent upon '#{name}':"
|
319
322
|
print_list(dependencies)
|
320
323
|
end
|
321
324
|
end
|
@@ -342,8 +345,8 @@ module Berkshelf
|
|
342
345
|
path = File.expand_path(path)
|
343
346
|
end
|
344
347
|
|
345
|
-
berksfile =
|
346
|
-
berksfile.package(path
|
348
|
+
berksfile = Berksfile.from_options(options)
|
349
|
+
berksfile.package(path)
|
347
350
|
end
|
348
351
|
|
349
352
|
method_option :except,
|
@@ -362,8 +365,8 @@ module Berkshelf
|
|
362
365
|
banner: 'PATH'
|
363
366
|
desc "vendor [PATH]", "Vendor the cookbooks specified by the Berksfile into a directory"
|
364
367
|
def vendor(path = File.join(Dir.pwd, "berks-cookbooks"))
|
365
|
-
berksfile = Berkshelf::Berksfile.
|
366
|
-
berksfile.vendor(path
|
368
|
+
berksfile = Berkshelf::Berksfile.from_options(options)
|
369
|
+
berksfile.vendor(path)
|
367
370
|
end
|
368
371
|
|
369
372
|
desc 'version', 'Display version and copyright information'
|
@@ -387,7 +390,7 @@ module Berkshelf
|
|
387
390
|
# @param [Array<CachedCookbook>] cookbooks
|
388
391
|
#
|
389
392
|
def print_list(cookbooks)
|
390
|
-
Array(cookbooks).each do |cookbook|
|
393
|
+
Array(cookbooks).sort.each do |cookbook|
|
391
394
|
Berkshelf.formatter.msg " * #{cookbook.cookbook_name} (#{cookbook.version})"
|
392
395
|
end
|
393
396
|
end
|
@@ -68,6 +68,7 @@ module Berkshelf
|
|
68
68
|
template 'metadata.rb.erb', target.join('metadata.rb')
|
69
69
|
template license_file, target.join('LICENSE')
|
70
70
|
template 'README.md.erb', target.join('README.md')
|
71
|
+
template 'CHANGELOG.md.erb', target.join('CHANGELOG.md')
|
71
72
|
|
72
73
|
Berkshelf::InitGenerator.new([target], options.merge(default_options)).invoke_all
|
73
74
|
end
|
data/lib/berkshelf/dependency.rb
CHANGED
@@ -63,6 +63,21 @@ module Berkshelf
|
|
63
63
|
|
64
64
|
true
|
65
65
|
end
|
66
|
+
|
67
|
+
# Returns the name of this cookbook (because it's the key in hash tables).
|
68
|
+
#
|
69
|
+
# @param [Dependency, #to_s] dependency
|
70
|
+
# the dependency to find the name from
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
# the name of the cookbook
|
74
|
+
def name(dependency)
|
75
|
+
if dependency.is_a?(Dependency)
|
76
|
+
dependency.name.to_s
|
77
|
+
else
|
78
|
+
dependency.to_s
|
79
|
+
end
|
80
|
+
end
|
66
81
|
end
|
67
82
|
|
68
83
|
DEFAULT_CONSTRAINT = '>= 0.0.0'.freeze
|
@@ -77,9 +92,11 @@ module Berkshelf
|
|
77
92
|
# @return [Berkshelf::Location]
|
78
93
|
attr_reader :location
|
79
94
|
# @return [Solve::Version]
|
80
|
-
|
95
|
+
attr_reader :locked_version
|
81
96
|
# @return [Solve::Constraint]
|
82
|
-
|
97
|
+
attr_reader :version_constraint
|
98
|
+
# @return [Source]
|
99
|
+
attr_accessor :source
|
83
100
|
# @return [Berkshelf::CachedCookbook]
|
84
101
|
attr_accessor :cached_cookbook
|
85
102
|
|
@@ -127,6 +144,22 @@ module Berkshelf
|
|
127
144
|
!!@metadata
|
128
145
|
end
|
129
146
|
|
147
|
+
# Set this dependency's locked version.
|
148
|
+
#
|
149
|
+
# @param [#to_s] version
|
150
|
+
# the version to set
|
151
|
+
def locked_version=(version)
|
152
|
+
@locked_version = Solve::Version.new(version.to_s)
|
153
|
+
end
|
154
|
+
|
155
|
+
# Set this dependency's constraint(s).
|
156
|
+
#
|
157
|
+
# @param [#to_s] constraint
|
158
|
+
# the constraint to set
|
159
|
+
def version_constraint=(constraint)
|
160
|
+
@version_constraint = Solve::Constraint.new(constraint.to_s)
|
161
|
+
end
|
162
|
+
|
130
163
|
def add_group(*local_groups)
|
131
164
|
local_groups = local_groups.first if local_groups.first.is_a?(Array)
|
132
165
|
|
@@ -136,31 +169,37 @@ module Berkshelf
|
|
136
169
|
end
|
137
170
|
end
|
138
171
|
|
139
|
-
#
|
140
|
-
|
141
|
-
|
142
|
-
|
172
|
+
# The cached (downloaded) cookbook for this dependency.
|
173
|
+
#
|
174
|
+
# @return [CachedCookbook, nil]
|
175
|
+
def download
|
176
|
+
@cached_cookbook = if location
|
177
|
+
location.download
|
143
178
|
else
|
144
179
|
if locked_version
|
145
180
|
CookbookStore.instance.cookbook(name, locked_version)
|
146
181
|
else
|
147
|
-
|
182
|
+
CookbookStore.instance.satisfy(name, version_constraint)
|
148
183
|
end
|
149
184
|
end
|
150
|
-
end
|
151
|
-
|
152
|
-
# @return [Berkshelf::CachedCookbook]
|
153
|
-
def download
|
154
|
-
@cached_cookbook = location.download
|
155
185
|
|
156
186
|
if scm_location? || path_location?
|
157
|
-
|
158
|
-
|
187
|
+
self.locked_version = @cached_cookbook.version
|
188
|
+
self.version_constraint = @cached_cookbook.version
|
159
189
|
end
|
160
190
|
|
161
191
|
@cached_cookbook
|
162
192
|
end
|
163
193
|
|
194
|
+
# Download the dependency. If this dependency is an SCM location or Path
|
195
|
+
# location, the constraints are also updated to correspond to the cookbook
|
196
|
+
# on disk.
|
197
|
+
#
|
198
|
+
# @return [CachedCookbook, nil]
|
199
|
+
def cached_cookbook
|
200
|
+
@cached_cookbook ||= download
|
201
|
+
end
|
202
|
+
|
164
203
|
# Returns true if the dependency has already been downloaded. A dependency is downloaded when a
|
165
204
|
# cached cookbook is present.
|
166
205
|
#
|
@@ -227,6 +266,17 @@ module Berkshelf
|
|
227
266
|
].join(', ')
|
228
267
|
end
|
229
268
|
|
269
|
+
def to_lock
|
270
|
+
out = if path_location? || scm_location? || version_constraint.to_s == '>= 0.0.0'
|
271
|
+
" #{name}\n"
|
272
|
+
else
|
273
|
+
" #{name} (#{version_constraint})\n"
|
274
|
+
end
|
275
|
+
|
276
|
+
out << location.to_lock if location
|
277
|
+
out
|
278
|
+
end
|
279
|
+
|
230
280
|
def to_hash
|
231
281
|
{}.tap do |h|
|
232
282
|
h[:locked_version] = locked_version.to_s
|
data/lib/berkshelf/downloader.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'zlib'
|
3
3
|
require 'archive/tar/minitar'
|
4
|
-
require 'octokit'
|
5
4
|
|
6
5
|
module Berkshelf
|
7
6
|
class Downloader
|
@@ -30,17 +29,13 @@ module Berkshelf
|
|
30
29
|
options = args.last.is_a?(Hash) ? args.pop : Hash.new
|
31
30
|
dependency, version = args
|
32
31
|
|
33
|
-
|
34
|
-
dependency
|
35
|
-
|
36
|
-
sources.each do |source|
|
37
|
-
if result = try_download(source, dependency, version)
|
38
|
-
return result
|
39
|
-
end
|
32
|
+
sources.each do |source|
|
33
|
+
if result = try_download(source, dependency, version)
|
34
|
+
return result
|
40
35
|
end
|
41
|
-
|
42
|
-
raise CookbookNotFound, "#{dependency} (#{version}) not found in any sources"
|
43
36
|
end
|
37
|
+
|
38
|
+
raise CookbookNotFound, "#{dependency} (#{version}) not found in any sources"
|
44
39
|
end
|
45
40
|
|
46
41
|
# @param [Berkshelf::Source] source
|
@@ -71,6 +66,8 @@ module Berkshelf
|
|
71
66
|
Celluloid.logger = nil unless ENV["DEBUG_CELLULOID"]
|
72
67
|
Ridley.open(credentials) { |r| r.cookbook.download(name, version) }
|
73
68
|
when :github
|
69
|
+
require 'octokit' unless defined?(Octokit)
|
70
|
+
|
74
71
|
tmp_dir = Dir.mktmpdir
|
75
72
|
archive_path = File.join(tmp_dir, "#{name}-#{version}.tar.gz")
|
76
73
|
unpack_dir = File.join(tmp_dir, "#{name}-#{version}")
|
data/lib/berkshelf/errors.rb
CHANGED
@@ -272,9 +272,17 @@ module Berkshelf
|
|
272
272
|
end
|
273
273
|
|
274
274
|
def to_s
|
275
|
-
list = @cookbooks.collect {|
|
276
|
-
|
277
|
-
|
275
|
+
list = @cookbooks.collect { |cookbook| "'#{cookbook}'" }.join(', ')
|
276
|
+
|
277
|
+
if @cookbooks.size == 1
|
278
|
+
"Could not find cookbook #{list}. Make sure it is in your " \
|
279
|
+
"Berksfile, then run `berks install` to download and install the " \
|
280
|
+
"missing dependencies."
|
281
|
+
else
|
282
|
+
"Could not find cookbooks #{list}. Make sure they are in your " \
|
283
|
+
"Berksfile, then run `berks install` to download and install the " \
|
284
|
+
"missing dependencies."
|
285
|
+
end
|
278
286
|
end
|
279
287
|
end
|
280
288
|
|
@@ -325,9 +333,9 @@ module Berkshelf
|
|
325
333
|
# the locked dependency
|
326
334
|
# @param [Berkshelf::Dependency] dependency
|
327
335
|
# the dependency that is outdated
|
328
|
-
def initialize(
|
329
|
-
@
|
330
|
-
@dependency
|
336
|
+
def initialize(locked, dependency)
|
337
|
+
@locked = locked
|
338
|
+
@dependency = dependency
|
331
339
|
end
|
332
340
|
|
333
341
|
def to_s
|
@@ -335,7 +343,7 @@ module Berkshelf
|
|
335
343
|
" In Berksfile:\n" +
|
336
344
|
" #{@dependency.name} (#{@dependency.version_constraint})\n\n" +
|
337
345
|
" In Berksfile.lock:\n" +
|
338
|
-
" #{@
|
346
|
+
" #{@locked.name} (#{@locked.version})\n\n" +
|
339
347
|
"Try running `berks update #{@dependency.name}`, which will try to find '#{@dependency.name}' matching " +
|
340
348
|
"'#{@dependency.version_constraint}'."
|
341
349
|
end
|
@@ -459,13 +467,13 @@ module Berkshelf
|
|
459
467
|
# the path to the Lockfile
|
460
468
|
# @param [~Exception] original
|
461
469
|
# the original exception class
|
462
|
-
def initialize(
|
463
|
-
@lockfile = Pathname.new(lockfile.to_s).basename.to_s
|
470
|
+
def initialize(original)
|
464
471
|
@original = original
|
465
472
|
end
|
466
473
|
|
467
474
|
def to_s
|
468
|
-
"Error reading the Berkshelf lockfile
|
475
|
+
"Error reading the Berkshelf lockfile:\n\n" \
|
476
|
+
" #{@original.class}: #{@original.message}"
|
469
477
|
end
|
470
478
|
end
|
471
479
|
|
@@ -487,7 +495,13 @@ module Berkshelf
|
|
487
495
|
|
488
496
|
class DuplicateDemand < BerkshelfError; status_code(138); end
|
489
497
|
class VendorError < BerkshelfError; status_code(139); end
|
490
|
-
class LockfileNotFound < BerkshelfError
|
498
|
+
class LockfileNotFound < BerkshelfError
|
499
|
+
status_code(140)
|
500
|
+
|
501
|
+
def to_s
|
502
|
+
'Lockfile not found! Run `berks install` to create the lockfile.'
|
503
|
+
end
|
504
|
+
end
|
491
505
|
|
492
506
|
class NotACookbook < BerkshelfError
|
493
507
|
status_code(141)
|
@@ -505,4 +519,38 @@ module Berkshelf
|
|
505
519
|
|
506
520
|
class InvalidLockFile < BerkshelfError; status_code(142); end
|
507
521
|
class PackageError < BerkshelfError; status_code(143); end
|
522
|
+
|
523
|
+
class LockfileOutOfSync < BerkshelfError
|
524
|
+
status_code(144)
|
525
|
+
|
526
|
+
def to_s
|
527
|
+
'The lockfile is out of sync! Run `berks install` to sync the lockfile.'
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
531
|
+
class DependencyNotInstalled < BerkshelfError
|
532
|
+
status_code(145)
|
533
|
+
|
534
|
+
def initialize(dependency)
|
535
|
+
name = dependency.name
|
536
|
+
version = dependency.locked_version
|
537
|
+
|
538
|
+
super "The cookbook '#{name} (#{version})' is not installed. Please " \
|
539
|
+
"run `berks install` to download and install the missing " \
|
540
|
+
"dependency."
|
541
|
+
end
|
542
|
+
end
|
543
|
+
|
544
|
+
class NoAPISourcesDefined < BerkshelfError
|
545
|
+
status_code(146)
|
546
|
+
|
547
|
+
def initialize
|
548
|
+
super "Your Berksfile does not define any API sources! You must define " \
|
549
|
+
"at least one source in order to download cookbooks. To add the " \
|
550
|
+
"default Berkshelf API server, add the following code to the top of " \
|
551
|
+
"your Berksfile:" \
|
552
|
+
"\n\n" \
|
553
|
+
" source 'https://api.berkshelf.com'"
|
554
|
+
end
|
555
|
+
end
|
508
556
|
end
|
@@ -17,38 +17,27 @@ module Berkshelf
|
|
17
17
|
|
18
18
|
# Output a Cookbook installation message using {Berkshelf.ui}
|
19
19
|
#
|
20
|
-
# @param [
|
21
|
-
#
|
22
|
-
# @
|
23
|
-
# the
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
if options.has_key?(:api_source) && options.has_key?(:location_path) && options.has_key?(:location_type)
|
32
|
-
api_source = options[:api_source].to_s
|
33
|
-
location_path = options[:location_path].to_s
|
34
|
-
location_type = options[:location_type].to_s
|
35
|
-
|
36
|
-
unless api_source == Berkshelf::Berksfile::DEFAULT_API_URL
|
37
|
-
info_message << " from [api: #{URI(api_source)}] ([#{location_type}] #{location_path})"
|
38
|
-
end
|
20
|
+
# @param [Source] source
|
21
|
+
# the source the dependency is being downloaded from
|
22
|
+
# @param [RemoteCookbook] cookbook
|
23
|
+
# the cookbook to be downloaded
|
24
|
+
def install(source, cookbook)
|
25
|
+
message = "Installing #{cookbook.name} (#{cookbook.version})"
|
26
|
+
|
27
|
+
unless source.default?
|
28
|
+
message << " from #{source}"
|
29
|
+
message << " ([#{cookbook.location_type}] #{cookbook.location_path})"
|
39
30
|
end
|
40
31
|
|
41
|
-
Berkshelf.ui.info
|
32
|
+
Berkshelf.ui.info(message)
|
42
33
|
end
|
43
34
|
|
44
35
|
# Output a Cookbook use message using {Berkshelf.ui}
|
45
36
|
#
|
46
|
-
# @param [
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
message = "Using #{cookbook} (#{version})"
|
51
|
-
message += " #{location}" if location
|
37
|
+
# @param [Dependency] dependency
|
38
|
+
def use(dependency)
|
39
|
+
message = "Using #{dependency.name} (#{dependency.locked_version})"
|
40
|
+
message << " from #{dependency.location}" if dependency.location
|
52
41
|
Berkshelf.ui.info message
|
53
42
|
end
|
54
43
|
|
@@ -78,7 +67,7 @@ module Berkshelf
|
|
78
67
|
hash.keys.each do |name|
|
79
68
|
hash[name].each do |source, newest|
|
80
69
|
string = " * #{newest.name} (#{newest.version})"
|
81
|
-
unless
|
70
|
+
unless source == Berksfile::DEFAULT_API_URL
|
82
71
|
string << " [#{source}]"
|
83
72
|
end
|
84
73
|
Berkshelf.ui.info string
|
@@ -95,15 +84,13 @@ module Berkshelf
|
|
95
84
|
|
96
85
|
# Output a list of cookbooks using {Berkshelf.ui}
|
97
86
|
#
|
98
|
-
# @param [
|
99
|
-
def list(
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
Berkshelf.ui.info(" * #{cookbook.cookbook_name} (#{cookbook.version})")
|
106
|
-
end
|
87
|
+
# @param [Array<Dependency>] list
|
88
|
+
def list(dependencies)
|
89
|
+
Berkshelf.ui.info "Cookbooks installed by your Berksfile:"
|
90
|
+
dependencies.each do |dependency|
|
91
|
+
out = " * #{dependency}"
|
92
|
+
out << " from #{dependency.location}" if dependency.location
|
93
|
+
Berkshelf.ui.info(out)
|
107
94
|
end
|
108
95
|
end
|
109
96
|
|