Class: Gem::Source::Git
- Inherits:
-
Gem::Source
- Object
- Gem::Source
- Gem::Source::Git
- Defined in:
- lib/rubygems/source/git.rb
Overview
Constant Summary
Constants inherited from Gem::Source
Instance Attribute Summary collapse
-
#name ⇒ Object
readonly
The name of the gem created by this git gem.
-
#need_submodules ⇒ Object
readonly
Does this repository need submodules checked out too?.
-
#reference ⇒ Object
readonly
The commit reference used for checking out this git gem.
-
#remote ⇒ Object
When false the cache for this repository will not be updated.
-
#repository ⇒ Object
readonly
The git repository this gem is sourced from.
-
#root_dir ⇒ Object
The directory for cache and git gem installation.
Attributes inherited from Gem::Source
Instance Method Summary collapse
- #<=>(other) ⇒ Object
-
#==(other) ⇒ Object
:nodoc:.
-
#base_dir ⇒ Object
Directory where git gems get unpacked and so-forth.
-
#cache ⇒ Object
Creates a local cache repository for the git gem.
-
#checkout ⇒ Object
Checks out the files for the repository into the install_dir.
-
#dir_shortref ⇒ Object
A short reference for use in git gem directories.
-
#download(full_spec, path) ⇒ Object
Nothing to download for git gems.
- #git_command ⇒ Object
-
#initialize(name, repository, reference, submodules = false) ⇒ Git
constructor
Creates a new git gem source for a gems from loaded from
repository
at the givenreference
. -
#install_dir ⇒ Object
The directory where the git gem will be installed.
-
#pretty_print(q) ⇒ Object
:nodoc:.
-
#repo_cache_dir ⇒ Object
The directory where the git gem’s repository will be cached.
-
#rev_parse ⇒ Object
Converts the git reference for the repository into a commit hash.
-
#specs ⇒ Object
Loads all gemspecs in the repository.
-
#uri_hash ⇒ Object
A hash for the git gem based on the git repository Gem::URI.
Methods inherited from Gem::Source
#cache_dir, #dependency_resolver_set, #fetch_spec, #hash, #load_specs, #typo_squatting?, #update_cache?
Methods included from Text
#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text
Constructor Details
#initialize(name, repository, reference, submodules = false) ⇒ Git
Creates a new git gem source for a gems from loaded from repository
at the given reference
. The name
is only used to track the repository back to a gem dependencies file, it has no real significance as a git repository may contain multiple gems. If submodules
is true, submodules will be checked out when the gem is installed.
51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/rubygems/source/git.rb', line 51 def initialize(name, repository, reference, submodules = false) require_relative "../uri" @uri = Gem::Uri.parse(repository) @name = name @repository = repository @reference = reference || "HEAD" @need_submodules = submodules @remote = true @root_dir = Gem.dir end |
Instance Attribute Details
#name ⇒ Object (readonly)
The name of the gem created by this git gem.
17 18 19 |
# File 'lib/rubygems/source/git.rb', line 17 def name @name end |
#need_submodules ⇒ Object (readonly)
Does this repository need submodules checked out too?
42 43 44 |
# File 'lib/rubygems/source/git.rb', line 42 def need_submodules @need_submodules end |
#reference ⇒ Object (readonly)
The commit reference used for checking out this git gem.
22 23 24 |
# File 'lib/rubygems/source/git.rb', line 22 def reference @reference end |
#remote ⇒ Object
When false the cache for this repository will not be updated.
27 28 29 |
# File 'lib/rubygems/source/git.rb', line 27 def remote @remote end |
#repository ⇒ Object (readonly)
The git repository this gem is sourced from.
32 33 34 |
# File 'lib/rubygems/source/git.rb', line 32 def repository @repository end |
#root_dir ⇒ Object
The directory for cache and git gem installation
37 38 39 |
# File 'lib/rubygems/source/git.rb', line 37 def root_dir @root_dir end |
Instance Method Details
#<=>(other) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/rubygems/source/git.rb', line 63 def <=>(other) case other when Gem::Source::Git then 0 when Gem::Source::Vendor, Gem::Source::Lock then -1 when Gem::Source then 1 end end |
#==(other) ⇒ Object
:nodoc:
75 76 77 78 79 80 81 |
# File 'lib/rubygems/source/git.rb', line 75 def ==(other) # :nodoc: super && @name == other.name && @repository == other.repository && @reference == other.reference && @need_submodules == other.need_submodules end |
#base_dir ⇒ Object
Directory where git gems get unpacked and so-forth.
136 137 138 |
# File 'lib/rubygems/source/git.rb', line 136 def base_dir # :nodoc: File.join @root_dir, "bundler" end |
#cache ⇒ Object
Creates a local cache repository for the git gem.
119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/rubygems/source/git.rb', line 119 def cache # :nodoc: return unless @remote if File.exist? repo_cache_dir Dir.chdir repo_cache_dir do system git_command, "fetch", "--quiet", "--force", "--tags", @repository, "refs/heads/*:refs/heads/*" end else system git_command, "clone", "--quiet", "--bare", "--no-hardlinks", @repository, repo_cache_dir end end |
#checkout ⇒ Object
Checks out the files for the repository into the install_dir.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/rubygems/source/git.rb', line 90 def checkout # :nodoc: cache return false unless File.exist? repo_cache_dir unless File.exist? install_dir system git_command, "clone", "--quiet", "--no-checkout", repo_cache_dir, install_dir end Dir.chdir install_dir do system git_command, "fetch", "--quiet", "--force", "--tags", install_dir success = system git_command, "reset", "--quiet", "--hard", rev_parse if @need_submodules require "open3" _, status = Open3.capture2e(git_command, "submodule", "update", "--quiet", "--init", "--recursive") success &&= status.success? end success end end |
#dir_shortref ⇒ Object
A short reference for use in git gem directories
143 144 145 |
# File 'lib/rubygems/source/git.rb', line 143 def dir_shortref # :nodoc: rev_parse[0..11] end |
#download(full_spec, path) ⇒ Object
Nothing to download for git gems
150 151 |
# File 'lib/rubygems/source/git.rb', line 150 def download(full_spec, path) # :nodoc: end |
#git_command ⇒ Object
83 84 85 |
# File 'lib/rubygems/source/git.rb', line 83 def git_command ENV.fetch("git", "git") end |
#install_dir ⇒ Object
The directory where the git gem will be installed.
156 157 158 159 160 |
# File 'lib/rubygems/source/git.rb', line 156 def install_dir # :nodoc: return unless File.exist? repo_cache_dir File.join base_dir, "gems", "#{@name}-#{dir_shortref}" end |
#pretty_print(q) ⇒ Object
:nodoc:
162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/rubygems/source/git.rb', line 162 def pretty_print(q) # :nodoc: q.object_group(self) do q.group 2, "[Git: ", "]" do q.breakable q.text @repository q.breakable q.text @reference end end end |
#repo_cache_dir ⇒ Object
The directory where the git gem’s repository will be cached.
177 178 179 |
# File 'lib/rubygems/source/git.rb', line 177 def repo_cache_dir # :nodoc: File.join @root_dir, "cache", "bundler", "git", "#{@name}-#{uri_hash}" end |
#rev_parse ⇒ Object
Converts the git reference for the repository into a commit hash.
184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/rubygems/source/git.rb', line 184 def rev_parse # :nodoc: hash = nil Dir.chdir repo_cache_dir do hash = Gem::Util.popen(git_command, "rev-parse", @reference).strip end raise Gem::Exception, "unable to find reference #{@reference} in #{@repository}" unless $?.success? hash end |
#specs ⇒ Object
Loads all gemspecs in the repository
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/rubygems/source/git.rb', line 201 def specs checkout return [] unless install_dir Dir.chdir install_dir do Dir["{,*,*/*}.gemspec"].filter_map do |spec_file| directory = File.dirname spec_file file = File.basename spec_file Dir.chdir directory do spec = Gem::Specification.load file if spec spec.base_dir = base_dir spec.extension_dir = File.join base_dir, "extensions", Gem::Platform.local.to_s, Gem.extension_api_version, "#{name}-#{dir_shortref}" spec.full_gem_path = File.dirname spec.loaded_from if spec end spec end end end end |
#uri_hash ⇒ Object
A hash for the git gem based on the git repository Gem::URI.
231 232 233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/rubygems/source/git.rb', line 231 def uri_hash # :nodoc: require_relative "../openssl" normalized = if @repository.match?(%r{^\w+://(\w+@)?}) uri = Gem::URI(@repository).normalize.to_s.sub %r{/$},"" uri.sub(/\A(\w+)/) { $1.downcase } else @repository end OpenSSL::Digest::SHA1.hexdigest normalized end |