class Pod::Installer::PodSourceInstaller

Controller class responsible of installing the activated specifications of a single Pod.

@note This class needs to consider all the activated specs of a Pod.

Constants

UNENCRYPTED_PROTOCOLS

Attributes

can_cache[R]

@return [Boolean] Whether the installer is allowed to touch the cache.

can_cache?[R]

@return [Boolean] Whether the installer is allowed to touch the cache.

sandbox[R]

@return [Sandbox] The installation target.

specs_by_platform[R]

@return [Hash{Symbol=>Array}] The specifications that need to be

installed grouped by platform.

Public Class Methods

new(sandbox, specs_by_platform, can_cache: true) click to toggle source

Initialize a new instance

@param [Sandbox] sandbox @see sandbox @param [Hash{Symbol=>Array}] specs_by_platform @see specs_by_platform @param [Boolean] can_cache @see can_cache

# File lib/cocoapods/installer/pod_source_installer.rb, line 33
def initialize(sandbox, specs_by_platform, can_cache: true)
  @sandbox = sandbox
  @specs_by_platform = specs_by_platform
  @can_cache = can_cache
end

Public Instance Methods

clean!() click to toggle source

Cleans the installations if appropriate.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 70
def clean!
  clean_installation unless local?
end
inspect() click to toggle source

@return [String] A string suitable for debugging.

# File lib/cocoapods/installer/pod_source_installer.rb, line 41
def inspect
  "<#{self.class} sandbox=#{sandbox.root} pod=#{root_spec.name}"
end
install!() click to toggle source

Creates the target in the Pods project and the relative support files.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 61
def install!
  download_source unless predownloaded? || local?
  PodSourcePreparer.new(root_spec, root).prepare! if local?
end
lock_files!(file_accessors) click to toggle source

Locks the source files if appropriate.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 78
def lock_files!(file_accessors)
  return if local?
  FileUtils.chmod('u-w', source_files(file_accessors))
end
name() click to toggle source

@return [String] The name of the pod this installer is installing.

# File lib/cocoapods/installer/pod_source_installer.rb, line 47
def name
  root_spec.name
end
unlock_files!(file_accessors) click to toggle source

Unlocks the source files if appropriate.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 87
def unlock_files!(file_accessors)
  return if local?
  FileUtils.chmod('u+w', source_files(file_accessors))
end

Private Instance Methods

clean_installation() click to toggle source

Removes all the files not needed for the installation according to the specs by platform.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 145
def clean_installation
  cleaner = Sandbox::PodDirCleaner.new(root, specs_by_platform)
  cleaner.clean!
end
download_request() click to toggle source
# File lib/cocoapods/installer/pod_source_installer.rb, line 133
def download_request
  Downloader::Request.new(
    :spec => root_spec,
    :released => released?,
  )
end
download_source() click to toggle source

Downloads the source of the Pod.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 102
def download_source
  verify_source_is_secure(root_spec)
  download_result = Downloader.download(download_request, root, :can_cache => can_cache?)

  if (specific_source = download_result.checkout_options) && specific_source != root_spec.source
    sandbox.store_checkout_source(root_spec.name, specific_source)
  end
end
local?() click to toggle source

@return [Boolean] whether the pod uses the local option and thus

CocoaPods should not interfere with the files of the user.
# File lib/cocoapods/installer/pod_source_installer.rb, line 185
def local?
  sandbox.local?(root_spec.name)
end
predownloaded?() click to toggle source

@return [Boolean] whether the source has been pre downloaded in the

resolution process to retrieve its podspec.
# File lib/cocoapods/installer/pod_source_installer.rb, line 178
def predownloaded?
  sandbox.predownloaded_pods.include?(root_spec.name)
end
released?() click to toggle source
# File lib/cocoapods/installer/pod_source_installer.rb, line 189
def released?
  !local? && !predownloaded? && sandbox.specification(root_spec.name) != root_spec
end
root() click to toggle source

@return [Pathname] the folder where the source of the Pod is located.

# File lib/cocoapods/installer/pod_source_installer.rb, line 171
def root
  sandbox.pod_dir(root_spec.name)
end
root_spec() click to toggle source

@return [Specification] the root specification of the Pod.

# File lib/cocoapods/installer/pod_source_installer.rb, line 165
def root_spec
  specs.first.root
end
source_files(file_accessors) click to toggle source

@return [Array<Pathname>] The paths of the source files

# File lib/cocoapods/installer/pod_source_installer.rb, line 195
def source_files(file_accessors)
  file_accessors.flat_map(&:source_files)
end
specs() click to toggle source

@return [Array<Specifications>] the specification of the Pod used in

this installation.
# File lib/cocoapods/installer/pod_source_installer.rb, line 159
def specs
  specs_by_platform.values.flatten
end
verify_source_is_secure(root_spec) click to toggle source

Verify the source of the spec is secure, which is used to show a warning to the user if that isn't the case This method doesn't verify all protocols, but currently only prohibits unencrypted 'http://' and 'git://'' connections.

@return [void]

# File lib/cocoapods/installer/pod_source_installer.rb, line 117
def verify_source_is_secure(root_spec)
  return if root_spec.source.nil? || (root_spec.source[:http].nil? && root_spec.source[:git].nil?)
  source = if !root_spec.source[:http].nil?
             URI(root_spec.source[:http].to_s)
           elsif !root_spec.source[:git].nil?
             git_source = root_spec.source[:git].to_s
             return unless git_source =~ /^#{URI.regexp}$/
             URI(git_source)
           end
  if UNENCRYPTED_PROTOCOLS.include?(source.scheme)
    UI.warn "'#{root_spec.name}' uses the unencrypted '#{source.scheme}' protocol to transfer the Pod. " \
          'Please be sure you\'re in a safe network with only trusted hosts. ' \
          'Otherwise, please reach out to the library author to notify them of this security issue.'
  end
end