Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Manifest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -462,8 +462,6 @@ lib/rubygems/request/https_pool.rb
lib/rubygems/request_set.rb
lib/rubygems/request_set/gem_dependency_api.rb
lib/rubygems/request_set/lockfile.rb
lib/rubygems/request_set/lockfile/parser.rb
lib/rubygems/request_set/lockfile/tokenizer.rb
lib/rubygems/requirement.rb
lib/rubygems/resolver.rb
lib/rubygems/resolver/activation_request.rb
Expand Down
1 change: 1 addition & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ Rake::TestTask.new do |t|
t.ruby_opts.unshift("--disable-gems", "-r#{coverage_setup}")
end

t.libs << "bundler/lib"
t.libs << "test"
t.test_files = FileList["test/**/test_*.rb"]
end
Expand Down
4 changes: 2 additions & 2 deletions bundler/lib/bundler/lockfile_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,14 @@ def self.bundled_with
lockfile_contents.split(BUNDLED).last.strip
end

def initialize(lockfile, strict: false)
def initialize(lockfile, strict: false, lockfile_path: nil)
@platforms = []
@sources = []
@metadata_source = Source::Metadata.new
@dependencies = {}
@parse_method = nil
@specs = {}
@lockfile_path = begin
@lockfile_path = lockfile_path || begin
SharedHelpers.relative_lockfile_path
rescue GemfileNotFound
"Gemfile.lock"
Expand Down
65 changes: 59 additions & 6 deletions lib/rubygems/request_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -322,11 +322,8 @@ def load_gemdeps(path, without_groups = [], installing = false)
@git_set.root_dir = @install_dir

lock_file = "#{File.expand_path(path)}.lock"
begin
tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file lock_file
parser = tokenizer.make_parser self, []
parser.parse
rescue Errno::ENOENT
if File.exist?(lock_file)
load_lockfile lock_file
end

gf = Gem::RequestSet::GemDependencyAPI.new self, path
Expand All @@ -335,6 +332,63 @@ def load_gemdeps(path, without_groups = [], installing = false)
gf.load
end

def load_lockfile(lock_file) # :nodoc:
require "bundler"
require "bundler/lockfile_parser"

# Bundler::Source::Path resolves relative `remote:` paths against
# Bundler.root, which raises when there is no Gemfile in the working
# directory. Anchor it to the lockfile's directory so PATH sections in a
# `gem install -g` lockfile can be parsed without a Bundler environment.
previous_root = Bundler.instance_variable_get(:@root)
Bundler.instance_variable_set(:@root, Pathname.new(File.expand_path(File.dirname(lock_file))))

parser = Bundler::LockfileParser.new(File.read(lock_file), lockfile_path: lock_file)

Comment on lines +335 to +347
parser.specs.group_by(&:source).each do |source, specs|
case source
when Bundler::Source::Rubygems
remotes = source.remotes.map {|remote| Gem::Source.new(remote.to_s) }
remotes << Gem::Source.new(Gem::DEFAULT_HOST) if remotes.empty?
lock_set = Gem::Resolver::LockSet.new(remotes)
specs.each do |spec|
added = lock_set.add(spec.name, spec.version.to_s, spec.platform)
spec.dependencies.each do |dep|
added.each {|s| s.add_dependency dep }
end
end
@sets << lock_set
when Bundler::Source::Git
git_set = Gem::Resolver::GitSet.new
git_set.root_dir = @install_dir
specs.each do |spec|
git_spec = git_set.add_git_spec(
spec.name,
spec.version.to_s,
source.uri.to_s,
source.revision,
source.submodules || false
)
spec.dependencies.each {|dep| git_spec.add_dependency dep }
end
@sets << git_set
when Bundler::Source::Path
vendor_set = Gem::Resolver::VendorSet.new
specs.each do |spec|
loaded = vendor_set.add_vendor_gem(spec.name, source.path.to_s)
spec.dependencies.each {|dep| loaded.dependencies << dep }
end
@sets << vendor_set
end
end

parser.dependencies.each_value do |dep|
gem dep.name, *dep.requirement.as_list
end
ensure
Bundler.instance_variable_set(:@root, previous_root) if defined?(previous_root)
end

Comment on lines +385 to +391
def pretty_print(q) # :nodoc:
q.group 2, "[RequestSet:", "]" do
q.breakable
Expand Down Expand Up @@ -462,4 +516,3 @@ def tsort_each_child(node) # :nodoc:

require_relative "request_set/gem_dependency_api"
require_relative "request_set/lockfile"
require_relative "request_set/lockfile/tokenizer"
2 changes: 0 additions & 2 deletions lib/rubygems/request_set/lockfile.rb
Original file line number Diff line number Diff line change
Expand Up @@ -231,5 +231,3 @@ def requests
@set.sorted_requests
end
end

require_relative "lockfile/tokenizer"
Loading
Loading