berkshelf 3.1.5 → 3.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/berkshelf.gemspec +6 -5
- data/features/commands/search.feature +2 -2
- data/features/commands/vendor.feature +6 -2
- data/features/commands/verify.feature +29 -0
- data/features/config.feature +13 -48
- data/features/step_definitions/filesystem_steps.rb +2 -2
- data/features/step_definitions/gem_steps.rb +3 -1
- data/features/step_definitions/utility_steps.rb +2 -2
- data/generator_files/Vagrantfile.erb +30 -30
- data/generator_files/metadata.rb.erb +0 -1
- data/lib/berkshelf.rb +5 -2
- data/lib/berkshelf/berksfile.rb +41 -41
- data/lib/berkshelf/cli.rb +11 -1
- data/lib/berkshelf/community_rest.rb +1 -0
- data/lib/berkshelf/config.rb +18 -4
- data/lib/berkshelf/cookbook_store.rb +1 -1
- data/lib/berkshelf/downloader.rb +4 -0
- data/lib/berkshelf/errors.rb +0 -1
- data/lib/berkshelf/file_syncer.rb +134 -0
- data/lib/berkshelf/locations/base.rb +6 -1
- data/lib/berkshelf/locations/git.rb +2 -2
- data/lib/berkshelf/lockfile.rb +14 -2
- data/lib/berkshelf/uploader.rb +10 -17
- data/lib/berkshelf/validator.rb +37 -0
- data/lib/berkshelf/version.rb +1 -1
- data/lib/berkshelf/visualizer.rb +13 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/kitchen.rb +3 -1
- data/spec/support/matchers/file_system_matchers.rb +1 -1
- data/spec/support/matchers/filepath_matchers.rb +38 -2
- data/spec/support/shared_examples/formatter.rb +7 -7
- data/spec/unit/berkshelf/berksfile_spec.rb +51 -21
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +5 -5
- data/spec/unit/berkshelf/cli_spec.rb +1 -1
- data/spec/unit/berkshelf/community_rest_spec.rb +12 -12
- data/spec/unit/berkshelf/config_spec.rb +4 -4
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +2 -2
- data/spec/unit/berkshelf/cookbook_store_spec.rb +6 -6
- data/spec/unit/berkshelf/core_ext/file_utils_spec.rb +3 -3
- data/spec/unit/berkshelf/core_ext/pathname_spec.rb +23 -6
- data/spec/unit/berkshelf/dependency_spec.rb +4 -4
- data/spec/unit/berkshelf/downloader_spec.rb +5 -1
- data/spec/unit/berkshelf/errors_spec.rb +1 -1
- data/spec/unit/berkshelf/file_syncer_spec.rb +206 -0
- data/spec/unit/berkshelf/init_generator_spec.rb +19 -22
- data/spec/unit/berkshelf/installer_spec.rb +6 -6
- data/spec/unit/berkshelf/locations/base_spec.rb +17 -8
- data/spec/unit/berkshelf/locations/git_spec.rb +34 -34
- data/spec/unit/berkshelf/locations/path_spec.rb +3 -3
- data/spec/unit/berkshelf/lockfile_parser_spec.rb +1 -1
- data/spec/unit/berkshelf/lockfile_spec.rb +50 -36
- data/spec/unit/berkshelf/packager_spec.rb +6 -4
- data/spec/unit/berkshelf/resolver/graph_spec.rb +3 -3
- data/spec/unit/berkshelf/resolver_spec.rb +3 -3
- data/spec/unit/berkshelf/shell_spec.rb +30 -24
- data/spec/unit/berkshelf/uploader_spec.rb +10 -36
- data/spec/unit/berkshelf/validator_spec.rb +30 -0
- data/spec/unit/berkshelf/visualizer_spec.rb +17 -2
- metadata +34 -15
- data/lib/berkshelf/mixin/dsl_eval.rb +0 -58
- data/spec/unit/berkshelf/mixin/dsl_eval_spec.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be55c4c1bb887daab19c58ef3a4f2f905af29033
|
4
|
+
data.tar.gz: f0d4402fa9850c728b51ba239fec76de438fef1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe6cbe54f7acb7d5cdae6cced81df057585c0b8efba3fe532d7fd72ef7f28449f1a05a7859c977acf39f01090a0ec34da5ff3416ced45a9dd8df552aa7c126d7
|
7
|
+
data.tar.gz: 5d92e870bcac605248af9bfc0d7c5c8b827d63ea11014c7a95ff66177fcb6d67ec056f94d2605d22064a38f251ffa725799ecaf3ff202b7611dcaf3a15b2e955
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
> This is a high level digest of changes. For the complete CHANGELOG diff two tags in the project's [commit history](https://github.com/berkshelf/berkshelf/commits/master).
|
2
2
|
|
3
|
+
# 3.2.0
|
4
|
+
|
5
|
+
* Improvements
|
6
|
+
* Add version information to edges of generated visualization graph
|
7
|
+
* Bump to latest full release of Celluloid
|
8
|
+
* Updated some errors to include more information about what went wrong / how to make it better
|
9
|
+
* Lockfiles will be named after the name of the Berksfile, not always Berksfile.lock
|
10
|
+
* Vendoring will now sync files between two directories instead of deleting the target and it's contents
|
11
|
+
* Add support for downloading from Berkshelf-API file_store location
|
12
|
+
* Add `berks verify` command to validate Ruby syntax, ERB templates, and file names of cookbooks
|
13
|
+
|
14
|
+
* Bug Fixes
|
15
|
+
* Fixed a number of typos and documentation errors
|
16
|
+
* Fix running `berks viz` when pwd has spaces in it
|
17
|
+
* Fix checking for graphviz on Windows
|
18
|
+
* Remove PaxHeader files before uploading
|
19
|
+
* BERKSHELF_PATH will always be fully expanded regardless of how it is configured
|
20
|
+
|
21
|
+
* Deprecations
|
22
|
+
* vagrant.omnibus.enabled configuration option is now deprecated
|
23
|
+
|
3
24
|
# 3.1.5
|
4
25
|
|
5
26
|
* Bug Fixes
|
data/berkshelf.gemspec
CHANGED
@@ -35,21 +35,22 @@ Gem::Specification.new do |s|
|
|
35
35
|
s.add_dependency 'buff-config', '~> 1.0'
|
36
36
|
s.add_dependency 'buff-extensions', '~> 1.0'
|
37
37
|
s.add_dependency 'buff-shell_out', '~> 0.1'
|
38
|
+
s.add_dependency 'cleanroom', '~> 1.0'
|
38
39
|
s.add_dependency 'faraday', '~> 0.9.0'
|
39
40
|
s.add_dependency 'minitar', '~> 0.5.4'
|
40
41
|
s.add_dependency 'retryable', '~> 1.3.3'
|
41
42
|
s.add_dependency 'ridley', '~> 4.0'
|
42
43
|
s.add_dependency 'solve', '~> 1.1'
|
43
|
-
s.add_dependency 'thor', '~> 0.
|
44
|
+
s.add_dependency 'thor', '~> 0.19'
|
44
45
|
s.add_dependency 'octokit', '~> 3.0'
|
45
|
-
s.add_dependency 'celluloid', '~> 0.16.0
|
46
|
-
s.add_dependency 'celluloid-io', '~> 0.16.
|
46
|
+
s.add_dependency 'celluloid', '~> 0.16.0'
|
47
|
+
s.add_dependency 'celluloid-io', '~> 0.16.1'
|
47
48
|
|
48
|
-
s.add_development_dependency 'aruba', '~> 0.
|
49
|
+
s.add_development_dependency 'aruba', '~> 0.6'
|
49
50
|
s.add_development_dependency 'chef-zero', '~> 1.5.0'
|
50
51
|
s.add_development_dependency 'fuubar', '~> 1.1'
|
51
52
|
s.add_development_dependency 'rake', '~> 0.9'
|
52
|
-
s.add_development_dependency 'rspec', '~>
|
53
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
53
54
|
s.add_development_dependency 'spork', '~> 0.9'
|
54
55
|
s.add_development_dependency 'test-kitchen', '~> 1.2'
|
55
56
|
s.add_development_dependency 'webmock', '~> 1.11'
|
@@ -10,7 +10,7 @@ Feature: berks search
|
|
10
10
|
* I successfully run `berks search berkshelf-`
|
11
11
|
* the output should contain:
|
12
12
|
"""
|
13
|
-
berkshelf-api (1.
|
14
|
-
berkshelf-api-server (2.
|
13
|
+
berkshelf-api (1.2.2)
|
14
|
+
berkshelf-api-server (2.1.0)
|
15
15
|
berkshelf-cookbook-fixture (1.0.0)
|
16
16
|
"""
|
@@ -94,8 +94,12 @@ Feature: Vendoring cookbooks to a directory
|
|
94
94
|
cookbook 'fake'
|
95
95
|
"""
|
96
96
|
And a directory named "cukebooks"
|
97
|
-
|
98
|
-
And
|
97
|
+
And a directory named "cukebooks/fake/ponies"
|
98
|
+
And a directory named "cukebooks/existing_cookbook"
|
99
|
+
When I successfully run `berks vendor cukebooks`
|
100
|
+
And the directory "cukebooks/fake" should contain version "1.0.0" of the "fake" cookbook
|
101
|
+
And a directory named "cukebooks/fake/ponies" should not exist
|
102
|
+
And a directory named "cukebooks/existing_cookbook" should not exist
|
99
103
|
|
100
104
|
Scenario: vendoring into a nested directory
|
101
105
|
Given I have a Berksfile pointing at the local Berkshelf API with:
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: berks verify
|
2
|
+
Scenario: running verify when there is no Lockfile present
|
3
|
+
Given a cookbook named "sparkle_motion"
|
4
|
+
And I cd to "sparkle_motion"
|
5
|
+
And I have a Berksfile pointing at the local Berkshelf API with:
|
6
|
+
"""
|
7
|
+
metadata
|
8
|
+
"""
|
9
|
+
And I run `berks verify`
|
10
|
+
Then the output should contain:
|
11
|
+
"""
|
12
|
+
Lockfile not found! Run `berks install` to create the lockfile.
|
13
|
+
"""
|
14
|
+
And the exit status should be "LockfileNotFound"
|
15
|
+
|
16
|
+
Scenario: running verify when there is a valid Lockfile present
|
17
|
+
Given a cookbook named "sparkle_motion"
|
18
|
+
And I cd to "sparkle_motion"
|
19
|
+
And I have a Berksfile pointing at the local Berkshelf API with:
|
20
|
+
"""
|
21
|
+
metadata
|
22
|
+
"""
|
23
|
+
When I successfully run `berks install`
|
24
|
+
And I successfully run `berks verify`
|
25
|
+
Then the output should contain:
|
26
|
+
"""
|
27
|
+
Verifying (1) cookbook(s)...
|
28
|
+
Verified.
|
29
|
+
"""
|
data/features/config.feature
CHANGED
@@ -2,37 +2,8 @@ Feature: Reading a Berkshelf configuration file
|
|
2
2
|
Scenario: Missing a Berkshelf configuration file
|
3
3
|
When I successfully run `berks cookbook sparkle_motion`
|
4
4
|
Then the resulting "sparkle_motion" Vagrantfile should contain:
|
5
|
-
| config.omnibus.chef_version =
|
6
|
-
| config.vm.box =
|
7
|
-
| config.vm.box_url = "https://vagrantcloud.com/chef/ubuntu-14.04/version/1/provider/virtualbox.box" |
|
8
|
-
|
9
|
-
Scenario: Using a Berkshelf configuration file that disables the vagrant-omnibus plugin
|
10
|
-
Given I have a Berkshelf config file containing:
|
11
|
-
"""
|
12
|
-
{
|
13
|
-
"vagrant": {
|
14
|
-
"omnibus": {
|
15
|
-
"enabled": false,
|
16
|
-
"version": "11.4.4"
|
17
|
-
},
|
18
|
-
"vm": {
|
19
|
-
"box": "my_box",
|
20
|
-
"box_url": "http://files.vagrantup.com/lucid64.box",
|
21
|
-
"forward_port": {
|
22
|
-
"12345": "54321"
|
23
|
-
}
|
24
|
-
}
|
25
|
-
}
|
26
|
-
}
|
27
|
-
"""
|
28
|
-
When I successfully run `berks cookbook sparkle_motion`
|
29
|
-
Then the resulting "sparkle_motion" Vagrantfile should contain:
|
30
|
-
| #config.omnibus.chef_version = :latest |
|
31
|
-
| config.vm.box = "my_box" |
|
32
|
-
| config.vm.box_url = "http://files.vagrantup.com/lucid64.box" |
|
33
|
-
| config.vm.network :forwarded_port, guest: 12345, host: 54321 |
|
34
|
-
| config.vm.network :private_network, type: "dhcp" |
|
35
|
-
And the exit status should be 0
|
5
|
+
| config.omnibus.chef_version = 'latest' |
|
6
|
+
| config.vm.box = 'chef/ubuntu-14.04' |
|
36
7
|
|
37
8
|
Scenario: Using a Berkshelf configuration file that sets the vagrant-omnibus plugin chef version
|
38
9
|
Given I have a Berkshelf config file containing:
|
@@ -40,12 +11,10 @@ Feature: Reading a Berkshelf configuration file
|
|
40
11
|
{
|
41
12
|
"vagrant": {
|
42
13
|
"omnibus": {
|
43
|
-
"enabled": true,
|
44
14
|
"version": "11.4.4"
|
45
15
|
},
|
46
16
|
"vm": {
|
47
|
-
"box": "
|
48
|
-
"box_url": "http://files.vagrantup.com/lucid64.box",
|
17
|
+
"box": "chef/ubuntu-14.04",
|
49
18
|
"forward_port": {
|
50
19
|
"12345": "54321"
|
51
20
|
}
|
@@ -55,11 +24,10 @@ Feature: Reading a Berkshelf configuration file
|
|
55
24
|
"""
|
56
25
|
When I successfully run `berks cookbook sparkle_motion`
|
57
26
|
Then the resulting "sparkle_motion" Vagrantfile should contain:
|
58
|
-
| config.omnibus.chef_version =
|
59
|
-
| config.vm.box =
|
60
|
-
| config.vm.box_url = "http://files.vagrantup.com/lucid64.box" |
|
27
|
+
| config.omnibus.chef_version = '11.4.4' |
|
28
|
+
| config.vm.box = 'chef/ubuntu-14.04' |
|
61
29
|
| config.vm.network :forwarded_port, guest: 12345, host: 54321 |
|
62
|
-
| config.vm.network :private_network, type:
|
30
|
+
| config.vm.network :private_network, type: 'dhcp' |
|
63
31
|
And the exit status should be 0
|
64
32
|
|
65
33
|
Scenario: Using a Berkshelf configuration file that sets the vagrant-omnibus plugin chef version to latest
|
@@ -68,12 +36,10 @@ Feature: Reading a Berkshelf configuration file
|
|
68
36
|
{
|
69
37
|
"vagrant": {
|
70
38
|
"omnibus": {
|
71
|
-
"enabled": true,
|
72
39
|
"version": "latest"
|
73
40
|
},
|
74
41
|
"vm": {
|
75
|
-
"box": "
|
76
|
-
"box_url": "http://files.vagrantup.com/lucid64.box",
|
42
|
+
"box": "chef/ubuntu-14.04",
|
77
43
|
"forward_port": {
|
78
44
|
"12345": "54321"
|
79
45
|
}
|
@@ -83,11 +49,10 @@ Feature: Reading a Berkshelf configuration file
|
|
83
49
|
"""
|
84
50
|
When I successfully run `berks cookbook sparkle_motion`
|
85
51
|
Then the resulting "sparkle_motion" Vagrantfile should contain:
|
86
|
-
| config.omnibus.chef_version =
|
87
|
-
| config.vm.box =
|
88
|
-
| config.vm.box_url = "http://files.vagrantup.com/lucid64.box" |
|
52
|
+
| config.omnibus.chef_version = 'latest' |
|
53
|
+
| config.vm.box = 'chef/ubuntu-14.04' |
|
89
54
|
| config.vm.network :forwarded_port, guest: 12345, host: 54321 |
|
90
|
-
| config.vm.network :private_network, type:
|
55
|
+
| config.vm.network :private_network, type: 'dhcp' |
|
91
56
|
|
92
57
|
Scenario: Using a partial Berkshelf configuration file
|
93
58
|
Given I have a Berkshelf config file containing:
|
@@ -141,6 +106,6 @@ Feature: Reading a Berkshelf configuration file
|
|
141
106
|
When I successfully run `berks cookbook sparkle_motion`
|
142
107
|
Then the resulting "sparkle_motion" Vagrantfile should contain:
|
143
108
|
| config.vm.provision :chef_client |
|
144
|
-
| chef.chef_server_url =
|
145
|
-
| chef.validation_client_name =
|
146
|
-
| chef.validation_key_path =
|
109
|
+
| chef.chef_server_url = 'localhost:4000' |
|
110
|
+
| chef.validation_client_name = 'my_client-validator' |
|
111
|
+
| chef.validation_key_path = '/a/b/c/my_client-validator.pem' |
|
@@ -266,6 +266,6 @@ end
|
|
266
266
|
Then(/^the directory "(.*?)" should contain version "(.*?)" of the "(.*?)" cookbook$/) do |path, version, name|
|
267
267
|
cookbook_path = File.join(current_dir, path)
|
268
268
|
cookbook = Berkshelf::CachedCookbook.from_path(cookbook_path)
|
269
|
-
expect(cookbook.version).to
|
270
|
-
expect(cookbook.cookbook_name).to
|
269
|
+
expect(cookbook.version).to eq(version)
|
270
|
+
expect(cookbook.cookbook_name).to eq(name)
|
271
271
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
Given /^the gem "(.*)" is not installed$/ do |gem_name|
|
2
|
-
Gem::Specification.
|
2
|
+
allow(Gem::Specification).to receive(:find_by_name)
|
3
|
+
.with(gem_name)
|
4
|
+
.and_raise(Gem::LoadError)
|
3
5
|
end
|
4
6
|
|
5
7
|
Then /^the output should contain a warning to suggest supporting the option "(.*?)" by installing "(.*?)"$/ do |option, gem_name|
|
@@ -2,43 +2,43 @@
|
|
2
2
|
# vi: set ft=ruby :
|
3
3
|
|
4
4
|
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
|
5
|
-
VAGRANTFILE_API_VERSION =
|
5
|
+
VAGRANTFILE_API_VERSION = '2'
|
6
6
|
|
7
|
-
Vagrant.require_version
|
7
|
+
Vagrant.require_version '>= 1.5.0'
|
8
8
|
|
9
9
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
10
10
|
# All Vagrant configuration is done here. The most common configuration
|
11
11
|
# options are documented and commented below. For a complete reference,
|
12
12
|
# please see the online documentation at vagrantup.com.
|
13
13
|
|
14
|
-
config.vm.hostname =
|
14
|
+
config.vm.hostname = '<%= "#{cookbook_name.gsub('_','-')}-berkshelf" %>'
|
15
15
|
|
16
16
|
# Set the version of chef to install using the vagrant-omnibus plugin
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
#config.omnibus.chef_version = :latest
|
25
|
-
<% end -%>
|
17
|
+
# NOTE: You will need to install the vagrant-omnibus plugin:
|
18
|
+
#
|
19
|
+
# $ vagrant plugin install vagrant-omnibus
|
20
|
+
#
|
21
|
+
if Vagrant.has_plugin?
|
22
|
+
config.omnibus.chef_version = '<%= berkshelf_config.vagrant.omnibus.version %>'
|
23
|
+
end
|
26
24
|
|
27
25
|
# Every Vagrant virtual environment requires a box to build off of.
|
28
|
-
# If this value is a shorthand to a box in Vagrant Cloud then
|
26
|
+
# If this value is a shorthand to a box in Vagrant Cloud then
|
29
27
|
# config.vm.box_url doesn't need to be specified.
|
30
|
-
config.vm.box =
|
28
|
+
config.vm.box = '<%= berkshelf_config.vagrant.vm.box %>'
|
31
29
|
|
30
|
+
<% unless berkshelf_config.vagrant.vm.box_url.nil? -%>
|
32
31
|
# The url from where the 'config.vm.box' box will be fetched if it
|
33
|
-
# is not a Vagrant Cloud box and if it doesn't already exist on the
|
32
|
+
# is not a Vagrant Cloud box and if it doesn't already exist on the
|
34
33
|
# user's system.
|
35
|
-
|
34
|
+
config.vm.box_url = '<%= berkshelf_config.vagrant.vm.box_url %>'
|
35
|
+
<% end -%>
|
36
36
|
|
37
37
|
# Assign this VM to a host-only network IP, allowing you to access it
|
38
38
|
# via the IP. Host-only networks can talk to the host machine as well as
|
39
39
|
# any other machines on the same network, but cannot be accessed (through this
|
40
40
|
# network interface) by any external networks.
|
41
|
-
config.vm.network :private_network, type:
|
41
|
+
config.vm.network :private_network, type: 'dhcp'
|
42
42
|
|
43
43
|
# Create a forwarded port mapping which allows access to a specific port
|
44
44
|
# within the machine from a port on the host machine. In the example below,
|
@@ -83,20 +83,20 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
83
83
|
# to skip installing and copying to Vagrant's shelf.
|
84
84
|
# config.berkshelf.except = []
|
85
85
|
|
86
|
-
<% if berkshelf_config.vagrant.vm.provision ==
|
86
|
+
<% if berkshelf_config.vagrant.vm.provision == 'chef_client' -%>
|
87
87
|
config.vm.provision :chef_client do |chef|
|
88
|
-
chef.chef_server_url =
|
89
|
-
chef.validation_client_name =
|
90
|
-
chef.validation_key_path =
|
88
|
+
chef.chef_server_url = '<%= berkshelf_config.chef.chef_server_url %>'
|
89
|
+
chef.validation_client_name = '<%= berkshelf_config.chef.validation_client_name %>'
|
90
|
+
chef.validation_key_path = '<%= berkshelf_config.chef.validation_key_path %>'
|
91
91
|
|
92
92
|
chef.run_list = [
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
93
|
+
<% if options[:chef_minitest] %>
|
94
|
+
'recipe[minitest-handler::default]',
|
95
|
+
<% end -%>
|
96
|
+
'recipe[<%= cookbook_name %>::default]'
|
97
97
|
]
|
98
98
|
end
|
99
|
-
<% elsif berkshelf_config.vagrant.vm.provision ==
|
99
|
+
<% elsif berkshelf_config.vagrant.vm.provision == 'chef_solo' -%>
|
100
100
|
config.vm.provision :chef_solo do |chef|
|
101
101
|
chef.json = {
|
102
102
|
mysql: {
|
@@ -107,10 +107,10 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
107
107
|
}
|
108
108
|
|
109
109
|
chef.run_list = [
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
110
|
+
<% if options[:chef_minitest] %>
|
111
|
+
'recipe[minitest-handler::default]',
|
112
|
+
<% end -%>
|
113
|
+
'recipe[<%= cookbook_name %>::default]'
|
114
114
|
]
|
115
115
|
end
|
116
116
|
<% end -%>
|
data/lib/berkshelf.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'buff/extensions'
|
2
|
+
require 'cleanroom'
|
2
3
|
require 'digest/md5'
|
3
4
|
require 'forwardable'
|
4
5
|
require 'json'
|
@@ -21,11 +22,11 @@ module Berkshelf
|
|
21
22
|
require_relative 'berkshelf/errors'
|
22
23
|
|
23
24
|
module Mixin
|
24
|
-
autoload :DSLEval, 'berkshelf/mixin/dsl_eval'
|
25
25
|
autoload :Git, 'berkshelf/mixin/git'
|
26
26
|
autoload :Logging, 'berkshelf/mixin/logging'
|
27
27
|
end
|
28
28
|
|
29
|
+
autoload :FileSyncer, 'berkshelf/file_syncer'
|
29
30
|
autoload :Shell, 'berkshelf/shell'
|
30
31
|
autoload :Uploader, 'berkshelf/uploader'
|
31
32
|
autoload :Visualizer, 'berkshelf/visualizer'
|
@@ -67,7 +68,8 @@ module Berkshelf
|
|
67
68
|
#
|
68
69
|
# @return [String]
|
69
70
|
def berkshelf_path
|
70
|
-
@berkshelf_path || ENV['BERKSHELF_PATH'] ||
|
71
|
+
path = @berkshelf_path || ENV['BERKSHELF_PATH'] || '~/.berkshelf'
|
72
|
+
File.expand_path(path)
|
71
73
|
end
|
72
74
|
|
73
75
|
# The Berkshelf configuration.
|
@@ -218,6 +220,7 @@ require_relative 'berkshelf/logger'
|
|
218
220
|
require_relative 'berkshelf/resolver'
|
219
221
|
require_relative 'berkshelf/source'
|
220
222
|
require_relative 'berkshelf/source_uri'
|
223
|
+
require_relative 'berkshelf/validator'
|
221
224
|
|
222
225
|
Ridley.logger = Berkshelf.logger
|
223
226
|
Berkshelf.logger.level = Logger::WARN
|
data/lib/berkshelf/berksfile.rb
CHANGED
@@ -20,7 +20,7 @@ module Berkshelf
|
|
20
20
|
raise BerksfileNotFound.new(file) unless File.exist?(file)
|
21
21
|
|
22
22
|
begin
|
23
|
-
new(file, options).
|
23
|
+
new(file, options).evaluate_file(file)
|
24
24
|
rescue => ex
|
25
25
|
raise BerksfileReadError.new(ex)
|
26
26
|
end
|
@@ -30,17 +30,9 @@ module Berkshelf
|
|
30
30
|
DEFAULT_API_URL = "https://supermarket.getchef.com".freeze
|
31
31
|
|
32
32
|
include Mixin::Logging
|
33
|
-
include
|
33
|
+
include Cleanroom
|
34
34
|
extend Forwardable
|
35
35
|
|
36
|
-
expose_method :source
|
37
|
-
expose_method :site # @todo remove in Berkshelf 4.0
|
38
|
-
expose_method :chef_api # @todo remove in Berkshelf 4.0
|
39
|
-
expose_method :extension
|
40
|
-
expose_method :metadata
|
41
|
-
expose_method :cookbook
|
42
|
-
expose_method :group
|
43
|
-
|
44
36
|
# @return [String]
|
45
37
|
# The path on disk to the file representing this instance of Berksfile
|
46
38
|
attr_reader :filepath
|
@@ -93,6 +85,7 @@ module Berkshelf
|
|
93
85
|
raise LoadError, "Could not load an extension by the name `#{name}'. " \
|
94
86
|
"Please make sure it is installed."
|
95
87
|
end
|
88
|
+
expose :extension
|
96
89
|
|
97
90
|
# Add a cookbook dependency to the Berksfile to be retrieved and have its dependencies recursively retrieved
|
98
91
|
# and resolved.
|
@@ -144,12 +137,14 @@ module Berkshelf
|
|
144
137
|
|
145
138
|
add_dependency(name, constraint, options)
|
146
139
|
end
|
140
|
+
expose :cookbook
|
147
141
|
|
148
142
|
def group(*args)
|
149
143
|
@active_group = args
|
150
144
|
yield
|
151
145
|
@active_group = nil
|
152
146
|
end
|
147
|
+
expose :group
|
153
148
|
|
154
149
|
# Use a Cookbook metadata file to determine additional cookbook dependencies to retrieve. All
|
155
150
|
# dependencies found in the metadata will use the default locations set in the Berksfile (if any are set)
|
@@ -166,6 +161,7 @@ module Berkshelf
|
|
166
161
|
|
167
162
|
add_dependency(metadata.name, nil, path: path, metadata: true)
|
168
163
|
end
|
164
|
+
expose :metadata
|
169
165
|
|
170
166
|
# Add a Berkshelf API source to use when building the index of known cookbooks. The indexes will be
|
171
167
|
# searched in the order they are added. If a cookbook is found in the first source then a cookbook
|
@@ -184,6 +180,7 @@ module Berkshelf
|
|
184
180
|
def source(api_url)
|
185
181
|
@sources[api_url] = Source.new(api_url)
|
186
182
|
end
|
183
|
+
expose :source
|
187
184
|
|
188
185
|
# @return [Array<Source>]
|
189
186
|
def sources
|
@@ -217,6 +214,7 @@ module Berkshelf
|
|
217
214
|
" replaced by the source location. Please remove your site location and try again. For more information " +
|
218
215
|
" visit https://github.com/berkshelf/berkshelf/wiki/deprecated-locations"
|
219
216
|
end
|
217
|
+
expose :site
|
220
218
|
|
221
219
|
# @todo remove in Berkshelf 4.0
|
222
220
|
#
|
@@ -226,6 +224,7 @@ module Berkshelf
|
|
226
224
|
" been replaced by the source location. Please remove your site location and try again. For more " +
|
227
225
|
" information visit https://github.com/berkshelf/berkshelf/wiki/deprecated-locations"
|
228
226
|
end
|
227
|
+
expose :chef_api
|
229
228
|
|
230
229
|
# Add a dependency of the given name and constraint to the array of dependencies.
|
231
230
|
#
|
@@ -566,8 +565,8 @@ module Berkshelf
|
|
566
565
|
outdir
|
567
566
|
end
|
568
567
|
|
569
|
-
# Install the Berksfile or Berksfile.lock and then
|
570
|
-
# directories within the given destination matching their name.
|
568
|
+
# Install the Berksfile or Berksfile.lock and then sync the cached cookbooks
|
569
|
+
# into directories within the given destination matching their name.
|
571
570
|
#
|
572
571
|
# @param [String] destination
|
573
572
|
# filepath to vendor cookbooks to
|
@@ -575,16 +574,6 @@ module Berkshelf
|
|
575
574
|
# @return [String, nil]
|
576
575
|
# the expanded path cookbooks were vendored to or nil if nothing was vendored
|
577
576
|
def vendor(destination)
|
578
|
-
destination = File.expand_path(destination)
|
579
|
-
|
580
|
-
if Dir.exist?(destination)
|
581
|
-
raise VendorError, "destination already exists #{destination}. Delete it and try again or use a " +
|
582
|
-
"different filepath."
|
583
|
-
end
|
584
|
-
|
585
|
-
# Ensure the parent directory exists, in case a nested path was given
|
586
|
-
FileUtils.mkdir_p(File.expand_path(File.join(destination, '..')))
|
587
|
-
|
588
577
|
scratch = Berkshelf.mktmpdir
|
589
578
|
chefignore = nil
|
590
579
|
cached_cookbooks = install
|
@@ -593,12 +582,12 @@ module Berkshelf
|
|
593
582
|
|
594
583
|
cached_cookbooks.each do |cookbook|
|
595
584
|
Berkshelf.formatter.vendor(cookbook, destination)
|
596
|
-
cookbook_destination = File.join(scratch, cookbook.cookbook_name
|
585
|
+
cookbook_destination = File.join(scratch, cookbook.cookbook_name)
|
597
586
|
FileUtils.mkdir_p(cookbook_destination)
|
598
587
|
|
599
588
|
# Dir.glob does not support backslash as a File separator
|
600
589
|
src = cookbook.path.to_s.gsub('\\', '/')
|
601
|
-
files =
|
590
|
+
files = FileSyncer.glob(File.join(src, '*'))
|
602
591
|
|
603
592
|
chefignore = Ridley::Chef::Chefignore.new(cookbook.path.to_s) rescue nil
|
604
593
|
chefignore.apply!(files) if chefignore
|
@@ -607,30 +596,41 @@ module Berkshelf
|
|
607
596
|
cookbook.compile_metadata(cookbook_destination)
|
608
597
|
end
|
609
598
|
|
610
|
-
# Don't vendor the raw metadata (metadata.rb). The raw metadata is unecessary for the
|
611
|
-
# client, and this is required until compiled metadata (metadata.json) takes precedence over
|
612
|
-
# raw metadata in the Chef-Client.
|
613
|
-
#
|
614
|
-
# We can change back to including the raw metadata in the future after this has been fixed or
|
615
|
-
# just remove these comments. There is no circumstance that I can currently think of where
|
616
|
-
# raw metadata should ever be read by the client.
|
617
|
-
#
|
618
|
-
# - Jamie
|
619
|
-
#
|
620
|
-
# See the following tickets for more information:
|
621
|
-
# * https://tickets.opscode.com/browse/CHEF-4811
|
622
|
-
# * https://tickets.opscode.com/browse/CHEF-4810
|
623
|
-
files.reject! { |file| File.basename(file) == "metadata.rb" }
|
624
|
-
|
625
599
|
FileUtils.cp_r(files, cookbook_destination)
|
626
600
|
end
|
627
601
|
|
628
|
-
|
602
|
+
# Don't vendor the raw metadata (metadata.rb). The raw metadata is
|
603
|
+
# unecessary for the client, and this is required until compiled metadata
|
604
|
+
# (metadata.json) takes precedence over raw metadata in the Chef-Client.
|
605
|
+
#
|
606
|
+
# We can change back to including the raw metadata in the future after
|
607
|
+
# this has been fixed or just remove these comments. There is no
|
608
|
+
# circumstance that I can currently think of where raw metadata should
|
609
|
+
# ever be read by the client.
|
610
|
+
#
|
611
|
+
# - Jamie
|
612
|
+
#
|
613
|
+
# See the following tickets for more information:
|
614
|
+
#
|
615
|
+
# * https://tickets.opscode.com/browse/CHEF-4811
|
616
|
+
# * https://tickets.opscode.com/browse/CHEF-4810
|
617
|
+
FileSyncer.sync(scratch, destination, exclude: ["**/*/metadata.rb"])
|
629
618
|
|
630
|
-
FileUtils.mv(scratch, destination)
|
631
619
|
destination
|
632
620
|
end
|
633
621
|
|
622
|
+
# Perform a validation with `Validator#validate` on each cached cookbook associated
|
623
|
+
# with the Lockfile of this Berksfile.
|
624
|
+
#
|
625
|
+
# This function will return true or raise the first errors encountered.
|
626
|
+
def verify
|
627
|
+
validate_lockfile_present!
|
628
|
+
validate_lockfile_trusted!
|
629
|
+
Berkshelf.formatter.msg "Verifying (#{lockfile.cached.length}) cookbook(s)..."
|
630
|
+
Validator.validate(lockfile.cached)
|
631
|
+
true
|
632
|
+
end
|
633
|
+
|
634
634
|
# Visualize the current Berksfile as a "graph" using DOT.
|
635
635
|
#
|
636
636
|
# @param [String] outfile
|