Class: Bundler::Source::Git::GitProxy

Inherits:
Object
  • Object
show all
Defined in:
lib/bundler/source/git/git_proxy.rb

Overview

The GitProxy is responsible to interact with git repositories. All actions required by the Git source is encapsulated in this object.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, uri, options = {}, revision = nil, git = nil) ⇒ GitProxy

Returns a new instance of GitProxy.



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/bundler/source/git/git_proxy.rb', line 83

def initialize(path, uri, options = {}, revision = nil, git = nil)
  @path     = path
  @uri      = uri
  @tag      = options["tag"]
  @branch   = options["branch"]
  @ref      = options["ref"]
  if @tag
    raise AmbiguousGitReference.new(options) if @branch || @ref
    @explicit_ref = @tag
  else
    @explicit_ref = @ref || @branch
  end
  @revision = revision
  @git      = git
  @commit_ref = nil
end

Instance Attribute Details

#branchObject

Returns the value of attribute branch.



57
58
59
# File 'lib/bundler/source/git/git_proxy.rb', line 57

def branch
  @branch
end

#explicit_refObject

Returns the value of attribute explicit_ref.



57
58
59
# File 'lib/bundler/source/git/git_proxy.rb', line 57

def explicit_ref
  @explicit_ref
end

#pathObject

Returns the value of attribute path.



57
58
59
# File 'lib/bundler/source/git/git_proxy.rb', line 57

def path
  @path
end

#refObject

Returns the value of attribute ref.



57
58
59
# File 'lib/bundler/source/git/git_proxy.rb', line 57

def ref
  @ref
end

#revisionObject



100
101
102
# File 'lib/bundler/source/git/git_proxy.rb', line 100

def revision
  @revision ||= allowed_with_path { find_local_revision }
end

#tagObject

Returns the value of attribute tag.



57
58
59
# File 'lib/bundler/source/git/git_proxy.rb', line 57

def tag
  @tag
end

#uriObject

Returns the value of attribute uri.



57
58
59
# File 'lib/bundler/source/git/git_proxy.rb', line 57

def uri
  @uri
end

Class Method Details

.full_versionObject



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/bundler/source/git/git_proxy.rb', line 64

def self.full_version
  @full_version ||= begin
    raise GitNotInstalledError.new unless Bundler.git_present?

    require "open3"
    out, err, status = Open3.capture3("git", "--version")

    raise GitCommandError.new("--version", SharedHelpers.pwd, err) unless status.success?
    Bundler.ui.warn err unless err.empty?

    out.sub(/git version\s*/, "").strip
  end
end

.resetObject



78
79
80
81
# File 'lib/bundler/source/git/git_proxy.rb', line 78

def self.reset
  @version = nil
  @full_version = nil
end

.versionObject



60
61
62
# File 'lib/bundler/source/git/git_proxy.rb', line 60

def self.version
  @version ||= full_version[/((\.?\d+)+).*/, 1]
end

Instance Method Details

#checkoutObject



125
126
127
128
129
130
131
132
133
134
135
# File 'lib/bundler/source/git/git_proxy.rb', line 125

def checkout
  return if has_revision_cached?

  Bundler.ui.info "Fetching #{credential_filtered_uri}"

  extra_fetch_needed = clone_needs_extra_fetch?
  unshallow_needed = clone_needs_unshallow?
  return unless extra_fetch_needed || unshallow_needed

  git_remote_fetch(unshallow_needed ? ["--unshallow"] : depth_args)
end

#contains?(commit) ⇒ Boolean

Returns:

  • (Boolean)


110
111
112
113
114
115
# File 'lib/bundler/source/git/git_proxy.rb', line 110

def contains?(commit)
  allowed_with_path do
    result, status = git_null("branch", "--contains", commit, dir: path)
    status.success? && result.match?(/^\* (.*)$/)
  end
end

#copy_to(destination, submodules = false) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/bundler/source/git/git_proxy.rb', line 137

def copy_to(destination, submodules = false)
  unless File.exist?(destination.join(".git"))
    begin
      SharedHelpers.filesystem_access(destination.dirname) do |p|
        FileUtils.mkdir_p(p)
      end
      SharedHelpers.filesystem_access(destination) do |p|
        FileUtils.rm_rf(p)
      end
      git "clone", "--no-checkout", "--quiet", path.to_s, destination.to_s
      File.chmod((File.stat(destination).mode | 0o777) & ~File.umask, destination)
    rescue Errno::EEXIST => e
      file_path = e.message[%r{.*?((?:[a-zA-Z]:)?/.*)}, 1]
      raise GitError, "Bundler could not install a gem because it needs to " \
        "create a directory, but a file exists - #{file_path}. Please delete " \
        "this file and try again."
    end
  end

  ref = @commit_ref || (locked_to_full_sha? && @revision)
  if ref
    git "config", "uploadpack.allowAnySHA1InWant", "true", dir: path.to_s if @commit_ref.nil? && needs_allow_any_sha1_in_want?

    git "fetch", "--force", "--quiet", *extra_fetch_args(ref), dir: destination
  end

  git "reset", "--hard", revision, dir: destination

  if submodules
    git_retry "submodule", "update", "--init", "--recursive", dir: destination
  elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
    inner_command = "git -C $toplevel submodule deinit --force $sm_path"
    git_retry "submodule", "foreach", "--quiet", inner_command, dir: destination
  end
end

#current_branchObject



104
105
106
107
108
# File 'lib/bundler/source/git/git_proxy.rb', line 104

def current_branch
  @current_branch ||= with_path do
    git_local("rev-parse", "--abbrev-ref", "HEAD", dir: path).strip
  end
end

#full_versionObject



121
122
123
# File 'lib/bundler/source/git/git_proxy.rb', line 121

def full_version
  self.class.full_version
end

#installed_to?(destination) ⇒ Boolean

Returns:

  • (Boolean)


173
174
175
176
177
# File 'lib/bundler/source/git/git_proxy.rb', line 173

def installed_to?(destination)
  # if copy_to is interrupted, it may leave a partially installed directory that
  # contains .git but no other files -- consider this not to be installed
  Dir.exist?(destination) && (Dir.children(destination) - [".git"]).any?
end

#versionObject



117
118
119
# File 'lib/bundler/source/git/git_proxy.rb', line 117

def version
  self.class.version
end