class Dependabot::Bundler::UpdateChecker::ForceUpdater

Attributes

credentials[R]
dependency[R]
dependency_files[R]
options[R]
repo_contents_path[R]
requirements_update_strategy[R]
target_version[R]

Public Class Methods

new(dependency:, dependency_files:, repo_contents_path: nil, credentials:, target_version:, requirements_update_strategy:, update_multiple_dependencies: true, options:) click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 19
def initialize(dependency:, dependency_files:, repo_contents_path: nil,
               credentials:, target_version:,
               requirements_update_strategy:,
               update_multiple_dependencies: true,
               options:)
  @dependency                   = dependency
  @dependency_files             = dependency_files
  @repo_contents_path           = repo_contents_path
  @credentials                  = credentials
  @target_version               = target_version
  @requirements_update_strategy = requirements_update_strategy
  @update_multiple_dependencies = update_multiple_dependencies
  @options                      = options
end

Public Instance Methods

updated_dependencies() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 34
def updated_dependencies
  @updated_dependencies ||= force_update
end

Private Instance Methods

build_dependency(original_dep, updated_spec) click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 98
def build_dependency(original_dep, updated_spec)
  Dependency.new(
    name: updated_spec.fetch("name"),
    version: updated_spec.fetch("version"),
    requirements:
      RequirementsUpdater.new(
        requirements: original_dep.requirements,
        update_strategy: requirements_update_strategy,
        updated_source: source_for(original_dep),
        latest_version: updated_spec.fetch("version"),
        latest_resolvable_version: updated_spec.fetch("version")
      ).updated_requirements,
    previous_version: original_dep.version,
    previous_requirements: original_dep.requirements,
    package_manager: original_dep.package_manager
  )
end
bundler_version() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 147
def bundler_version
  @bundler_version ||= Helpers.bundler_version(lockfile)
end
dependencies_from(updated_deps, specs) click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 79
def dependencies_from(updated_deps, specs)
  # You might think we'd want to remove dependencies whose version
  # hadn't changed from this array. We don't. We still need to unlock
  # them to get Bundler to resolve, because unlocking them is what
  # updates their subdependencies.
  #
  # This is kind of a bug in Bundler, and we should try to fix it,
  # but resolving it won't necessarily be easy.
  updated_deps.map do |dep|
    original_dep =
      original_dependencies.find { |d| d.name == dep.fetch("name") }
    spec = specs.find { |d| d.fetch("name") == dep.fetch("name") }

    next if spec.fetch("version") == original_dep.version

    build_dependency(original_dep, spec)
  end.compact
end
force_update() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 48
def force_update
  in_a_native_bundler_context(error_handling: false) do |tmp_dir|
    updated_deps, specs = NativeHelpers.run_bundler_subprocess(
      bundler_version: bundler_version,
      function: "force_update",
      args: {
        dir: tmp_dir,
        dependency_name: dependency.name,
        target_version: target_version,
        credentials: credentials,
        gemfile_name: gemfile.name,
        lockfile_name: lockfile.name,
        update_multiple_dependencies: update_multiple_dependencies?
      }
    )
    dependencies_from(updated_deps, specs)
  end
rescue SharedHelpers::HelperSubprocessFailed => e
  msg = e.error_class + " with message: " + e.message
  raise Dependabot::DependencyFileNotResolvable, msg
end
gemfile() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 122
def gemfile
  dependency_files.find { |f| f.name == "Gemfile" } ||
    dependency_files.find { |f| f.name == "gems.rb" }
end
lockfile() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 127
def lockfile
  dependency_files.find { |f| f.name == "Gemfile.lock" } ||
    dependency_files.find { |f| f.name == "gems.locked" }
end
original_dependencies() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 70
def original_dependencies
  @original_dependencies ||=
    FileParser.new(
      dependency_files: dependency_files,
      credentials: credentials,
      source: nil
    ).parse
end
sanitized_lockfile_body() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 132
def sanitized_lockfile_body
  re = FileUpdater::LockfileUpdater::LOCKFILE_ENDING
  lockfile.content.gsub(re, "")
end
source_for(dependency) click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 116
def source_for(dependency)
  dependency.requirements.
    find { |r| r.fetch(:source) }&.
    fetch(:source)
end
update_multiple_dependencies?() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 44
def update_multiple_dependencies?
  @update_multiple_dependencies
end
write_temporary_dependency_files() click to toggle source
# File lib/dependabot/bundler/update_checker/force_updater.rb, line 137
def write_temporary_dependency_files
  dependency_files.each do |file|
    path = file.name
    FileUtils.mkdir_p(Pathname.new(path).dirname)
    File.write(path, file.content)
  end

  File.write(lockfile.name, sanitized_lockfile_body) if lockfile
end