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.
-
#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 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.
53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/rubygems/source/git.rb', line 53 def initialize(name, repository, reference, submodules = false) super repository @name = name @repository = repository @reference = reference @need_submodules = submodules @remote = true @root_dir = Gem.dir @git = ENV['git'] || 'git' end |
Instance Attribute Details
#name ⇒ Object (readonly)
The name of the gem created by this git gem.
19 20 21 |
# File 'lib/rubygems/source/git.rb', line 19 def name @name end |
#need_submodules ⇒ Object (readonly)
Does this repository need submodules checked out too?
44 45 46 |
# File 'lib/rubygems/source/git.rb', line 44 def need_submodules @need_submodules end |
#reference ⇒ Object (readonly)
The commit reference used for checking out this git gem.
24 25 26 |
# File 'lib/rubygems/source/git.rb', line 24 def reference @reference end |
#remote ⇒ Object
When false the cache for this repository will not be updated.
29 30 31 |
# File 'lib/rubygems/source/git.rb', line 29 def remote @remote end |
#repository ⇒ Object (readonly)
The git repository this gem is sourced from.
34 35 36 |
# File 'lib/rubygems/source/git.rb', line 34 def repository @repository end |
#root_dir ⇒ Object
The directory for cache and git gem installation
39 40 41 |
# File 'lib/rubygems/source/git.rb', line 39 def root_dir @root_dir end |
Instance Method Details
#<=>(other) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/rubygems/source/git.rb', line 66 def <=>(other) case other when Gem::Source::Git then 0 when Gem::Source::Vendor, Gem::Source::Lock then -1 when Gem::Source then 1 else nil end end |
#==(other) ⇒ Object
:nodoc:
80 81 82 83 84 85 86 |
# File 'lib/rubygems/source/git.rb', line 80 def ==(other) # :nodoc: super and @name == other.name and @repository == other.repository and @reference == other.reference and @need_submodules == other.need_submodules end |
#base_dir ⇒ Object
Directory where git gems get unpacked and so-forth.
134 135 136 |
# File 'lib/rubygems/source/git.rb', line 134 def base_dir # :nodoc: File.join @root_dir, 'bundler' end |
#cache ⇒ Object
Creates a local cache repository for the git gem.
117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/rubygems/source/git.rb', line 117 def cache # :nodoc: return unless @remote if File.exist? repo_cache_dir Dir.chdir repo_cache_dir do system @git, 'fetch', '--quiet', '--force', '--tags', @repository, 'refs/heads/*:refs/heads/*' end else system @git, 'clone', '--quiet', '--bare', '--no-hardlinks', @repository, repo_cache_dir end end |
#checkout ⇒ Object
Checks out the files for the repository into the install_dir.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/rubygems/source/git.rb', line 91 def checkout # :nodoc: cache return false unless File.exist? repo_cache_dir unless File.exist? install_dir system @git, 'clone', '--quiet', '--no-checkout', repo_cache_dir, install_dir end Dir.chdir install_dir do system @git, 'fetch', '--quiet', '--force', '--tags', install_dir success = system @git, 'reset', '--quiet', '--hard', rev_parse success &&= Gem::Util.silent_system @git, 'submodule', 'update', '--quiet', '--init', '--recursive' if @need_submodules success end end |
#dir_shortref ⇒ Object
A short reference for use in git gem directories
141 142 143 |
# File 'lib/rubygems/source/git.rb', line 141 def dir_shortref # :nodoc: rev_parse[0..11] end |
#download(full_spec, path) ⇒ Object
Nothing to download for git gems
148 149 |
# File 'lib/rubygems/source/git.rb', line 148 def download(full_spec, path) # :nodoc: end |
#install_dir ⇒ Object
The directory where the git gem will be installed.
154 155 156 157 158 |
# File 'lib/rubygems/source/git.rb', line 154 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:
160 161 162 163 164 165 166 167 168 |
# File 'lib/rubygems/source/git.rb', line 160 def pretty_print(q) # :nodoc: q.group 2, '[Git: ', ']' do q.breakable q.text @repository q.breakable q.text @reference end end |
#repo_cache_dir ⇒ Object
The directory where the git gem’s repository will be cached.
173 174 175 |
# File 'lib/rubygems/source/git.rb', line 173 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.
180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/rubygems/source/git.rb', line 180 def rev_parse # :nodoc: hash = nil Dir.chdir repo_cache_dir do hash = Gem::Util.popen(@git, '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
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
# File 'lib/rubygems/source/git.rb', line 197 def specs checkout return [] unless install_dir Dir.chdir install_dir do Dir['{,*,*/*}.gemspec'].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.compact end end |
#uri_hash ⇒ Object
A hash for the git gem based on the git repository URI.
227 228 229 230 231 232 233 234 235 236 237 238 239 |
# File 'lib/rubygems/source/git.rb', line 227 def uri_hash # :nodoc: require 'digest' # required here to avoid deadlocking in Gem.activate_bin_path (because digest is a gem on 2.5+) normalized = if @repository =~ %r%^\w+://(\w+@)?% uri = URI(@repository).normalize.to_s.sub %r%/$%,'' uri.sub(/\A(\w+)/) { $1.downcase } else @repository end Digest::SHA1.hexdigest normalized end |