класс Bundler::Source::Git
Атрибуты
branch[R]
options[R]
ref[R]
submodules[R]
uri[R]
Публичные методы класса
# File lib/bundler/source/git.rb, line 35
def self.from_lock(options)
new(options.merge("uri" => options.delete("remote")))
end # File lib/bundler/source/git.rb, line 13
def initialize(options)
@options = options
@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 = options["uri"] || ""
@safe_uri = URICredentialsFilter.credential_filtered_uri(@uri)
@branch = options["branch"]
@ref = options["ref"] || options["branch"] || options["tag"] || "master"
@submodules = options["submodules"]
@name = options["name"]
@version = options["version"].to_s.strip.gsub("-", ".pre.")
@copied = false
@local = false
end Публичные методы экземпляра
==(other)
Псевдоним для: eql?
# File lib/bundler/source/git.rb, line 228 def allow_git_ops? @allow_remote || @allow_cached end
# File lib/bundler/source/git.rb, line 220
def app_cache_dirname
"#{base_name}-#{shortref_for_path(cached_revision || revision)}"
end # File lib/bundler/source/git.rb, line 188 def cache(spec, custom_path = nil) app_cache_path = app_cache_path(custom_path) return unless Bundler.feature_flag.cache_all? return if path == app_cache_path cached! FileUtils.rm_rf(app_cache_path) git_proxy.checkout if requires_checkout? git_proxy.copy_to(app_cache_path, @submodules) serialize_gemspecs_in(app_cache_path) end
# File lib/bundler/source/git.rb, line 210
def cache_path
@cache_path ||= begin
if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache?
Bundler.user_cache
else
Bundler.bundle_path.join("cache", "bundler")
end.join("git", git_scope)
end
end Это путь, который будет содержать кэш Git-репозитория. При использовании одного и того же Git-репозитория в разных проектах этот кэш будет общим. При использовании локальных Git-репозиториев, он устанавливается в локальный репозиторий.
# File lib/bundler/source/git.rb, line 54
def eql?(other)
other.is_a?(Git) && uri == other.uri && ref == other.ref &&
branch == other.branch && name == other.name &&
version == other.version && submodules == other.submodules
end Также является псевдонимом для: ==
# File lib/bundler/source/git.rb, line 107
def extension_dir_name
"#{base_name}-#{shortref_for_path(revision)}"
end # File lib/bundler/source/git.rb, line 50 def hash [self.class, uri, ref, branch, name, version, submodules].hash end
# File lib/bundler/source/git.rb, line 170
def install(spec, options = {})
force = options[:force]
print_using_message "Using #{version_message(spec)} from #{self}"
if (requires_checkout? && !@copied) || force
Bundler.ui.debug " * Checking out revision: #{ref}"
git_proxy.copy_to(install_path, submodules)
serialize_gemspecs_in(install_path)
@copied = true
end
generate_bin_options = { :disable_extensions => !Bundler.rubygems.spec_missing_extensions?(spec), :build_args => options[:build_args] }
generate_bin(spec, generate_bin_options)
requires_checkout? ? spec.post_install_message : nil
end # File lib/bundler/source/git.rb, line 91
def install_path
@install_path ||= begin
git_scope = "#{base_name}-#{shortref_for_path(revision)}"
path = Bundler.install_path.join(git_scope)
if !path.exist? && Bundler.requires_sudo?
Bundler.user_bundle_path.join(Bundler.ruby_scope).join(git_scope)
else
path
end
end
end Это путь, который будет содержать конкретную копию Git-репозитория. При использовании локальных Git-репозиториев, он устанавливается в локальный репозиторий.
Также является псевдонимом для: path
# File lib/bundler/source/git.rb, line 199
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 Вызывает метод суперкласса
# File lib/bundler/source/git.rb, line 118
def local_override!(path)
return false if local?
path = Pathname.new(path)
path = path.expand_path(Bundler.root) unless path.relative?
unless options["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 use " \
"`bundle config --delete` to remove the local override"
end
unless path.exist?
raise GitError, "Cannot use local override for #{name} because #{path} " \
"does not exist. Check `bundle config --delete` to remove the local override"
end
set_local!(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, ref)
if git_proxy.branch != options["branch"] && !Bundler.settings[:disable_local_branch_check]
raise GitError, "Local override for #{name} at #{path} is using branch " \
"#{git_proxy.branch} but Gemfile specifies #{options["branch"]}"
end
changed = cached_revision && cached_revision != git_proxy.revision
if changed && !@unlocked && !git_proxy.contains?(cached_revision)
raise GitError, "The Gemfile lock is pointing to revision #{shortref_for_display(cached_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 # File lib/bundler/source/git.rb, line 84 def name File.basename(@uri, ".git") end
path()
Псевдоним для: install_path
# File lib/bundler/source/git.rb, line 224 def revision git_proxy.revision end
# File lib/bundler/source/git.rb, line 157
def specs(*)
set_local!(app_cache_path) if has_app_cache? && !local?
if requires_checkout? && !@copied
fetch
git_proxy.copy_to(install_path, submodules)
serialize_gemspecs_in(install_path)
@copied = true
end
local_specs
end # File lib/bundler/source/git.rb, line 39
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 @glob == DEFAULT_GLOB
out << " specs:\n"
end # File lib/bundler/source/git.rb, line 62
def to_s
at = if local?
path
elsif user_ref = options["ref"]
if ref =~ /\A[a-z0-9]{4,}\z/i
shortref_for_display(user_ref)
else
user_ref
end
else
ref
end
rev = begin
"@#{shortref_for_display(revision)}"
rescue GitError
nil
end
"#{@safe_uri} (at #{at}#{rev})"
end # File lib/bundler/source/git.rb, line 111 def unlock! git_proxy.revision = nil options["revision"] = nil @unlocked = true end
Приватные методы экземпляра
# File lib/bundler/source/git.rb, line 266
def base_name
File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*}, ""), ".git")
end # File lib/bundler/source/git.rb, line 294 def cached? cache_path.exist? end
# File lib/bundler/source/git.rb, line 290 def cached_revision options["revision"] end
# File lib/bundler/source/git.rb, line 324 def extension_cache_slug(_) extension_dir_name end
# File lib/bundler/source/git.rb, line 302
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 # File lib/bundler/source/git.rb, line 298 def git_proxy @git_proxy ||= GitProxy.new(cache_path, uri, ref, cached_revision, self) end
# File lib/bundler/source/git.rb, line 320
def git_scope
"#{base_name}-#{uri_hash}"
end # File lib/bundler/source/git.rb, line 254 def has_app_cache? cached_revision && super end
Вызов метода суперкласса
# File lib/bundler/source/git.rb, line 313 def load_gemspec(file) stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent) stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.untaint StubSpecification.from_stub(stub) end
# File lib/bundler/source/git.rb, line 258 def local? @local end
# File lib/bundler/source/git.rb, line 262 def requires_checkout? allow_git_ops? && !local? end
# File lib/bundler/source/git.rb, line 234
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
Bundler.rubygems.set_installed_by_version(spec)
Bundler.rubygems.validate(spec)
File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) }
end
end # File lib/bundler/source/git.rb, line 248 def set_local!(path) @local = true @local_specs = @git_proxy = nil @cache_path = @install_path = path end
# File lib/bundler/source/git.rb, line 270 def shortref_for_display(ref) ref[0..6] end
# File lib/bundler/source/git.rb, line 274 def shortref_for_path(ref) ref[0..11] end
# File lib/bundler/source/git.rb, line 278
def uri_hash
if uri =~ %r{^\w+://(\w+@)?}
# Downcase the domain component of the URI
# and strip off a trailing slash, if one is present
input = 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
SharedHelpers.digest(:SHA1).hexdigest(input)
end # File lib/bundler/source/git.rb, line 310 def validate_spec(_spec); end
безоперационная операция, так как валидация выполняется при повторной сериализации gemspec
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.