class Pod::DyInstaller::Analyzer::SandboxAnalyzer
Analyze the sandbox to detect which Pods should be removed, and which ones should be reinstalled.
The logic is the following:
Added
-
If not present in the sandbox lockfile.
-
The directory of the
Pod
doesn't exits.
Changed
-
The version of the
Pod
changed. -
The SHA of the specification file changed.
-
The specific installed (sub)specs of the same
Pod
changed. -
The specification is from an external source and the installation process is in update mode.
-
The directory of the
Pod
is empty. -
The
Pod
has been pre-downloaded.
Removed
-
If a specification is present in the lockfile but not in the resolved specs.
Unchanged
-
If none of the above conditions match.
Attributes
@return [Lockfile] The lockfile of the installation as a fall-back if
there is no sandbox manifest. This is indented as a temporary solution to prevent the full re-installation from users which are upgrading from CP < 0.17.
@todo Remove for CP 0.18.
@return [Sandbox] The sandbox to analyze.
@return [Array<Specifications>] The specifications returned by the
resolver.
@return [Bool] Whether the installation is performed in update mode.
@return [Bool] Whether the installation is performed in update mode.
Public Class Methods
Init a new SandboxAnalyzer
@param [Sandbox] sandbox @see sandbox @param [Array<Specifications>] specs @see specs @param [Bool] update_mode
@see update_mode
@param [Lockfile] lockfile @see lockfile
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 61 def initialize(sandbox, specs, update_mode, lockfile = nil) @sandbox = sandbox @specs = specs @update_mode = update_mode @lockfile = lockfile end
Public Instance Methods
Performs the analysis to the detect the state of the sandbox respect to the resolved specifications.
@return [void]
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 73 def analyze state = SpecsState.new if sandbox_manifest all_names = (resolved_pods + sandbox_pods).uniq.sort all_names.sort.each do |name| state.add_name(name, pod_state(name)) end else state.added.merge(resolved_pods) end state end
Private Instance Methods
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 243 def folder_empty?(pod) Dir.glob(sandbox.pod_dir(pod) + '*').empty? end
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 239 def folder_exist?(pod) sandbox.pod_dir(pod).exist? end
Returns whether the Pod
with the given name should be installed.
@note A Pod
whose folder doesn't exists is considered added.
@param [String] pod
the name of the Pod.
@return [Bool] Whether the Pod
is added.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 115 def pod_added?(pod) return true if resolved_pods.include?(pod) && !sandbox_pods.include?(pod) return true unless folder_exist?(pod) false end
Returns whether the Pod
with the given name should be considered changed and thus should be reinstalled.
@note In update mode, as there is no way to know if a remote source
hash changed the Pods from external sources are always marked as changed.
@note A Pod
whose folder is empty is considered changed.
@param [String] pod
the name of the Pod.
@return [Bool] Whether the Pod
is changed.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 148 def pod_changed?(pod) spec = root_spec(pod) return true if spec.version != sandbox_version(pod) return true if spec.checksum != sandbox_checksum(pod) return true if resolved_spec_names(pod) != sandbox_spec_names(pod) return true if sandbox.predownloaded?(pod) return true if folder_empty?(pod) false end
Returns whether the Pod
with the given name should be removed from the installation.
@param [String] pod
the name of the Pod.
@return [Bool] Whether the Pod
is deleted.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 129 def pod_deleted?(pod) return true if !resolved_pods.include?(pod) && sandbox_pods.include?(pod) false end
Returns the state of the Pod
with the given name.
@param [String] pod
the name of the Pod.
@return [Symbol] The state
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 99 def pod_state(pod) return :added if pod_added?(pod) return :deleted if pod_deleted?(pod) return :changed if pod_changed?(pod) :unchanged end
@return [Array<String>] The name of the resolved Pods.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 174 def resolved_pods specs.map { |spec| spec.root.name }.uniq end
@return [Array<String>] The name of the resolved specifications
(includes subspecs).
@param [String] pod
the name of the Pod.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 191 def resolved_spec_names(pod) specs.select { |s| s.root.name == pod }.map(&:name).uniq.sort end
@return [Specification] The root specification for the Pod
with the
given name.
@param [String] pod
the name of the Pod.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 211 def root_spec(pod) specs.find { |s| s.root.name == pod }.root end
@return [String] The checksum of the specification of the Pod
with
the given name stored in the sandbox.
@param [String] pod
the name of the Pod.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 233 def sandbox_checksum(pod) sandbox_manifest.checksum(pod) end
@return [Lockfile] The manifest to use for the sandbox.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 166 def sandbox_manifest sandbox.manifest || lockfile end
@return [Array<String>] The name of the Pods stored in the sandbox
manifest.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 181 def sandbox_pods sandbox_manifest.pod_names.map { |name| Specification.root_name(name) }.uniq end
@return [Array<String>] The name of the specifications stored in the
sandbox manifest (includes subspecs).
@param [String] pod
the name of the Pod.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 201 def sandbox_spec_names(pod) sandbox_manifest.pod_names.select { |name| Specification.root_name(name) == pod }.uniq.sort end
@return [Version] The version of Pod
with the given name stored in
the sandbox.
@param [String] pod
the name of the Pod.
# File lib/pod/installer/analyzer/sandbox_analyzer.rb, line 223 def sandbox_version(pod) sandbox_manifest.version(pod) end