lib/bundler/injector.rb in bundler-1.14.6 vs lib/bundler/injector.rb in bundler-1.15.0.pre.1

- old
+ new

@@ -25,40 +25,61 @@ # don't inject any gems that are already in the Gemfile @new_deps -= builder.dependencies # add new deps to the end of the in-memory Gemfile - builder.eval_gemfile("injected gems", new_gem_lines) if @new_deps.any? + # Set conservative versioining to false because we want to let the resolver resolve the version first + builder.eval_gemfile("injected gems", build_gem_lines(false)) if @new_deps.any? # resolve to see if the new deps broke anything - definition = builder.to_definition(lockfile_path, {}) - definition.resolve_remotely! + @definition = builder.to_definition(lockfile_path, {}) + @definition.resolve_remotely! # since nothing broke, we can add those gems to the gemfile - append_to(gemfile_path) if @new_deps.any? + append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @new_deps.any? # since we resolved successfully, write out the lockfile - definition.lock(Bundler.default_lockfile) + @definition.lock(Bundler.default_lockfile) # return an array of the deps that we added return @new_deps ensure Bundler.settings[:frozen] = "1" if frozen end private - def new_gem_lines + def conservative_version(spec) + version = spec.version + return ">= 0" if version.nil? + segments = version.segments + seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2 + + prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease? + "~> #{segments[0..seg_end_index].join(".")}#{prerelease_suffix}" + end + + def build_gem_lines(conservative_versioning) @new_deps.map do |d| - name = "'#{d.name}'" - requirement = ", '#{d.requirement}'" - group = ", :group => #{d.groups.inspect}" if d.groups != Array(:default) - source = ", :source => '#{d.source}'" unless d.source.nil? + name = d.name.dump + + requirement = if conservative_versioning + ", \"#{conservative_version(@definition.specs[d.name][0])}\"" + else + ", #{d.requirement.as_list.map(&:dump).join(", ")}" + end + + if d.groups != Array(:default) + group = d.groups.size == 1 ? ", :group => #{d.groups.inspect}" : ", :groups => #{d.groups.inspect}" + end + + source = ", :source => \"#{d.source}\"" unless d.source.nil? + %(gem #{name}#{requirement}#{group}#{source}) end.join("\n") end - def append_to(gemfile_path) + def append_to(gemfile_path, new_gem_lines) gemfile_path.open("a") do |f| f.puts if @options["timestamp"] || @options["timestamp"].nil? f.puts "# Added at #{Time.now} by #{`whoami`.chomp}:" end