chef-dk 0.12.0 → 0.13.21
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/Gemfile +87 -30
- data/Gemfile.lock +721 -0
- data/Gemfile.windows +34 -0
- data/Gemfile.windows.lock +936 -0
- data/README.md +458 -307
- data/Rakefile +22 -29
- data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +7 -3
- data/acceptance/Gemfile +10 -11
- data/acceptance/Gemfile.lock +242 -0
- data/chef-dk.gemspec +67 -64
- data/lib/chef-dk/builtin_commands.rb +60 -60
- data/lib/chef-dk/command/verify.rb +564 -534
- data/lib/chef-dk/commands_map.rb +115 -115
- data/lib/chef-dk/component_test.rb +198 -194
- data/lib/chef-dk/version.rb +20 -20
- data/lib/kitchen/provisioner/policyfile_zero.rb +3 -2
- data/omnibus_overrides.rb +11 -0
- data/spec/unit/command/verify_spec.rb +334 -325
- data/tasks/bin/bundle-platform +15 -0
- data/tasks/bin/bundle-platform.bat +2 -0
- data/tasks/bundle.rb +80 -0
- data/tasks/bundle_util.rb +93 -0
- data/tasks/dependencies.rb +175 -0
- data/tasks/gemfile_util.rb +99 -0
- data/tasks/github_changelog_generator.rb +31 -0
- data/tasks/version.rb +48 -0
- data/version_policy.rb +112 -0
- metadata +17 -3
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
platforms = ARGV.shift
|
4
|
+
old_platforms = Gem.platforms
|
5
|
+
Gem.platforms = platforms.split(" ").map { |p| Gem::Platform.new(p) }
|
6
|
+
puts "bundle-platform set Gem.platforms to #{Gem.platforms.map { |p| p.to_s }} (was #{old_platforms.map { |p| p.to_s } })"
|
7
|
+
|
8
|
+
# The rest of this is a normal bundler binstub
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
|
15
|
+
load Gem.bin_path("bundler", "bundle")
|
data/tasks/bundle.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2016 Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require_relative "bundle_util"
|
19
|
+
require_relative "../version_policy"
|
20
|
+
|
21
|
+
desc "Tasks to work with the main Gemfile and Gemfile.<platform>"
|
22
|
+
namespace :bundle do
|
23
|
+
desc "Update Gemfile.lock and all Gemfile.<platform>.locks (or one or more gems via bundle:update gem1 gem2 ...). NOTE: use rake dependencies:update_current_chef to update the version of chef first, if you want it updated as well)."
|
24
|
+
task :update, [:args] do |t, rake_args|
|
25
|
+
extend BundleUtil
|
26
|
+
args = rake_args[:args] || ""
|
27
|
+
with_bundle_unfrozen do
|
28
|
+
puts ""
|
29
|
+
puts "-------------------------------------------------------------------"
|
30
|
+
puts "Updating Gemfile.lock ..."
|
31
|
+
puts "-------------------------------------------------------------------"
|
32
|
+
bundle "install #{args}", delete_gemfile_lock: true
|
33
|
+
platforms.each do |platform|
|
34
|
+
puts ""
|
35
|
+
puts "-------------------------------------------------------------------"
|
36
|
+
puts "Updating Gemfile.#{platform}.lock ..."
|
37
|
+
puts "-------------------------------------------------------------------"
|
38
|
+
bundle "lock", gemfile: "Gemfile.#{platform}", platform: platform, delete_gemfile_lock: true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Conservatively update Gemfile.lock and all Gemfile.<platform>.locks"
|
44
|
+
task :install, [:args] do |t, rake_args|
|
45
|
+
extend BundleUtil
|
46
|
+
args = rake_args[:args] || ""
|
47
|
+
with_bundle_unfrozen do
|
48
|
+
puts ""
|
49
|
+
puts "-------------------------------------------------------------------"
|
50
|
+
puts "Updating Gemfile.lock ..."
|
51
|
+
puts "-------------------------------------------------------------------"
|
52
|
+
bundle "install #{args}"
|
53
|
+
platforms.each do |platform|
|
54
|
+
puts ""
|
55
|
+
puts "-------------------------------------------------------------------"
|
56
|
+
puts "Updating Gemfile.#{platform}.lock (conservatively) ..."
|
57
|
+
puts "-------------------------------------------------------------------"
|
58
|
+
bundle "lock", gemfile: "Gemfile.#{platform}", platform: platform
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Run bundle with arbitrary args against the given platform; e.g. rake bundle[show]. No platform to run against the main bundle; bundle[show,windows] to run the windows one; bundle[show,*] to run against all non-default platforms."
|
65
|
+
task :bundle, [:args,:platform] do |t, rake_args|
|
66
|
+
extend BundleUtil
|
67
|
+
args = rake_args[:args] || ""
|
68
|
+
platform = rake_args[:platform]
|
69
|
+
with_bundle_unfrozen do
|
70
|
+
if platform == "*"
|
71
|
+
platforms.each do |platform|
|
72
|
+
bundle args, platform: platform
|
73
|
+
end
|
74
|
+
elsif platform
|
75
|
+
bundle args, platform: platform
|
76
|
+
else
|
77
|
+
bundle args
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module BundleUtil
|
4
|
+
PLATFORMS = { "windows" => %w{ruby x86-mingw32} }
|
5
|
+
|
6
|
+
def project_root
|
7
|
+
File.expand_path("../..", __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def bundle_platform
|
11
|
+
File.join(project_root, "tasks", "bin", "bundle-platform")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Parse the output of "bundle outdated" and get the list of gems that
|
15
|
+
# were outdated
|
16
|
+
def parse_bundle_outdated(bundle_outdated_output)
|
17
|
+
result = []
|
18
|
+
bundle_outdated_output.each_line do |line|
|
19
|
+
if line =~ /^\s*\* (.+) \(newest ([^,]+), installed ([^,)])*/
|
20
|
+
gem_name, newest_version, installed_version = $1, $2, $3
|
21
|
+
result << [ line, gem_name ]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
def with_bundle_unfrozen
|
28
|
+
bundle "config --delete frozen"
|
29
|
+
begin
|
30
|
+
yield
|
31
|
+
ensure
|
32
|
+
bundle "config --local frozen 1"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Run bundle-platform with the given ruby platform(s)
|
37
|
+
def bundle(args, gemfile: nil, platform: nil, cwd: nil, extract_output: false, delete_gemfile_lock: false)
|
38
|
+
args = args.split(/\s+/)
|
39
|
+
if cwd
|
40
|
+
prefix = "[#{cwd}] "
|
41
|
+
end
|
42
|
+
cwd = File.expand_path(cwd || ".", project_root)
|
43
|
+
Bundler.with_clean_env do
|
44
|
+
Dir.chdir(cwd) do
|
45
|
+
gemfile ||= "Gemfile"
|
46
|
+
gemfile = File.expand_path(gemfile, cwd)
|
47
|
+
raise "No platform #{platform} (supported: #{PLATFORMS.keys.join(", ")})" if platform && !PLATFORMS[platform]
|
48
|
+
|
49
|
+
# First delete the gemfile.lock
|
50
|
+
if delete_gemfile_lock
|
51
|
+
if File.exist?("#{gemfile}.lock")
|
52
|
+
puts "Deleting #{gemfile}.lock ..."
|
53
|
+
File.delete("#{gemfile}.lock")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Run the bundle command
|
58
|
+
ruby_platforms = platform ? PLATFORMS[platform].join(" ") : "ruby"
|
59
|
+
cmd = Shellwords.join([bundle_platform, ruby_platforms, *args])
|
60
|
+
puts "#{prefix}#{Shellwords.join(["bundle", *args])}#{platform ? " for #{platform} platform" : ""}:"
|
61
|
+
with_gemfile(gemfile) do
|
62
|
+
puts "#{prefix}BUNDLE_GEMFILE=#{gemfile}"
|
63
|
+
puts "#{prefix}> #{cmd}"
|
64
|
+
if extract_output
|
65
|
+
`#{cmd}`
|
66
|
+
else
|
67
|
+
unless system(bundle_platform, ruby_platforms, *args)
|
68
|
+
raise "#{bundle_platform} failed: exit code #{$?}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def with_gemfile(gemfile)
|
77
|
+
old_gemfile = ENV["BUNDLE_GEMFILE"]
|
78
|
+
ENV["BUNDLE_GEMFILE"] = gemfile
|
79
|
+
begin
|
80
|
+
yield
|
81
|
+
ensure
|
82
|
+
if old_gemfile
|
83
|
+
ENV["BUNDLE_GEMFILE"] = old_gemfile
|
84
|
+
else
|
85
|
+
ENV.delete("BUNDLE_GEMFILE")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def platforms
|
91
|
+
PLATFORMS.keys
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2016 Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require_relative "bundle_util"
|
19
|
+
require_relative "bundle"
|
20
|
+
require_relative "../version_policy"
|
21
|
+
|
22
|
+
desc "Tasks to update and check dependencies"
|
23
|
+
namespace :dependencies do
|
24
|
+
# Update all dependencies to the latest constraint-matching version
|
25
|
+
desc "Update all dependencies. dependencies:update[conservative] to update as little as possible."
|
26
|
+
task :update, [:conservative] => %w{
|
27
|
+
dependencies:update_current_chef
|
28
|
+
dependencies:update_gemfile_lock
|
29
|
+
dependencies:update_omnibus_overrides
|
30
|
+
dependencies:update_omnibus_gemfile_lock
|
31
|
+
dependencies:update_acceptance_gemfile_lock
|
32
|
+
}
|
33
|
+
|
34
|
+
desc "Update Gemfile.lock and all Gemfile.<platform>.locks. update_gemfile_lock[conservative] to update as little as possible."
|
35
|
+
task :update_gemfile_lock, [:conservative] do |t, rake_args|
|
36
|
+
conservative = rake_args[:conservative]
|
37
|
+
if conservative
|
38
|
+
Rake::Task["bundle:install"].invoke
|
39
|
+
else
|
40
|
+
Rake::Task["bundle:update"].invoke
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Update omnibus/Gemfile.lock. update_omnibus_gemfile_lock[conservative] to update as little as possible."
|
45
|
+
task :update_omnibus_gemfile_lock, [:conservative] do |t, rake_args|
|
46
|
+
extend BundleUtil
|
47
|
+
conservative = rake_args[:conservative]
|
48
|
+
puts ""
|
49
|
+
puts "-------------------------------------------------------------------"
|
50
|
+
puts "Updating omnibus/Gemfile.lock#{conservative ? " (conservatively)" : ""} ..."
|
51
|
+
puts "-------------------------------------------------------------------"
|
52
|
+
bundle "install", cwd: "omnibus", delete_gemfile_lock: !conservative
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "Update acceptance/Gemfile.lock (or one or more gems via update[gem1,gem2,...]). update_acceptance_gemfile_lock[conservative] to update as little as possible."
|
56
|
+
task :update_acceptance_gemfile_lock, [:conservative] do |t, rake_args|
|
57
|
+
extend BundleUtil
|
58
|
+
conservative = rake_args[:conservative]
|
59
|
+
puts ""
|
60
|
+
puts "-------------------------------------------------------------------"
|
61
|
+
puts "Updating acceptance/Gemfile.lock#{conservative ? " (conservatively)" : ""} ..."
|
62
|
+
puts "-------------------------------------------------------------------"
|
63
|
+
bundle "install", cwd: "acceptance", delete_gemfile_lock: !conservative
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "Update current chef release in Gemfile. update_current_chef[conservative] does nothing."
|
67
|
+
task :update_current_chef, [:conservative] do |t, rake_args|
|
68
|
+
extend BundleUtil
|
69
|
+
conservative = rake_args[:conservative]
|
70
|
+
unless conservative
|
71
|
+
puts ""
|
72
|
+
puts "-------------------------------------------------------------------"
|
73
|
+
puts "Updating Gemfile ..."
|
74
|
+
puts "-------------------------------------------------------------------"
|
75
|
+
|
76
|
+
require "mixlib/install"
|
77
|
+
# TODO in some edge cases, stable will actually be the latest chef because
|
78
|
+
# promotion *moves* the package out of current into stable rather than
|
79
|
+
# copying
|
80
|
+
puts "Getting latest chef 'current' version from omnitruck ..."
|
81
|
+
options = {
|
82
|
+
channel: :current,
|
83
|
+
product_name: 'chef',
|
84
|
+
product_version: :latest
|
85
|
+
}
|
86
|
+
version = Mixlib::Install.new(options).artifact_info.first.version
|
87
|
+
|
88
|
+
# Modify the gemfile to pin to current chef
|
89
|
+
gemfile_path = File.join(project_root, "Gemfile")
|
90
|
+
gemfile = IO.read(gemfile_path)
|
91
|
+
found = gemfile.sub!(/^(\s*gem "chef", github: "chef\/chef", branch: ")([^"]*)(")$/m) do
|
92
|
+
if $2 != "v#{version}"
|
93
|
+
puts "Setting chef version in Gemfile to v#{version} (was #{$2})"
|
94
|
+
else
|
95
|
+
puts "chef version in Gemfile already at latest current (#{$2})"
|
96
|
+
end
|
97
|
+
"#{$1}v#{version}#{$3}"
|
98
|
+
end
|
99
|
+
unless found
|
100
|
+
raise "Gemfile does not have a line of the form 'gem \"chef\", github: \"chef/chef\", branch: \"v<version>\"', so we didn't update it to latest current (v#{version}). Remove dependencies:update_current_chef from the `dependencies:update` rake task to prevent it from being run if this is intentional."
|
101
|
+
end
|
102
|
+
|
103
|
+
if gemfile != IO.read(gemfile_path)
|
104
|
+
puts "Writing modified #{gemfile_path} ..."
|
105
|
+
IO.write(gemfile_path, gemfile)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
desc "Update omnibus overrides, including versions in version_policy.rb and latest version of gems: #{OMNIBUS_RUBYGEMS_AT_LATEST_VERSION.keys}. update_omnibus_overrides[conservative] does nothing."
|
111
|
+
task :update_omnibus_overrides, [:conservative] do |t, rake_args|
|
112
|
+
conservative = rake_args[:conservative]
|
113
|
+
unless conservative
|
114
|
+
puts ""
|
115
|
+
puts "-------------------------------------------------------------------"
|
116
|
+
puts "Updating omnibus_overrides.rb ..."
|
117
|
+
puts "-------------------------------------------------------------------"
|
118
|
+
|
119
|
+
# Generate the new overrides file
|
120
|
+
overrides = "# Generated by \"rake dependencies\". Do not edit.\n"
|
121
|
+
|
122
|
+
# Replace the bundler and rubygems versions
|
123
|
+
OMNIBUS_RUBYGEMS_AT_LATEST_VERSION.each do |override_name, gem_name|
|
124
|
+
# Get the latest bundler version
|
125
|
+
puts "Running gem list -re #{gem_name} ..."
|
126
|
+
gem_list = `gem list -re #{gem_name}`
|
127
|
+
unless gem_list =~ /^#{gem_name}\s*\(([^)]*)\)$/
|
128
|
+
raise "gem list -re #{gem_name} failed with output:\n#{gem_list}"
|
129
|
+
end
|
130
|
+
|
131
|
+
# Emit it
|
132
|
+
puts "Latest version of #{gem_name} is #{$1}"
|
133
|
+
overrides << "override #{override_name.inspect}, version: #{$1.inspect}\n"
|
134
|
+
end
|
135
|
+
|
136
|
+
# Add explicit overrides
|
137
|
+
OMNIBUS_OVERRIDES.each do |override_name, version|
|
138
|
+
overrides << "override #{override_name.inspect}, version: #{version.inspect}\n"
|
139
|
+
end
|
140
|
+
|
141
|
+
# Write the file out (if changed)
|
142
|
+
overrides_path = File.expand_path("../../omnibus_overrides.rb", __FILE__)
|
143
|
+
if overrides != IO.read(overrides_path)
|
144
|
+
puts "Overrides changed!"
|
145
|
+
puts `git diff #{overrides_path}`
|
146
|
+
puts "Writing modified #{overrides_path} ..."
|
147
|
+
IO.write(overrides_path, overrides)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Find out if we're using the latest gems we can (so we don't regress versions)
|
153
|
+
desc "Check for gems that are not at the latest released version, and report if anything not in ACCEPTABLE_OUTDATED_GEMS (version_policy.rb) is out of date."
|
154
|
+
task :check_outdated do
|
155
|
+
puts ""
|
156
|
+
puts "-------------------------------------------------------------------"
|
157
|
+
puts "Checking for outdated gems ..."
|
158
|
+
puts "-------------------------------------------------------------------"
|
159
|
+
# TODO check for outdated windows gems too
|
160
|
+
bundle_outdated = bundle("outdated", extract_output: true)
|
161
|
+
puts bundle_outdated
|
162
|
+
outdated_gems = parse_bundle_outdated(bundle_outdated).map { |line, gem_name| gem_name }
|
163
|
+
# Weed out the acceptable ones
|
164
|
+
outdated_gems = outdated_gems.reject { |gem_name| ACCEPTABLE_OUTDATED_GEMS.include?(gem_name) }
|
165
|
+
if outdated_gems.empty?
|
166
|
+
puts ""
|
167
|
+
puts "SUCCESS!"
|
168
|
+
else
|
169
|
+
raise "ERROR: outdated gems: #{outdated_gems.join(", ")}. Either fix them or add them to ACCEPTABLE_OUTDATED_GEMS in #{__FILE__}."
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
desc "Update all dependencies and check for outdated gems. Call dependencies[conservative] to update as little as possible."
|
174
|
+
task :dependencies, [:conservative] => [ "dependencies:update", "dependencies:check_outdated" ]
|
175
|
+
task :update, [:conservative] => [ "dependencies:update", "dependencies:check_outdated"]
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require "bundler"
|
2
|
+
|
3
|
+
module GemfileUtil
|
4
|
+
#
|
5
|
+
# Given a set of dependencies with groups in them, and a resolved set of
|
6
|
+
# gemspecs (with dependency info in them), creates a full set of specs
|
7
|
+
# with group information on it. If A is in groups x and y, and A depends on
|
8
|
+
# B and C, then B and C are also in groups x and y.
|
9
|
+
#
|
10
|
+
class GemGroups < Hash
|
11
|
+
def initialize(resolved)
|
12
|
+
@resolved = resolved
|
13
|
+
end
|
14
|
+
attr_reader :resolved
|
15
|
+
|
16
|
+
def add_dependency(dep)
|
17
|
+
add_gem_groups(dep.name, dep.groups)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def add_gem_groups(name, groups)
|
23
|
+
self[name] ||= []
|
24
|
+
difference = groups - self[name]
|
25
|
+
unless difference.empty?
|
26
|
+
self[name] += difference
|
27
|
+
spec = resolved.find { |spec| spec.name == name }
|
28
|
+
if spec
|
29
|
+
spec.dependencies.each do |spec|
|
30
|
+
add_gem_groups(spec.name, difference)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def calculate_dependents(spec_set)
|
38
|
+
dependents = {}
|
39
|
+
spec_set.each do |spec|
|
40
|
+
dependents[spec] ||= []
|
41
|
+
end
|
42
|
+
spec_set.each do |spec|
|
43
|
+
spec.dependencies.each do |dep|
|
44
|
+
puts "#{dep.class} -> #{spec.class}"
|
45
|
+
dependents[dep] << spec
|
46
|
+
end
|
47
|
+
end
|
48
|
+
dependents
|
49
|
+
end
|
50
|
+
|
51
|
+
def include_locked_gemfile(gemfile)
|
52
|
+
#
|
53
|
+
# Read the gemfile and inject its locks as first-class dependencies
|
54
|
+
#
|
55
|
+
current_source = nil
|
56
|
+
bundle = Bundler::Definition.build(gemfile, "#{gemfile}.lock", nil)
|
57
|
+
|
58
|
+
# Go through and create the actual gemfile from the given locks and
|
59
|
+
# groups.
|
60
|
+
bundle.resolve.sort_by { |spec| spec.name }.each do |spec|
|
61
|
+
# bundler can't be installed by bundler so don't pin it.
|
62
|
+
next if spec.name == "bundler"
|
63
|
+
dep = bundle.dependencies.find { |d| d.name == spec.name}
|
64
|
+
gem_metadata = ""
|
65
|
+
if dep
|
66
|
+
gem_metadata << ", groups: #{dep.groups.inspect}" if dep.groups != [:default]
|
67
|
+
gem_metadata << ", platforms: #{dep.platforms.inspect}" if dep.platforms && !dep.platforms.empty?
|
68
|
+
end
|
69
|
+
case spec.source
|
70
|
+
when Bundler::Source::Rubygems
|
71
|
+
if current_source
|
72
|
+
if current_source != spec.source
|
73
|
+
raise "Gem #{spec.name} has source #{spec.source}, but other gems have #{current_source}. Multiple rubygems sources are not supported."
|
74
|
+
end
|
75
|
+
else
|
76
|
+
current_source = spec.source
|
77
|
+
add_gemfile_line("source #{spec.source.remotes.first.to_s.inspect}", __LINE__)
|
78
|
+
end
|
79
|
+
add_gemfile_line("gem #{spec.name.inspect}, #{spec.version.to_s.inspect}#{gem_metadata}", __LINE__)
|
80
|
+
when Bundler::Source::Git
|
81
|
+
add_gemfile_line("gem #{spec.name.inspect}, git: #{spec.source.uri.to_s.inspect}, ref: #{spec.source.revision.inspect}#{gem_metadata}", __LINE__)
|
82
|
+
when Bundler::Source::Path
|
83
|
+
add_gemfile_line("gem #{spec.name.inspect}, path: #{spec.source.path.to_s.inspect}#{gem_metadata}", __LINE__)
|
84
|
+
else
|
85
|
+
raise "Unknown source #{spec.source} for gem #{spec.name}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
rescue
|
89
|
+
puts $!
|
90
|
+
puts $!.backtrace
|
91
|
+
raise
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def add_gemfile_line(line, lineno)
|
97
|
+
instance_eval(line, __FILE__, lineno)
|
98
|
+
end
|
99
|
+
end
|