berkshelf 6.3.4 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +10 -0
- data/.travis.yml +6 -8
- data/CHANGELOG.md +7 -19
- data/Gemfile +10 -0
- data/Gemfile.lock +68 -103
- data/Thorfile +2 -2
- data/berkshelf.gemspec +6 -8
- data/features/commands/info.feature +50 -8
- data/features/commands/shelf/show.feature +10 -40
- data/features/commands/upload.feature +73 -0
- data/features/commands/vendor.feature +43 -0
- data/features/json_formatter.feature +1 -1
- data/features/step_definitions/chef_server_steps.rb +2 -2
- data/features/step_definitions/filesystem_steps.rb +16 -0
- data/features/support/env.rb +11 -10
- data/lib/berkshelf.rb +15 -20
- data/lib/berkshelf/berksfile.rb +57 -47
- data/lib/berkshelf/cached_cookbook.rb +120 -19
- data/lib/berkshelf/chef_config_compat.rb +50 -0
- data/lib/berkshelf/chef_repo_universe.rb +2 -2
- data/lib/berkshelf/cli.rb +3 -42
- data/lib/berkshelf/community_rest.rb +40 -61
- data/lib/berkshelf/config.rb +92 -118
- data/lib/berkshelf/cookbook_store.rb +3 -2
- data/lib/berkshelf/core_ext/file.rb +1 -1
- data/lib/berkshelf/dependency.rb +1 -10
- data/lib/berkshelf/downloader.rb +19 -7
- data/lib/berkshelf/errors.rb +3 -0
- data/lib/berkshelf/location.rb +1 -1
- data/lib/berkshelf/locations/base.rb +1 -1
- data/lib/berkshelf/lockfile.rb +17 -13
- data/lib/berkshelf/logger.rb +62 -1
- data/lib/berkshelf/packager.rb +1 -1
- data/lib/berkshelf/resolver.rb +1 -1
- data/lib/berkshelf/ridley_compat.rb +22 -3
- data/lib/berkshelf/uploader.rb +76 -48
- data/lib/berkshelf/version.rb +1 -1
- data/spec/fixtures/cookbook-path-uploader/apt-2.3.6/metadata.rb +2 -0
- data/spec/fixtures/cookbook-path-uploader/build-essential-1.4.2/metadata.rb +2 -0
- data/spec/fixtures/cookbook-path-uploader/jenkins-2.0.3/metadata.rb +5 -0
- data/spec/fixtures/cookbook-path-uploader/jenkins-config-0.1.0/metadata.rb +4 -0
- data/spec/fixtures/cookbook-path-uploader/runit-1.5.8/metadata.rb +5 -0
- data/spec/fixtures/cookbook-path-uploader/yum-3.0.6/metadata.rb +2 -0
- data/spec/fixtures/cookbook-path-uploader/yum-epel-0.2.0/metadata.rb +3 -0
- data/spec/spec_helper.rb +2 -2
- data/spec/support/chef_api.rb +4 -4
- data/spec/support/chef_server.rb +1 -1
- data/spec/support/matchers/file_system_matchers.rb +1 -3
- data/spec/support/path_helpers.rb +1 -1
- data/spec/unit/berkshelf/berksfile_spec.rb +3 -24
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +13 -15
- data/spec/unit/berkshelf/community_rest_spec.rb +3 -12
- data/spec/unit/berkshelf/config_spec.rb +4 -4
- data/spec/unit/berkshelf/downloader_spec.rb +6 -11
- data/spec/unit/berkshelf/lockfile_spec.rb +10 -7
- data/spec/unit/berkshelf/source_spec.rb +1 -1
- data/spec/unit/berkshelf/ssl_policies_spec.rb +2 -5
- data/spec/unit/berkshelf/uploader_spec.rb +60 -10
- data/spec/unit/berkshelf/visualizer_spec.rb +2 -2
- metadata +49 -102
- data/features/commands/cookbook.feature +0 -35
- data/features/commands/init.feature +0 -27
- data/features/config.feature +0 -111
- data/lib/berkshelf/base_generator.rb +0 -42
- data/lib/berkshelf/cookbook_generator.rb +0 -133
- data/lib/berkshelf/init_generator.rb +0 -195
- data/lib/berkshelf/streaming_file_adapter.rb +0 -22
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +0 -108
- data/spec/unit/berkshelf/init_generator_spec.rb +0 -265
data/lib/berkshelf/berksfile.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require_relative "packager"
|
2
2
|
|
3
|
+
require "chef/cookbook/chefignore"
|
4
|
+
require "chef/util/path_helper"
|
5
|
+
|
3
6
|
module Berkshelf
|
4
7
|
class Berksfile
|
5
8
|
class << self
|
@@ -9,7 +12,8 @@ module Berkshelf
|
|
9
12
|
# @param (see Berksfile#initialize)
|
10
13
|
def from_options(options = {})
|
11
14
|
options[:berksfile] ||= File.join(Dir.pwd, Berkshelf::DEFAULT_FILENAME)
|
12
|
-
|
15
|
+
symbolized = Hash[options.map { |k, v| [k.to_sym, v] }]
|
16
|
+
from_file(options[:berksfile], symbolized.select { |k,| [:except, :only, :delete].include? k })
|
13
17
|
end
|
14
18
|
|
15
19
|
# @param [#to_s] file
|
@@ -31,7 +35,7 @@ module Berkshelf
|
|
31
35
|
|
32
36
|
# Don't vendor VCS files.
|
33
37
|
# Reference GNU tar --exclude-vcs: https://www.gnu.org/software/tar/manual/html_section/tar_49.html
|
34
|
-
EXCLUDED_VCS_FILES_WHEN_VENDORING = [".arch-ids", "{arch}", ".bzr", ".bzrignore", ".bzrtags", "CVS", ".cvsignore", "_darcs", ".git", ".hg", ".hgignore", ".hgrags", "RCS", "SCCS", ".svn", "**/.git"].freeze
|
38
|
+
EXCLUDED_VCS_FILES_WHEN_VENDORING = [".arch-ids", "{arch}", ".bzr", ".bzrignore", ".bzrtags", "CVS", ".cvsignore", "_darcs", ".git", ".hg", ".hgignore", ".hgrags", "RCS", "SCCS", ".svn", "**/.git", "**/.svn"].freeze
|
35
39
|
|
36
40
|
include Mixin::Logging
|
37
41
|
include Cleanroom
|
@@ -173,8 +177,11 @@ module Berkshelf
|
|
173
177
|
# path to the metadata file
|
174
178
|
def metadata(options = {})
|
175
179
|
path = options[:path] || File.dirname(filepath)
|
176
|
-
|
177
|
-
|
180
|
+
|
181
|
+
loader = Chef::Cookbook::CookbookVersionLoader.new(path)
|
182
|
+
loader.load_cookbooks
|
183
|
+
cookbook_version = loader.cookbook_version
|
184
|
+
metadata = cookbook_version.metadata
|
178
185
|
|
179
186
|
add_dependency(metadata.name, nil, path: path, metadata: true)
|
180
187
|
end
|
@@ -253,35 +260,6 @@ module Berkshelf
|
|
253
260
|
sources.find { |source| source.cookbook(name, version) }
|
254
261
|
end
|
255
262
|
|
256
|
-
# @todo remove in Berkshelf 4.0
|
257
|
-
#
|
258
|
-
# @raise [DeprecatedError]
|
259
|
-
def site(*args)
|
260
|
-
if args.first == :opscode
|
261
|
-
Berkshelf.formatter.deprecation "Your Berksfile contains a site location pointing to the Opscode Community " +
|
262
|
-
"Site (site :opscode). Site locations have been replaced by the source location. Change this to: " +
|
263
|
-
"'source \"https://supermarket.chef.io\"' to remove this warning. For more information visit " +
|
264
|
-
"https://github.com/berkshelf/berkshelf/wiki/deprecated-locations"
|
265
|
-
source(DEFAULT_API_URL)
|
266
|
-
return
|
267
|
-
end
|
268
|
-
|
269
|
-
raise DeprecatedError.new "Your Berksfile contains a site location. Site locations have been " +
|
270
|
-
" replaced by the source location. Please remove your site location and try again. For more information " +
|
271
|
-
" visit https://github.com/berkshelf/berkshelf/wiki/deprecated-locations"
|
272
|
-
end
|
273
|
-
expose :site
|
274
|
-
|
275
|
-
# @todo remove in Berkshelf 4.0
|
276
|
-
#
|
277
|
-
# @raise [DeprecatedError]
|
278
|
-
def chef_api(*args)
|
279
|
-
raise DeprecatedError.new "Your Berksfile contains a chef_api location. Chef API locations have " +
|
280
|
-
" been replaced by the source location. Please remove your site location and try again. For more " +
|
281
|
-
" information visit https://github.com/berkshelf/berkshelf/wiki/deprecated-locations"
|
282
|
-
end
|
283
|
-
expose :chef_api
|
284
|
-
|
285
263
|
# Add a dependency of the given name and constraint to the array of dependencies.
|
286
264
|
#
|
287
265
|
# @param [String] name
|
@@ -309,9 +287,10 @@ module Berkshelf
|
|
309
287
|
end
|
310
288
|
end
|
311
289
|
|
312
|
-
|
313
|
-
|
314
|
-
|
290
|
+
# this appears to be dead code
|
291
|
+
#if options[:path]
|
292
|
+
# metadata_file = File.join(options[:path], "metadata.rb")
|
293
|
+
#end
|
315
294
|
|
316
295
|
options[:constraint] = constraint
|
317
296
|
|
@@ -621,6 +600,25 @@ module Berkshelf
|
|
621
600
|
outdir
|
622
601
|
end
|
623
602
|
|
603
|
+
# backcompat with ridley lookup of chefignore
|
604
|
+
def find_chefignore(path)
|
605
|
+
filename = "chefignore"
|
606
|
+
|
607
|
+
Pathname.new(path).ascend do |dir|
|
608
|
+
next unless dir.directory?
|
609
|
+
|
610
|
+
[
|
611
|
+
dir.join(filename),
|
612
|
+
dir.join("cookbooks", filename),
|
613
|
+
dir.join(".chef", filename),
|
614
|
+
].each do |possible|
|
615
|
+
return possible.expand_path.to_s if possible.exist?
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
619
|
+
nil
|
620
|
+
end
|
621
|
+
|
624
622
|
# Install the Berksfile or Berksfile.lock and then sync the cached cookbooks
|
625
623
|
# into directories within the given destination matching their name.
|
626
624
|
#
|
@@ -631,31 +629,43 @@ module Berkshelf
|
|
631
629
|
# the expanded path cookbooks were vendored to or nil if nothing was vendored
|
632
630
|
def vendor(destination)
|
633
631
|
Dir.mktmpdir("vendor") do |scratch|
|
634
|
-
chefignore = nil
|
635
632
|
cached_cookbooks = install
|
636
|
-
raw_metadata_files = []
|
637
633
|
|
638
634
|
return nil if cached_cookbooks.empty?
|
639
635
|
|
640
636
|
cached_cookbooks.each do |cookbook|
|
641
637
|
Berkshelf.formatter.vendor(cookbook, destination)
|
638
|
+
|
639
|
+
# compile the metadata early before we do the file list
|
640
|
+
cookbook.compile_metadata
|
641
|
+
cookbook.reload
|
642
|
+
|
642
643
|
cookbook_destination = File.join(scratch, cookbook.cookbook_name)
|
643
644
|
FileUtils.mkdir_p(cookbook_destination)
|
644
645
|
|
645
646
|
# Dir.glob does not support backslash as a File separator
|
646
647
|
src = cookbook.path.to_s.tr('\\', "/")
|
647
|
-
files = FileSyncer.glob(File.join(src, "
|
648
|
+
files = FileSyncer.glob(File.join(src, "**/*"))
|
648
649
|
|
649
|
-
|
650
|
-
|
650
|
+
# strip directories
|
651
|
+
files.reject! { |file_path| File.directory?(file_path) }
|
651
652
|
|
652
|
-
|
653
|
-
|
654
|
-
end
|
653
|
+
# convert to relative Pathname objects for chefignore
|
654
|
+
files.map! { |file_path| Chef::Util::PathHelper.relative_path_from(cookbook.path.to_s, file_path) }
|
655
655
|
|
656
|
-
|
656
|
+
chefignore = Chef::Cookbook::Chefignore.new(find_chefignore(cookbook.path.to_s) || cookbook.path.to_s)
|
657
657
|
|
658
|
-
|
658
|
+
# apply chefignore
|
659
|
+
files.reject! { |file_path| chefignore.ignored?(file_path) }
|
660
|
+
|
661
|
+
# convert Pathname objects back to strings
|
662
|
+
files.map! { |f| f.to_s }
|
663
|
+
|
664
|
+
# copy each file to destination
|
665
|
+
files.each do |rpath|
|
666
|
+
FileUtils.mkdir_p( File.join(cookbook_destination, File.dirname(rpath)) )
|
667
|
+
FileUtils.cp( File.join(cookbook.path.to_s, rpath), File.join(cookbook_destination, rpath) )
|
668
|
+
end
|
659
669
|
end
|
660
670
|
|
661
671
|
# Don't vendor the raw metadata (metadata.rb). The raw metadata is
|
@@ -673,7 +683,7 @@ module Berkshelf
|
|
673
683
|
#
|
674
684
|
# * https://tickets.opscode.com/browse/CHEF-4811
|
675
685
|
# * https://tickets.opscode.com/browse/CHEF-4810
|
676
|
-
FileSyncer.sync(scratch, destination, exclude:
|
686
|
+
FileSyncer.sync(scratch, destination, exclude: EXCLUDED_VCS_FILES_WHEN_VENDORING, delete: @delete)
|
677
687
|
end
|
678
688
|
|
679
689
|
destination
|
@@ -1,5 +1,10 @@
|
|
1
|
+
require "chef/cookbook/cookbook_version_loader"
|
2
|
+
require "chef/cookbook/syntax_check"
|
3
|
+
require "berkshelf/errors"
|
4
|
+
require "chef/json_compat"
|
5
|
+
|
1
6
|
module Berkshelf
|
2
|
-
class CachedCookbook
|
7
|
+
class CachedCookbook
|
3
8
|
class << self
|
4
9
|
# @param [#to_s] path
|
5
10
|
# a path on disk to the location of a Cookbook downloaded by the Downloader
|
@@ -15,38 +20,108 @@ module Berkshelf
|
|
15
20
|
loaded_cookbooks[path.to_s] ||= from_path(path)
|
16
21
|
end
|
17
22
|
|
23
|
+
# Creates a new instance of Berkshelf::CachedCookbook from a path on disk containing
|
24
|
+
# a Cookbook.
|
25
|
+
#
|
26
|
+
# The name of the Cookbook is determined by the value of the name attribute set in
|
27
|
+
# the cookbooks' metadata. If the name attribute is not present the name of the loaded
|
28
|
+
# cookbook is determined by directory containing the cookbook.
|
29
|
+
#
|
30
|
+
# @param [#to_s] path
|
31
|
+
# a path on disk to the location of a Cookbook
|
32
|
+
#
|
33
|
+
# @raise [IOError] if the path does not contain a metadata.rb or metadata.json file
|
34
|
+
#
|
35
|
+
# @return [Ridley::Chef::Cookbook]
|
36
|
+
def from_path(path)
|
37
|
+
path = Pathname.new(path)
|
38
|
+
|
39
|
+
new(path)
|
40
|
+
end
|
41
|
+
|
42
|
+
def checksum(filepath)
|
43
|
+
Chef::Digester.generate_md5_checksum_for_file(filepath)
|
44
|
+
end
|
45
|
+
|
18
46
|
private
|
19
47
|
|
20
|
-
|
48
|
+
# @return [Hash<String, CachedCookbook>]
|
21
49
|
def loaded_cookbooks
|
22
50
|
@loaded_cookbooks ||= {}
|
23
51
|
end
|
24
52
|
end
|
25
53
|
|
54
|
+
attr_writer :metadata
|
55
|
+
attr_accessor :path
|
56
|
+
attr_writer :cookbook_version
|
57
|
+
|
58
|
+
def initialize(path)
|
59
|
+
@path = path
|
60
|
+
# eagerly load to force throwing on bad metadata while constructing
|
61
|
+
cookbook_name
|
62
|
+
metadata
|
63
|
+
end
|
64
|
+
|
65
|
+
def loader
|
66
|
+
@loader ||=
|
67
|
+
begin
|
68
|
+
loader = Chef::Cookbook::CookbookVersionLoader.new(@path)
|
69
|
+
loader.load_cookbooks
|
70
|
+
loader
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def cookbook_version
|
75
|
+
@cookbook_version ||= loader.cookbook_version
|
76
|
+
end
|
77
|
+
|
78
|
+
def cookbook_name
|
79
|
+
@cookbook_name ||= cookbook_version.name
|
80
|
+
end
|
81
|
+
|
82
|
+
def metadata
|
83
|
+
@metadata ||= cookbook_version.metadata
|
84
|
+
end
|
85
|
+
|
86
|
+
def reload
|
87
|
+
@metadata = nil
|
88
|
+
@cookbook_name = nil
|
89
|
+
@cookbook_version = nil
|
90
|
+
@loader = nil
|
91
|
+
end
|
92
|
+
|
93
|
+
def <=>(other)
|
94
|
+
[cookbook_name, version] <=> [other.cookbook_name, other.version]
|
95
|
+
end
|
96
|
+
|
26
97
|
DIRNAME_REGEXP = /^(.+)-(.+)$/
|
27
98
|
|
28
99
|
extend Forwardable
|
100
|
+
|
101
|
+
def_delegator :cookbook_version, :version
|
102
|
+
def_delegator :metadata, :name, :cookbook_name
|
29
103
|
def_delegator :metadata, :description
|
30
104
|
def_delegator :metadata, :maintainer
|
31
105
|
def_delegator :metadata, :maintainer_email
|
32
106
|
def_delegator :metadata, :license
|
33
107
|
def_delegator :metadata, :platforms
|
108
|
+
def_delegator :metadata, :name
|
34
109
|
|
35
110
|
# @return [Hash]
|
36
111
|
def dependencies
|
37
|
-
metadata.
|
112
|
+
metadata.dependencies
|
38
113
|
end
|
39
114
|
|
40
115
|
def pretty_print
|
41
116
|
[].tap do |a|
|
42
|
-
a.push " Name: #{cookbook_name}"
|
43
|
-
a.push " Version: #{version}"
|
44
|
-
a.push " Description: #{metadata.description}"
|
45
|
-
a.push " Author: #{metadata.maintainer}"
|
46
|
-
a.push " Email: #{metadata.maintainer_email}"
|
47
|
-
a.push " License: #{metadata.license}"
|
48
|
-
a.push " Platforms: #{pretty_map(metadata.platforms, 14)}"
|
49
|
-
a.push "Dependencies: #{pretty_map(dependencies, 14)}"
|
117
|
+
a.push " Name: #{cookbook_name}" if name && name =~ /\S/
|
118
|
+
a.push " Version: #{version}" if version && version =~ /\S/
|
119
|
+
a.push " Description: #{metadata.description}" if metadata.description && metadata.description =~ /\S/
|
120
|
+
a.push " Author: #{metadata.maintainer}" if metadata.maintainer && metadata.maintainer =~ /\S/
|
121
|
+
a.push " Email: #{metadata.maintainer_email}" if metadata.maintainer_email && metadata.maintainer_email =~ /\S/
|
122
|
+
a.push " License: #{metadata.license}" if metadata.license && metadata.license =~ /\S/
|
123
|
+
a.push " Platforms: #{pretty_map(metadata.platforms, 14)}" if metadata.platforms && !metadata.platforms.empty?
|
124
|
+
a.push "Dependencies: #{pretty_map(dependencies, 14)}" if dependencies && !dependencies.empty?
|
50
125
|
end.join("\n")
|
51
126
|
end
|
52
127
|
|
@@ -62,17 +137,43 @@ module Berkshelf
|
|
62
137
|
# @return [Hash]
|
63
138
|
def pretty_hash
|
64
139
|
{}.tap do |h|
|
65
|
-
h[:name] = cookbook_name
|
66
|
-
h[:version] = version
|
67
|
-
h[:description] = description
|
68
|
-
h[:author] = maintainer
|
69
|
-
h[:email] = maintainer_email
|
70
|
-
h[:license] = license
|
71
|
-
h[:platforms] = platforms.to_hash
|
72
|
-
h[:dependencies] = dependencies.to_hash
|
140
|
+
h[:name] = cookbook_name if cookbook_name && cookbook_name =~ /\S/
|
141
|
+
h[:version] = version if version && version =~ /\S/
|
142
|
+
h[:description] = description if description && description =~ /\S/
|
143
|
+
h[:author] = maintainer if maintainer && maintainer =~ /\S/
|
144
|
+
h[:email] = maintainer_email if maintainer_email && maintainer_email =~ /\S/
|
145
|
+
h[:license] = license if license && license =~ /\S/
|
146
|
+
h[:platforms] = platforms.to_hash if platforms && !platforms.empty?
|
147
|
+
h[:dependencies] = dependencies.to_hash if dependencies && !dependencies.empty?
|
73
148
|
end
|
74
149
|
end
|
75
150
|
|
151
|
+
def validate
|
152
|
+
raise IOError, "No Cookbook found at: #{path}" unless path.exist?
|
153
|
+
|
154
|
+
syntax_checker = Chef::Cookbook::SyntaxCheck.for_cookbook(cookbook_name, path)
|
155
|
+
unless syntax_checker.validate_ruby_files
|
156
|
+
raise Berkshelf::Errors::CookbookSyntaxError, "Invalid ruby files in cookbook: #{cookbook_name} (#{version})."
|
157
|
+
end
|
158
|
+
unless syntax_checker.validate_templates
|
159
|
+
raise Berkshelf::Errors::CookbookSyntaxError, "Invalid template files in cookbook: #{cookbook_name} (#{version})."
|
160
|
+
end
|
161
|
+
|
162
|
+
true
|
163
|
+
end
|
164
|
+
|
165
|
+
def compile_metadata
|
166
|
+
json_file = "#{path}/metadata.json"
|
167
|
+
rb_file = "#{path}/metadata.rb"
|
168
|
+
return nil if File.exist?(json_file)
|
169
|
+
md = Chef::Cookbook::Metadata.new
|
170
|
+
md.from_file(rb_file)
|
171
|
+
f = File.open(json_file, "w")
|
172
|
+
f.write(Chef::JSONCompat.to_json_pretty(md))
|
173
|
+
f.close
|
174
|
+
f.path
|
175
|
+
end
|
176
|
+
|
76
177
|
private
|
77
178
|
|
78
179
|
def pretty_map(hash, padding)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "chef-config/config"
|
2
|
+
require "chef-config/workstation_config_loader"
|
3
|
+
require "socket" # FIXME: why?
|
4
|
+
|
5
|
+
module Berkshelf
|
6
|
+
class ChefConfigCompat
|
7
|
+
# Create a new Chef Config object.
|
8
|
+
#
|
9
|
+
# @param [#to_s] path
|
10
|
+
# the path to the configuration file
|
11
|
+
# @param [Hash] options
|
12
|
+
def initialize(path, options = {})
|
13
|
+
ChefConfig::WorkstationConfigLoader.new(path).load
|
14
|
+
ChefConfig::Config.merge!(options)
|
15
|
+
ChefConfig::Config.export_proxies # Set proxy settings as environment variables
|
16
|
+
end
|
17
|
+
|
18
|
+
# Keep defaults that aren't in ChefConfig::Config
|
19
|
+
def cookbook_copyright(*args, &block)
|
20
|
+
ChefConfig::Config.cookbook_copyright(*args, &block) || "YOUR_NAME"
|
21
|
+
end
|
22
|
+
|
23
|
+
def cookbook_email(*args, &block)
|
24
|
+
ChefConfig::Config.cookbook_email(*args, &block) || "YOUR_EMAIL"
|
25
|
+
end
|
26
|
+
|
27
|
+
def cookbook_license(*args, &block)
|
28
|
+
ChefConfig::Config.cookbook_license(*args, &block) || "reserved"
|
29
|
+
end
|
30
|
+
|
31
|
+
# The configuration as a hash
|
32
|
+
def to_hash
|
33
|
+
ChefConfig::Config.save(true)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Load from a file
|
37
|
+
def self.from_file(file)
|
38
|
+
new(file)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Behave just like ChefConfig::Config in general
|
42
|
+
def method_missing(name, *args, &block)
|
43
|
+
ChefConfig::Config.send(name, *args, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def respond_to_missing?(name)
|
47
|
+
ChefConfig::Config.respond_to?(name)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require "berkshelf/api_client/remote_cookbook"
|
2
|
-
require "
|
2
|
+
require "berkshelf/cached_cookbook"
|
3
3
|
|
4
4
|
module Berkshelf
|
5
5
|
# Shim to look like a Berkshelf::APIClient but for a chef repo folder.
|
@@ -18,7 +18,7 @@ module Berkshelf
|
|
18
18
|
entry_path = "#{cookbooks_path}/#{entry}"
|
19
19
|
next unless File.directory?(entry_path) # Skip non-dirs.
|
20
20
|
cookbook = begin
|
21
|
-
|
21
|
+
Berkshelf::CachedCookbook.from_path(entry_path)
|
22
22
|
rescue IOError
|
23
23
|
next # It wasn't a cookbook.
|
24
24
|
end
|
data/lib/berkshelf/cli.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require "berkshelf"
|
2
2
|
require_relative "config"
|
3
|
-
require_relative "init_generator"
|
4
|
-
require_relative "cookbook_generator"
|
5
3
|
require_relative "commands/shelf"
|
6
4
|
|
7
5
|
module Berkshelf
|
@@ -28,7 +26,7 @@ module Berkshelf
|
|
28
26
|
Berkshelf.ui.error e
|
29
27
|
Berkshelf.ui.error "\t" + e.backtrace.join("\n\t") if ENV["BERKSHELF_DEBUG"]
|
30
28
|
@kernel.exit(e.status_code)
|
31
|
-
rescue
|
29
|
+
rescue => e
|
32
30
|
Berkshelf.ui.error "#{e.class} #{e}"
|
33
31
|
Berkshelf.ui.error "\t" + e.backtrace.join("\n\t") if ENV["BERKSHELF_DEBUG"]
|
34
32
|
@kernel.exit(47)
|
@@ -129,13 +127,6 @@ module Berkshelf
|
|
129
127
|
hide: true
|
130
128
|
desc "install", "Install the cookbooks specified in the Berksfile"
|
131
129
|
def install
|
132
|
-
if options[:path]
|
133
|
-
# TODO: Remove in Berkshelf 4.0
|
134
|
-
Berkshelf.formatter.deprecation "`berks install --path [PATH]` has been replaced by `berks vendor`."
|
135
|
-
Berkshelf.formatter.deprecation "Re-run your command as `berks vendor [PATH]` or see `berks help vendor`."
|
136
|
-
exit(1)
|
137
|
-
end
|
138
|
-
|
139
130
|
berksfile = Berksfile.from_options(options)
|
140
131
|
berksfile.install
|
141
132
|
end
|
@@ -201,8 +192,7 @@ module Berkshelf
|
|
201
192
|
|
202
193
|
options[:freeze] = !options[:no_freeze]
|
203
194
|
options[:validate] = false if options[:skip_syntax_check]
|
204
|
-
|
205
|
-
berksfile.upload(names, options.symbolize_keys)
|
195
|
+
berksfile.upload(names, options.each_with_object({}) { |(k, v), m| m[k.to_sym] = v })
|
206
196
|
end
|
207
197
|
|
208
198
|
method_option :envfile,
|
@@ -226,7 +216,7 @@ module Berkshelf
|
|
226
216
|
end
|
227
217
|
|
228
218
|
lockfile = Lockfile.from_file(options[:lockfile])
|
229
|
-
lock_options = Hash[options].
|
219
|
+
lock_options = Hash[options].each_with_object({}) { |(k, v), m| m[k.to_sym] = v }
|
230
220
|
|
231
221
|
lockfile.apply(environment_name, lock_options)
|
232
222
|
end
|
@@ -264,21 +254,6 @@ module Berkshelf
|
|
264
254
|
Berkshelf.formatter.search(cookbooks)
|
265
255
|
end
|
266
256
|
|
267
|
-
desc "init [PATH]", "Initialize Berkshelf in the given directory"
|
268
|
-
def init(path = ".")
|
269
|
-
Berkshelf.formatter.deprecation <<EOF
|
270
|
-
This command is being deprecated in favor of `chef generate cookbook` and will soon return an error.
|
271
|
-
Please use `chef generate cookbook` instead of this command.
|
272
|
-
EOF
|
273
|
-
Berkshelf.formatter.deprecation "--git is now the default" if options[:git]
|
274
|
-
Berkshelf.formatter.deprecation "--vagrant is now the default" if options[:vagrant]
|
275
|
-
|
276
|
-
Berkshelf::InitGenerator.new([path], options).invoke_all
|
277
|
-
|
278
|
-
Berkshelf.formatter.msg "Successfully initialized"
|
279
|
-
end
|
280
|
-
tasks["init"].options = Berkshelf::InitGenerator.class_options
|
281
|
-
|
282
257
|
method_option :berksfile,
|
283
258
|
type: :string,
|
284
259
|
default: nil,
|
@@ -437,20 +412,6 @@ EOF
|
|
437
412
|
Berkshelf.formatter.version
|
438
413
|
end
|
439
414
|
|
440
|
-
desc "cookbook NAME [PATH]", "Create a skeleton for a new cookbook"
|
441
|
-
def cookbook(name, path = nil)
|
442
|
-
Berkshelf.formatter.deprecation <<EOF
|
443
|
-
This command is being deprecated in favor of `chef generate cookbook` and will soon return an error.
|
444
|
-
Please use `chef generate cookbook` instead of this command.
|
445
|
-
EOF
|
446
|
-
path = File.join(Dir.pwd, name) if path.nil?
|
447
|
-
Berkshelf.formatter.deprecation "--git is now the default" if options[:git]
|
448
|
-
Berkshelf.formatter.deprecation "--vagrant is now the default" if options[:vagrant]
|
449
|
-
|
450
|
-
Berkshelf::CookbookGenerator.new([path, name], options).invoke_all
|
451
|
-
end
|
452
|
-
tasks["cookbook"].options = Berkshelf::CookbookGenerator.class_options
|
453
|
-
|
454
415
|
private
|
455
416
|
|
456
417
|
# Print a list of the given cookbooks. This is used by various
|