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
公共实例方法
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
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