class Bundler::Source::Git

属性

branch[R]
glob[R]
options[R]
ref[R]
submodules[R]
uri[R]

公共类方法

from_lock(options) 点击切换源代码
# File bundler/source/git.rb, line 49
def self.from_lock(options)
  new(options.merge("uri" => options.delete("remote")))
end
new(options) 点击切换源代码
# File bundler/source/git.rb, line 12
def initialize(options)
  @options = options
  @checksum_store = Checksum::Store.new
  @glob = options["glob"] || DEFAULT_GLOB

  @allow_cached = false
  @allow_remote = false

  # Stringify options that could be set as symbols
  %w[ref branch tag revision].each {|k| options[k] = options[k].to_s if options[k] }

  @uri        = URINormalizer.normalize_suffix(options["uri"] || "", trailing_slash: false)
  @safe_uri   = URICredentialsFilter.credential_filtered_uri(@uri)
  @branch     = options["branch"]
  @ref        = options["ref"] || options["branch"] || options["tag"]
  @submodules = options["submodules"]
  @name       = options["name"]
  @version    = options["version"].to_s.strip.gsub("-", ".pre.")

  @copied     = false
  @local      = false
end

公共实例方法

==(other)
别名为:eql?
allow_git_ops?() 点击切换源代码
# File bundler/source/git.rb, line 260
def allow_git_ops?
  @allow_remote || @allow_cached
end
app_cache_dirname() 点击切换源代码
# File bundler/source/git.rb, line 248
def app_cache_dirname
  "#{base_name}-#{shortref_for_path(locked_revision || revision)}"
end
cache(spec, custom_path = nil) 点击切换源代码
# File bundler/source/git.rb, line 225
def cache(spec, custom_path = nil)
  cache_to(custom_path, try_migrate: false)
end
cache_path() 点击切换源代码

这是将要包含 git 仓库缓存的路径。当在不同项目中使用相同的 git 仓库时,此缓存将被共享。当使用本地 git 仓库时,此路径设置为本地仓库。

# File bundler/source/git.rb, line 240
def cache_path
  @cache_path ||= if Bundler.feature_flag.global_gem_cache?
    Bundler.user_cache
  else
    Bundler.bundle_path.join("cache", "bundler")
  end.join("git", git_scope)
end
cached!() 点击切换源代码
# File bundler/source/git.rb, line 42
def cached!
  return if @allow_cached

  @local_specs = nil
  @allow_cached = true
end
current_branch() 点击切换源代码
# File bundler/source/git.rb, line 256
def current_branch
  git_proxy.current_branch
end
eql?(other) 点击切换源代码
# File bundler/source/git.rb, line 76
def eql?(other)
  other.is_a?(Git) && uri == other.uri && ref == other.ref &&
    branch == other.branch && name == other.name &&
    glob == other.glob &&
    submodules == other.submodules
end
也别名为:==
extension_dir_name() 点击切换源代码
# File bundler/source/git.rb, line 138
def extension_dir_name
  "#{base_name}-#{shortref_for_path(revision)}"
end
hash() 点击切换源代码
# File bundler/source/git.rb, line 72
def hash
  [self.class, uri, ref, branch, name, glob, submodules].hash
end
identifier() 点击切换源代码
# File bundler/source/git.rb, line 104
def identifier
  uri_with_specifiers([humanized_ref, locked_revision, glob_for_display])
end
include?(other) 点击切换源代码
# File bundler/source/git.rb, line 85
def include?(other)
  other.is_a?(Git) && uri == other.uri &&
    name == other.name &&
    glob == other.glob &&
    submodules == other.submodules
end
install(spec, options = {}) 点击切换源代码
# File bundler/source/git.rb, line 201
def install(spec, options = {})
  return if Bundler.settings[:no_install]
  force = options[:force]

  print_using_message "Using #{version_message(spec, options[:previous_spec])} from #{self}"

  if (requires_checkout? && !@copied) || force
    checkout
  end

  generate_bin_options = { disable_extensions: !spec.missing_extensions?, build_args: options[:build_args] }
  generate_bin(spec, generate_bin_options)

  requires_checkout? ? spec.post_install_message : nil
end
install_path() 点击切换源代码

这是将要包含 git 仓库特定检出的路径。当使用本地 git 仓库时,此路径设置为本地仓库。

# File bundler/source/git.rb, line 128
def install_path
  @install_path ||= begin
    git_scope = "#{base_name}-#{shortref_for_path(revision)}"

    Bundler.install_path.join(git_scope)
  end
end
也别名为:path
load_spec_files() 点击切换源代码
调用父类方法
# File bundler/source/git.rb, line 229
def load_spec_files
  super
rescue PathError => e
  Bundler.ui.trace e
  raise GitError, "#{self} is not yet checked out. Run `bundle install` first."
end
local?() 点击切换源代码
# File bundler/source/git.rb, line 264
def local?
  @local
end
local_override!(path) 点击切换源代码
# File bundler/source/git.rb, line 149
def local_override!(path)
  return false if local?

  original_path = path
  path = Pathname.new(path)
  path = path.expand_path(Bundler.root) unless path.relative?

  unless branch || Bundler.settings[:disable_local_branch_check]
    raise GitError, "Cannot use local override for #{name} at #{path} because " \
      ":branch is not specified in Gemfile. Specify a branch or run " \
      "`bundle config unset local.#{override_for(original_path)}` to remove the local override"
  end

  unless path.exist?
    raise GitError, "Cannot use local override for #{name} because #{path} " \
      "does not exist. Run `bundle config unset local.#{override_for(original_path)}` to remove the local override"
  end

  @local = true
  set_paths!(path)

  # Create a new git proxy without the cached revision
  # so the Gemfile.lock always picks up the new revision.
  @git_proxy = GitProxy.new(path, uri, options)

  if current_branch != branch && !Bundler.settings[:disable_local_branch_check]
    raise GitError, "Local override for #{name} at #{path} is using branch " \
      "#{current_branch} but Gemfile specifies #{branch}"
  end

  changed = locked_revision && locked_revision != revision

  if !Bundler.settings[:disable_local_revision_check] && changed && !@unlocked && !git_proxy.contains?(locked_revision)
    raise GitError, "The Gemfile lock is pointing to revision #{shortref_for_display(locked_revision)} " \
      "but the current branch in your local override for #{name} does not contain such commit. " \
      "Please make sure your branch is up to date."
  end

  changed
end
migrate_cache(custom_path = nil, local: false) 点击切换源代码
# File bundler/source/git.rb, line 217
def migrate_cache(custom_path = nil, local: false)
  if local
    cache_to(custom_path, try_migrate: false)
  else
    cache_to(custom_path, try_migrate: true)
  end
end
name() 点击切换源代码
# File bundler/source/git.rb, line 121
def name
  File.basename(@uri, ".git")
end
path()
别名为:install_path
remote!() 点击切换源代码
# File bundler/source/git.rb, line 35
def remote!
  return if @allow_remote

  @local_specs = nil
  @allow_remote = true
end
revision() 点击切换源代码
# File bundler/source/git.rb, line 252
def revision
  git_proxy.revision
end
specs(*) 点击切换源代码
# File bundler/source/git.rb, line 190
def specs(*)
  set_cache_path!(app_cache_path) if use_app_cache?

  if requires_checkout? && !@copied
    fetch unless use_app_cache?
    checkout
  end

  local_specs
end
to_gemfile() 点击切换源代码
# File bundler/source/git.rb, line 64
def to_gemfile
  specifiers = %w[ref branch tag submodules glob].map do |opt|
    "#{opt}: #{options[opt]}" if options[opt]
  end

  uri_with_specifiers(specifiers)
end
to_lock() 点击切换源代码
# File bundler/source/git.rb, line 53
def to_lock
  out = String.new("GIT\n")
  out << "  remote: #{@uri}\n"
  out << "  revision: #{revision}\n"
  %w[ref branch tag submodules].each do |opt|
    out << "  #{opt}: #{options[opt]}\n" if options[opt]
  end
  out << "  glob: #{@glob}\n" unless default_glob?
  out << "  specs:\n"
end
to_s() 点击切换源代码
# File bundler/source/git.rb, line 92
def to_s
  begin
    at = humanized_ref || current_branch

    rev = "at #{at}@#{shortref_for_display(revision)}"
  rescue GitError
    ""
  end

  uri_with_specifiers([rev, glob_for_display])
end
unlock!() 点击切换源代码
# File bundler/source/git.rb, line 142
def unlock!
  git_proxy.revision = nil
  options["revision"] = nil

  @unlocked = true
end
uri_with_specifiers(specifiers) 点击切换源代码
# File bundler/source/git.rb, line 108
def uri_with_specifiers(specifiers)
  specifiers.compact!

  suffix =
    if specifiers.any?
      " (#{specifiers.join(", ")})"
    else
      ""
    end

  "#{@safe_uri}#{suffix}"
end

私有实例方法

bare_repo?(path) 点击切换源代码
# File bundler/source/git.rb, line 442
def bare_repo?(path)
  File.exist?(path.join("objects")) && File.exist?(path.join("HEAD"))
end
base_name() 点击切换源代码
# File bundler/source/git.rb, line 365
def base_name
  File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*}, ""), ".git")
end
cache_to(custom_path, try_migrate: false) 点击切换源代码
# File bundler/source/git.rb, line 270
def cache_to(custom_path, try_migrate: false)
  return unless Bundler.feature_flag.cache_all?

  app_cache_path = app_cache_path(custom_path)

  migrate = try_migrate ? bare_repo?(app_cache_path) : false

  set_cache_path!(nil) if migrate

  return if cache_path == app_cache_path

  cached!
  FileUtils.rm_rf(app_cache_path)
  git_proxy.checkout if migrate || requires_checkout?
  git_proxy.copy_to(app_cache_path, @submodules)
end
cached?() 点击切换源代码
# File bundler/source/git.rb, line 403
def cached?
  cache_path.exist?
end
checkout() 点击切换源代码
# File bundler/source/git.rb, line 287
def checkout
  Bundler.ui.debug "  * Checking out revision: #{ref}"
  if use_app_cache? && !bare_repo?(app_cache_path)
    SharedHelpers.filesystem_access(install_path.dirname) do |p|
      FileUtils.mkdir_p(p)
    end
    FileUtils.cp_r("#{app_cache_path}/.", install_path)
  else
    if use_app_cache? && bare_repo?(app_cache_path)
      Bundler.ui.warn "Installing from cache in old \"bare repository\" format for compatibility. " \
                      "Please run `bundle cache` and commit the updated cache to migrate to the new format and get rid of this warning."
    end

    git_proxy.copy_to(install_path, submodules)
  end
  serialize_gemspecs_in(install_path)
  @copied = true
end
default_glob?() 点击切换源代码
# File bundler/source/git.rb, line 381
def default_glob?
  @glob == DEFAULT_GLOB
end
extension_cache_slug(_) 点击切换源代码
# File bundler/source/git.rb, line 434
def extension_cache_slug(_)
  extension_dir_name
end
fetch() 点击切换源代码
# File bundler/source/git.rb, line 411
def fetch
  git_proxy.checkout
rescue GitError => e
  raise unless Bundler.feature_flag.allow_offline_install?
  Bundler.ui.warn "Using cached git data because of network errors:\n#{e}"
end
git_proxy() 点击切换源代码
# File bundler/source/git.rb, line 407
def git_proxy
  @git_proxy ||= GitProxy.new(cache_path, uri, options, locked_revision, self)
end
git_scope() 点击切换源代码
# File bundler/source/git.rb, line 430
def git_scope
  "#{base_name}-#{uri_hash}"
end
glob_for_display() 点击切换源代码
# File bundler/source/git.rb, line 377
def glob_for_display
  default_glob? ? nil : "glob: #{@glob}"
end
has_app_cache?() 点击切换源代码
调用父类方法
# File bundler/source/git.rb, line 349
def has_app_cache?
  locked_revision && super
end
humanized_ref() 点击切换源代码
# File bundler/source/git.rb, line 306
def humanized_ref
  if local?
    path
  elsif user_ref = options["ref"]
    if /\A[a-z0-9]{4,}\z/i.match?(ref)
      shortref_for_display(user_ref)
    else
      user_ref
    end
  elsif ref
    ref
  end
end
load_gemspec(file) 点击切换源代码
# File bundler/source/git.rb, line 421
def load_gemspec(file)
  dirname = Pathname.new(file).dirname
  SharedHelpers.chdir(dirname.to_s) do
    stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
    stub.full_gem_path = dirname.expand_path(root).to_s
    StubSpecification.from_stub(stub)
  end
end
locked_revision() 点击切换源代码
# File bundler/source/git.rb, line 399
def locked_revision
  options["revision"]
end
locked_revision_checked_out?() 点击切换源代码
# File bundler/source/git.rb, line 361
def locked_revision_checked_out?
  locked_revision && locked_revision == revision && install_path.exist?
end
override_for(path) 点击切换源代码
# File bundler/source/git.rb, line 438
def override_for(path)
  Bundler.settings.local_overrides.key(path)
end
requires_checkout?() 点击切换源代码
# File bundler/source/git.rb, line 357
def requires_checkout?
  allow_git_ops? && !local? && !locked_revision_checked_out?
end
serialize_gemspecs_in(destination) 点击切换源代码
# File bundler/source/git.rb, line 320
def serialize_gemspecs_in(destination)
  destination = destination.expand_path(Bundler.root) if destination.relative?
  Dir["#{destination}/#{@glob}"].each do |spec_path|
    # Evaluate gemspecs and cache the result. Gemspecs
    # in git might require git or other dependencies.
    # The gemspecs we cache should already be evaluated.
    spec = Bundler.load_gemspec(spec_path)
    next unless spec
    spec.installed_by_version = Gem::VERSION
    Bundler.rubygems.validate(spec)
    File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) }
  end
end
set_cache_path!(path) 点击切换源代码
# File bundler/source/git.rb, line 339
def set_cache_path!(path)
  @git_proxy = nil
  @cache_path = path
end
set_install_path!(path) 点击切换源代码
# File bundler/source/git.rb, line 344
def set_install_path!(path)
  @local_specs = nil
  @install_path = path
end
set_paths!(path) 点击切换源代码
# File bundler/source/git.rb, line 334
def set_paths!(path)
  set_cache_path!(path)
  set_install_path!(path)
end
shortref_for_display(ref) 点击切换源代码
# File bundler/source/git.rb, line 369
def shortref_for_display(ref)
  ref[0..6]
end
shortref_for_path(ref) 点击切换源代码
# File bundler/source/git.rb, line 373
def shortref_for_path(ref)
  ref[0..11]
end
uri_hash() 点击切换源代码
# File bundler/source/git.rb, line 385
def uri_hash
  if %r{^\w+://(\w+@)?}.match?(uri)
    # Downcase the domain component of the URI
    # and strip off a trailing slash, if one is present
    input = Gem::URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
  else
    # If there is no URI scheme, assume it is an ssh/git URI
    input = uri
  end
  # We use SHA1 here for historical reason and to preserve backward compatibility.
  # But a transition to a simpler mangling algorithm would be welcome.
  Bundler::Digest.sha1(input)
end
use_app_cache?() 点击切换源代码
# File bundler/source/git.rb, line 353
def use_app_cache?
  has_app_cache? && !local?
end
validate_spec(_spec) 点击切换源代码

无操作,因为我们在重新序列化 gemspec 时进行验证

# File bundler/source/git.rb, line 419
def validate_spec(_spec); end