berkshelf 2.0.0.beta → 2.0.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.
- data/CHANGELOG.md +19 -1
- data/CONTRIBUTING.md +1 -3
- data/Gemfile +0 -20
- data/Guardfile +3 -3
- data/LICENSE +6 -5
- data/README.md +1 -0
- data/Thorfile +48 -67
- data/berkshelf.gemspec +48 -37
- data/features/apply_command.feature +17 -11
- data/features/config.feature +11 -11
- data/features/configure_command.feature +8 -8
- data/features/contingent_command.feature +37 -8
- data/features/cookbook_command.feature +17 -14
- data/features/groups_install.feature +24 -20
- data/features/install_command.feature +24 -33
- data/features/licenses.feature +112 -0
- data/features/list_command.feature +17 -5
- data/features/lockfile.feature +307 -188
- data/features/outdated_command.feature +1 -4
- data/features/package_command.feature +41 -19
- data/features/shelf/list.feature +39 -0
- data/features/shelf/show.feature +152 -0
- data/features/shelf/uninstall.feature +103 -0
- data/features/show_command.feature +49 -17
- data/features/step_definitions/filesystem_steps.rb +12 -3
- data/features/step_definitions/utility_steps.rb +0 -1
- data/features/support/env.rb +11 -4
- data/features/update_command.feature +22 -10
- data/features/upload_command.feature +174 -127
- data/features/vendor_install.feature +6 -6
- data/generator_files/Berksfile.erb +1 -1
- data/generator_files/metadata.rb.erb +7 -7
- data/lib/berkshelf.rb +39 -27
- data/lib/berkshelf/base_generator.rb +2 -3
- data/lib/berkshelf/berksfile.rb +69 -17
- data/lib/berkshelf/cached_cookbook.rb +17 -1
- data/lib/berkshelf/chef.rb +2 -4
- data/lib/berkshelf/chef/config.rb +51 -75
- data/lib/berkshelf/chef/cookbook.rb +1 -2
- data/lib/berkshelf/chef/cookbook/chefignore.rb +1 -1
- data/lib/berkshelf/cli.rb +144 -194
- data/lib/berkshelf/command.rb +11 -12
- data/lib/berkshelf/commands/shelf.rb +130 -0
- data/lib/berkshelf/commands/test_command.rb +11 -0
- data/lib/berkshelf/community_rest.rb +1 -2
- data/lib/berkshelf/config.rb +14 -10
- data/lib/berkshelf/cookbook_generator.rb +30 -24
- data/lib/berkshelf/cookbook_source.rb +1 -1
- data/lib/berkshelf/cookbook_store.rb +0 -1
- data/lib/berkshelf/core_ext.rb +1 -1
- data/lib/berkshelf/core_ext/file.rb +1 -1
- data/lib/berkshelf/downloader.rb +3 -1
- data/lib/berkshelf/errors.rb +128 -53
- data/lib/berkshelf/formatters.rb +2 -6
- data/lib/berkshelf/formatters/human_readable.rb +8 -2
- data/lib/berkshelf/formatters/json.rb +7 -1
- data/lib/berkshelf/formatters/null.rb +0 -1
- data/lib/berkshelf/git.rb +16 -16
- data/lib/berkshelf/init_generator.rb +28 -26
- data/lib/berkshelf/location.rb +12 -11
- data/lib/berkshelf/locations/chef_api_location.rb +2 -2
- data/lib/berkshelf/locations/git_location.rb +0 -1
- data/lib/berkshelf/locations/github_location.rb +0 -1
- data/lib/berkshelf/locations/path_location.rb +1 -2
- data/lib/berkshelf/locations/site_location.rb +3 -2
- data/lib/berkshelf/lockfile.rb +29 -10
- data/lib/berkshelf/mixin/config.rb +155 -0
- data/lib/berkshelf/mixin/logging.rb +0 -1
- data/lib/berkshelf/mixin/shellout.rb +71 -0
- data/lib/berkshelf/resolver.rb +7 -4
- data/lib/berkshelf/test.rb +1 -3
- data/lib/berkshelf/ui.rb +8 -4
- data/lib/berkshelf/version.rb +1 -1
- data/lib/thor/monkies/shell.rb +0 -1
- data/spec/config/berkshelf.pem +27 -0
- data/spec/config/knife.rb +12 -0
- data/spec/config/validator.pem +27 -0
- data/spec/spec_helper.rb +4 -8
- data/spec/support/chef_api.rb +14 -9
- data/spec/support/chef_server.rb +3 -4
- data/spec/unit/berkshelf/berksfile_spec.rb +1 -1
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +12 -6
- data/spec/unit/berkshelf/cookbook_source_spec.rb +13 -1
- data/spec/unit/berkshelf/init_generator_spec.rb +5 -0
- data/spec/unit/chef/config_spec.rb +9 -10
- metadata +216 -93
- data/features/info_command.feature +0 -39
- data/features/open_command.feature +0 -36
- data/lib/berkshelf/cli_commands/test_command.rb +0 -11
- data/lib/berkshelf/mixin.rb +0 -10
- data/lib/berkshelf/mixin/path_helpers.rb +0 -30
- data/spec/support/knife.rb +0 -18
data/lib/berkshelf/formatters.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
module Berkshelf
|
2
|
-
# @author Michael Ivey <michael.ivey@riotgames.com>
|
3
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
4
2
|
module Formatters
|
5
3
|
class << self
|
6
4
|
@@formatters = Hash.new
|
@@ -47,8 +45,6 @@ module Berkshelf
|
|
47
45
|
alias_method :[], :get
|
48
46
|
end
|
49
47
|
|
50
|
-
# @author Michael Ivey <michael.ivey@riotgames.com>
|
51
|
-
#
|
52
48
|
# @abstract Include and override {#install} {#use} {#upload}
|
53
49
|
# {#msg} {#error} to implement.
|
54
50
|
#
|
@@ -81,7 +77,7 @@ module Berkshelf
|
|
81
77
|
end
|
82
78
|
end
|
83
79
|
|
84
|
-
formatter_methods :install, :use, :upload, :msg, :error, :package
|
80
|
+
formatter_methods :install, :use, :upload, :msg, :error, :package, :show
|
85
81
|
|
86
82
|
def cleanup_hook
|
87
83
|
# run after the task is finished
|
@@ -95,5 +91,5 @@ module Berkshelf
|
|
95
91
|
end
|
96
92
|
|
97
93
|
Dir["#{File.dirname(__FILE__)}/formatters/*.rb"].sort.each do |path|
|
98
|
-
|
94
|
+
require_relative "formatters/#{File.basename(path, '.rb')}"
|
99
95
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Berkshelf
|
2
2
|
module Formatters
|
3
|
-
# @author Michael Ivey <michael.ivey@riotgames.com>
|
4
3
|
class HumanReadable
|
5
4
|
include AbstractFormatter
|
6
5
|
|
@@ -38,7 +37,14 @@ module Berkshelf
|
|
38
37
|
# @param [String] cookbook
|
39
38
|
# @param [String] destination
|
40
39
|
def package(cookbook, destination)
|
41
|
-
Berkshelf.ui.info "Cookbook
|
40
|
+
Berkshelf.ui.info "Cookbook(s) packaged to #{destination}!"
|
41
|
+
end
|
42
|
+
|
43
|
+
# Output Cookbook info message using {Berkshelf.ui}
|
44
|
+
#
|
45
|
+
# @param [CachedCookbook] cookbook
|
46
|
+
def show(cookbook)
|
47
|
+
Berkshelf.ui.info(cookbook.pretty_print)
|
42
48
|
end
|
43
49
|
|
44
50
|
# Output a generic message using {Berkshelf.ui}
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Berkshelf
|
2
2
|
module Formatters
|
3
|
-
# @author Michael Ivey <michael.ivey@riotgames.com>
|
4
3
|
class JSON
|
5
4
|
include AbstractFormatter
|
6
5
|
|
@@ -69,6 +68,13 @@ module Berkshelf
|
|
69
68
|
cookbooks[cookbook][:destination] = destination
|
70
69
|
end
|
71
70
|
|
71
|
+
# Output Cookbook info entry to delayed output
|
72
|
+
#
|
73
|
+
# @param [CachedCookbook] cookbook
|
74
|
+
def show(cookbook)
|
75
|
+
cookbooks[cookbook.cookbook_name] = cookbook.pretty_hash
|
76
|
+
end
|
77
|
+
|
72
78
|
# Add a generic message entry to delayed output
|
73
79
|
#
|
74
80
|
# @param [String] message
|
data/lib/berkshelf/git.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'uri'
|
2
|
-
require 'mixlib/shellout'
|
3
2
|
|
4
3
|
module Berkshelf
|
5
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
6
4
|
class Git
|
5
|
+
require 'berkshelf/mixin/shellout'
|
6
|
+
extend Berkshelf::Mixin::Shellout
|
7
|
+
|
7
8
|
GIT_REGEXP = URI.regexp(%w(http https ssh git+ssh git rsync))
|
8
9
|
SCP_REGEXP = /^(.+@)?[\w\d\.-]+:.*$/
|
9
10
|
|
@@ -21,14 +22,13 @@ module Berkshelf
|
|
21
22
|
def git(*command)
|
22
23
|
command.unshift(git_cmd)
|
23
24
|
command_str = command.map { |p| quote_cmd_arg(p) }.join(' ')
|
24
|
-
|
25
|
-
cmd.run_command
|
25
|
+
result = shellout(command_str)
|
26
26
|
|
27
|
-
unless
|
28
|
-
raise GitError.new(
|
27
|
+
unless result.success?
|
28
|
+
raise GitError.new(result.stderr)
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
result.stdout
|
32
32
|
end
|
33
33
|
|
34
34
|
# Clone a remote Git repository to disk
|
@@ -41,7 +41,7 @@ module Berkshelf
|
|
41
41
|
# @return [String]
|
42
42
|
# the destination the URI was cloned to
|
43
43
|
def clone(uri, destination = Dir.mktmpdir)
|
44
|
-
git(
|
44
|
+
git('clone', uri, destination.to_s)
|
45
45
|
|
46
46
|
destination
|
47
47
|
end
|
@@ -54,14 +54,14 @@ module Berkshelf
|
|
54
54
|
# reference to checkout
|
55
55
|
def checkout(repo_path, ref)
|
56
56
|
Dir.chdir repo_path do
|
57
|
-
git(
|
57
|
+
git('checkout', '-qf', revision_from_ref(repo_path, ref))
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
# @param [String] repo_path
|
62
62
|
def rev_parse(repo_path)
|
63
63
|
Dir.chdir repo_path do
|
64
|
-
git(
|
64
|
+
git('rev-parse', 'HEAD')
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -78,7 +78,7 @@ module Berkshelf
|
|
78
78
|
# @raise [AmbiguousGitRef] if the ref could refer to more than one revision
|
79
79
|
def show_ref(repo_path, ref)
|
80
80
|
Dir.chdir repo_path do
|
81
|
-
lines = git('show-ref',
|
81
|
+
lines = git('show-ref', ref).lines.to_a
|
82
82
|
|
83
83
|
raise AmbiguousGitRef, ref if lines.size > 1
|
84
84
|
|
@@ -121,7 +121,7 @@ module Berkshelf
|
|
121
121
|
# @raise [GitNotFound] if executable is not found in system path
|
122
122
|
def find_git
|
123
123
|
git_path = nil
|
124
|
-
ENV[
|
124
|
+
ENV['PATH'].split(::File::PATH_SEPARATOR).each do |path|
|
125
125
|
git_path = detect_git_path(path)
|
126
126
|
break if git_path
|
127
127
|
end
|
@@ -138,11 +138,11 @@ module Berkshelf
|
|
138
138
|
# SSH protocol, or HTTPS protocol.
|
139
139
|
#
|
140
140
|
# @example Valid Git protocol URI
|
141
|
-
#
|
141
|
+
# 'git://github.com/reset/thor-foodcritic.git'
|
142
142
|
# @example Valid HTTPS URI
|
143
|
-
#
|
143
|
+
# 'https://github.com/reset/solve.git'
|
144
144
|
# @example Valid SSH protocol URI
|
145
|
-
#
|
145
|
+
# 'git@github.com:reset/solve.git'
|
146
146
|
#
|
147
147
|
# @param [String] uri
|
148
148
|
#
|
@@ -188,7 +188,7 @@ module Berkshelf
|
|
188
188
|
end
|
189
189
|
|
190
190
|
def detect_git_path(base_dir)
|
191
|
-
%w
|
191
|
+
%w(git git.exe git.cmd).each do |git_cmd|
|
192
192
|
potential_path = File.join(base_dir, git_cmd)
|
193
193
|
if File.executable?(potential_path)
|
194
194
|
return potential_path
|
@@ -1,6 +1,6 @@
|
|
1
|
+
require 'kitchen/generator/init'
|
2
|
+
|
1
3
|
module Berkshelf
|
2
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
3
|
-
# @author Josiah Kiehl <jkiehl@riotgames.com>
|
4
4
|
class InitGenerator < BaseGenerator
|
5
5
|
def initialize(*args)
|
6
6
|
super(*args)
|
@@ -20,17 +20,17 @@ module Berkshelf
|
|
20
20
|
class_option :skip_vagrant,
|
21
21
|
type: :boolean,
|
22
22
|
default: false,
|
23
|
-
desc:
|
23
|
+
desc: 'Skips adding a Vagrantfile and adding supporting gems to the Gemfile'
|
24
24
|
|
25
25
|
class_option :skip_git,
|
26
26
|
type: :boolean,
|
27
27
|
default: false,
|
28
|
-
desc:
|
28
|
+
desc: 'Skips adding a .gitignore and running git init in the cookbook directory'
|
29
29
|
|
30
30
|
class_option :foodcritic,
|
31
31
|
type: :boolean,
|
32
32
|
default: false,
|
33
|
-
desc:
|
33
|
+
desc: 'Creates a Thorfile with Foodcritic support to lint test your cookbook'
|
34
34
|
|
35
35
|
class_option :chef_minitest,
|
36
36
|
type: :boolean,
|
@@ -39,12 +39,12 @@ module Berkshelf
|
|
39
39
|
class_option :scmversion,
|
40
40
|
type: :boolean,
|
41
41
|
default: false,
|
42
|
-
desc:
|
42
|
+
desc: 'Creates a Thorfile with SCMVersion support to manage versions for continuous integration'
|
43
43
|
|
44
44
|
class_option :no_bundler,
|
45
45
|
type: :boolean,
|
46
46
|
default: false,
|
47
|
-
desc:
|
47
|
+
desc: 'Skips generation of a Gemfile and other Bundler specific support'
|
48
48
|
|
49
49
|
class_option :cookbook_name,
|
50
50
|
type: :string
|
@@ -52,53 +52,55 @@ module Berkshelf
|
|
52
52
|
class_option :skip_test_kitchen,
|
53
53
|
type: :boolean,
|
54
54
|
default: false,
|
55
|
-
desc:
|
55
|
+
desc: 'Skip adding a testing environment to your cookbook'
|
56
56
|
|
57
57
|
def generate
|
58
58
|
validate_configuration
|
59
59
|
check_option_support
|
60
60
|
|
61
|
-
template
|
61
|
+
template 'Berksfile.erb', target.join('Berksfile')
|
62
|
+
template 'Thorfile.erb', target.join('Thorfile')
|
62
63
|
|
63
64
|
if options[:chefignore]
|
64
|
-
copy_file
|
65
|
+
copy_file 'chefignore', target.join(Berkshelf::Chef::Cookbook::Chefignore::FILENAME)
|
65
66
|
end
|
66
67
|
|
67
68
|
unless options[:skip_git]
|
68
|
-
template
|
69
|
+
template 'gitignore.erb', target.join('.gitignore')
|
69
70
|
|
70
|
-
unless File.exists?(target.join(
|
71
|
+
unless File.exists?(target.join('.git'))
|
71
72
|
inside target do
|
72
|
-
run
|
73
|
+
run 'git init', capture: true
|
73
74
|
end
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
77
|
-
if options[:foodcritic] || options[:scmversion]
|
78
|
-
template "Thorfile.erb", target.join("Thorfile")
|
79
|
-
end
|
80
|
-
|
81
78
|
if options[:chef_minitest]
|
82
|
-
empty_directory target.join(
|
83
|
-
template
|
84
|
-
template
|
79
|
+
empty_directory target.join('files/default/tests/minitest/support')
|
80
|
+
template 'default_test.rb.erb', target.join('files/default/tests/minitest/default_test.rb')
|
81
|
+
template 'helpers.rb.erb', target.join('files/default/tests/minitest/support/helpers.rb')
|
85
82
|
end
|
86
83
|
|
87
84
|
if options[:scmversion]
|
88
|
-
create_file target.join(
|
85
|
+
create_file target.join('VERSION'), '0.1.0'
|
89
86
|
end
|
90
87
|
|
91
88
|
unless options[:no_bundler]
|
92
|
-
template
|
89
|
+
template 'Gemfile.erb', target.join('Gemfile')
|
93
90
|
end
|
94
91
|
|
95
92
|
unless options[:skip_test_kitchen]
|
96
|
-
|
93
|
+
# Temporarily use Dir.chdir to ensure the destionation_root of test kitchen's generator
|
94
|
+
# is where we expect until this bug can be addressed:
|
95
|
+
# https://github.com/opscode/test-kitchen/pull/140
|
96
|
+
Dir.chdir target do
|
97
|
+
# Kitchen::Generator::Init.new([], {}, destination_root: target).invoke_all
|
98
|
+
Kitchen::Generator::Init.new([], {}).invoke_all
|
99
|
+
end
|
97
100
|
end
|
98
101
|
|
99
102
|
unless options[:skip_vagrant]
|
100
|
-
template
|
101
|
-
::Berkshelf::Cli.new([], berksfile: target.join("Berksfile")).invoke(:install)
|
103
|
+
template 'Vagrantfile.erb', target.join('Vagrantfile')
|
102
104
|
end
|
103
105
|
end
|
104
106
|
|
@@ -114,7 +116,7 @@ module Berkshelf
|
|
114
116
|
# name of the cookbook
|
115
117
|
def cookbook_name
|
116
118
|
@cookbook_name ||= begin
|
117
|
-
metadata = Ridley::Chef::Cookbook::Metadata.from_file(target.join(
|
119
|
+
metadata = Ridley::Chef::Cookbook::Metadata.from_file(target.join('metadata.rb').to_s)
|
118
120
|
metadata.name.empty? ? File.basename(target) : metadata.name
|
119
121
|
rescue CookbookNotFound, IOError
|
120
122
|
File.basename(target)
|
data/lib/berkshelf/location.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module Berkshelf
|
2
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
3
2
|
module Location
|
4
3
|
OPSCODE_COMMUNITY_API = 'http://cookbooks.opscode.com/api/v1/cookbooks'.freeze
|
5
4
|
|
6
5
|
module ClassMethods
|
6
|
+
require_relative 'cookbook_source'
|
7
|
+
|
7
8
|
# Returns the location identifier key for the class
|
8
9
|
#
|
9
10
|
# @return [Symbol]
|
@@ -31,14 +32,14 @@ module Berkshelf
|
|
31
32
|
# version of the Cookbook can be downloaded from
|
32
33
|
#
|
33
34
|
# @example:
|
34
|
-
# constraint = Solve::Constraint.new(
|
35
|
+
# constraint = Solve::Constraint.new('~> 0.101.2')
|
35
36
|
# versions = {
|
36
|
-
#
|
37
|
-
#
|
37
|
+
# '1.0.0' => 'http://cookbooks.opscode.com/api/v1/cookbooks/nginx/versions/1_0_0',
|
38
|
+
# '2.0.0' => 'http://cookbooks.opscode.com/api/v1/cookbooks/nginx/versions/2_0_0'
|
38
39
|
# }
|
39
40
|
#
|
40
41
|
# subject.solve_for_constraint(versions, constraint) =>
|
41
|
-
# [
|
42
|
+
# [ '2.0.0', 'http://cookbooks.opscode.com/api/v1/cookbooks/nginx/versions/2_0_0' ]
|
42
43
|
#
|
43
44
|
# @param [String, Solve::Constraint] constraint
|
44
45
|
# version constraint to solve for
|
@@ -71,19 +72,19 @@ module Berkshelf
|
|
71
72
|
# instantiated.
|
72
73
|
#
|
73
74
|
# @example
|
74
|
-
# Location.init(
|
75
|
+
# Location.init('nginx', '>= 0.0.0', git: 'git://github.com/RiotGames/artifact-cookbook.git') =>
|
75
76
|
# instantiates a GitLocation
|
76
77
|
#
|
77
|
-
# Location.init(
|
78
|
+
# Location.init('nginx', '>= 0.0.0', path: '/Users/reset/code/nginx-cookbook') =>
|
78
79
|
# instantiates a PathLocation
|
79
80
|
#
|
80
|
-
# Location.init(
|
81
|
+
# Location.init('nginx', '>= 0.0.0', site: 'http://cookbooks.opscode.com/api/v1/cookbooks') =>
|
81
82
|
# instantiates a SiteLocation
|
82
83
|
#
|
83
|
-
# Location.init(
|
84
|
+
# Location.init('nginx', '>= 0.0.0', chef_api: 'https://api.opscode.com/organizations/vialstudios') =>
|
84
85
|
# instantiates a ChefAPILocation
|
85
86
|
#
|
86
|
-
# Location.init(
|
87
|
+
# Location.init('nginx', '>= 0.0.0') =>
|
87
88
|
# instantiates a SiteLocation
|
88
89
|
#
|
89
90
|
# @param [String] name
|
@@ -179,5 +180,5 @@ module Berkshelf
|
|
179
180
|
end
|
180
181
|
|
181
182
|
Dir["#{File.dirname(__FILE__)}/locations/*.rb"].sort.each do |path|
|
182
|
-
|
183
|
+
require_relative "locations/#{File.basename(path, '.rb')}"
|
183
184
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Berkshelf
|
2
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
3
2
|
class ChefAPILocation
|
4
3
|
class << self
|
5
4
|
# @return [Proc]
|
@@ -174,7 +173,8 @@ module Berkshelf
|
|
174
173
|
else
|
175
174
|
conn.cookbook.latest_version(name)
|
176
175
|
end
|
177
|
-
rescue Ridley::Errors::HTTPNotFound
|
176
|
+
rescue Ridley::Errors::HTTPNotFound,
|
177
|
+
Ridley::Errors::ResourceNotFound
|
178
178
|
@target_cookbook = nil
|
179
179
|
end
|
180
180
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Berkshelf
|
2
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
3
2
|
class PathLocation
|
4
3
|
class << self
|
5
4
|
# Expand and return a string representation of the given path if it is
|
@@ -12,7 +11,7 @@ module Berkshelf
|
|
12
11
|
# @return [String]
|
13
12
|
def normalize_path(path)
|
14
13
|
path = path.to_s
|
15
|
-
if (path[0] ==
|
14
|
+
if (path[0] == '~') || Pathname.new(path).absolute?
|
16
15
|
File.expand_path(path)
|
17
16
|
else
|
18
17
|
path
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Berkshelf
|
2
|
-
# @author Jamie Winsor <reset@riotgames.com>
|
3
2
|
class SiteLocation
|
4
3
|
extend Forwardable
|
5
4
|
include Location
|
@@ -22,7 +21,9 @@ module Berkshelf
|
|
22
21
|
@name = name
|
23
22
|
@version_constraint = version_constraint
|
24
23
|
|
25
|
-
api_uri = if options[:site].nil?
|
24
|
+
api_uri = if options[:site].nil?
|
25
|
+
SHORTNAMES[:opscode]
|
26
|
+
elsif SHORTNAMES.has_key?(options[:site])
|
26
27
|
SHORTNAMES[options[:site]]
|
27
28
|
elsif options[:site].kind_of?(Symbol)
|
28
29
|
raise InvalidSiteShortnameError.new(options[:site])
|
data/lib/berkshelf/lockfile.rb
CHANGED
@@ -2,9 +2,9 @@ module Berkshelf
|
|
2
2
|
# The object representation of the Berkshelf lockfile. The lockfile is useful
|
3
3
|
# when working in teams where the same cookbook versions are desired across
|
4
4
|
# multiple workstations.
|
5
|
-
#
|
6
|
-
# @author Seth Vargo <sethvargo@gmail.com>
|
7
5
|
class Lockfile
|
6
|
+
require_relative 'cookbook_source'
|
7
|
+
|
8
8
|
# @return [Pathname]
|
9
9
|
# the path to this Lockfile
|
10
10
|
attr_reader :filepath
|
@@ -39,8 +39,8 @@ module Berkshelf
|
|
39
39
|
hash = JSON.parse(contents, symbolize_names: true)
|
40
40
|
rescue JSON::ParserError
|
41
41
|
if contents =~ /^cookbook ["'](.+)["']/
|
42
|
-
Berkshelf.ui.warn
|
43
|
-
hash = LockfileLegacy.parse(contents)
|
42
|
+
Berkshelf.ui.warn 'You are using the old lockfile format. Attempting to convert...'
|
43
|
+
hash = LockfileLegacy.parse(berksfile, contents)
|
44
44
|
else
|
45
45
|
raise
|
46
46
|
end
|
@@ -194,20 +194,23 @@ module Berkshelf
|
|
194
194
|
|
195
195
|
# Legacy support for old lockfiles
|
196
196
|
#
|
197
|
-
# @
|
198
|
-
# @todo Remove this class in the next major release.
|
197
|
+
# @todo Remove this class in Berkshelf 3.0.0
|
199
198
|
class LockfileLegacy
|
199
|
+
require 'pathname'
|
200
|
+
|
200
201
|
class << self
|
201
202
|
# Read the old lockfile content and instance eval in context.
|
202
203
|
#
|
204
|
+
# @param [Berkshelf::Berksfile] berksfile
|
205
|
+
# the associated berksfile
|
203
206
|
# @param [String] content
|
204
207
|
# the string content read from a legacy lockfile
|
205
|
-
def parse(content)
|
208
|
+
def parse(berksfile, content)
|
206
209
|
sources = {}.tap do |hash|
|
207
210
|
content.split("\n").each do |line|
|
208
211
|
next if line.empty?
|
209
212
|
|
210
|
-
source = self.new(line)
|
213
|
+
source = self.new(berksfile, line)
|
211
214
|
hash[source.name] = source.options
|
212
215
|
end
|
213
216
|
end
|
@@ -227,11 +230,16 @@ module Berkshelf
|
|
227
230
|
# the name of this cookbook
|
228
231
|
attr_reader :name
|
229
232
|
|
233
|
+
# @return [Berkshelf::Berksfile]
|
234
|
+
# the berksfile
|
235
|
+
attr_reader :berksfile
|
236
|
+
|
230
237
|
# Create a new legacy lockfile for processing
|
231
238
|
#
|
232
239
|
# @param [String] content
|
233
240
|
# the content to parse out and convert to a hash
|
234
|
-
def initialize(content)
|
241
|
+
def initialize(berksfile, content)
|
242
|
+
@berksfile = berksfile
|
235
243
|
instance_eval(content).to_hash
|
236
244
|
end
|
237
245
|
|
@@ -244,8 +252,19 @@ module Berkshelf
|
|
244
252
|
# the locked version of this cookbook
|
245
253
|
def cookbook(name, options = {})
|
246
254
|
@name = name
|
247
|
-
@options = options
|
255
|
+
@options = manipulate(options)
|
248
256
|
end
|
257
|
+
|
258
|
+
private
|
259
|
+
# Perform various manipulations on the hash.
|
260
|
+
#
|
261
|
+
# @param [Hash] options
|
262
|
+
def manipulate(options = {})
|
263
|
+
if options[:path]
|
264
|
+
options[:path] = berksfile.find(name).instance_variable_get(:@options)[:path] || options[:path]
|
265
|
+
end
|
266
|
+
options
|
267
|
+
end
|
249
268
|
end
|
250
269
|
end
|
251
270
|
end
|