xcocoapods 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +6303 -0
- data/LICENSE +28 -0
- data/README.md +80 -0
- data/bin/pod +56 -0
- data/bin/sandbox-pod +168 -0
- data/lib/cocoapods.rb +73 -0
- data/lib/cocoapods/command.rb +175 -0
- data/lib/cocoapods/command/cache.rb +28 -0
- data/lib/cocoapods/command/cache/clean.rb +90 -0
- data/lib/cocoapods/command/cache/list.rb +69 -0
- data/lib/cocoapods/command/env.rb +66 -0
- data/lib/cocoapods/command/init.rb +128 -0
- data/lib/cocoapods/command/install.rb +45 -0
- data/lib/cocoapods/command/ipc.rb +19 -0
- data/lib/cocoapods/command/ipc/list.rb +40 -0
- data/lib/cocoapods/command/ipc/podfile.rb +31 -0
- data/lib/cocoapods/command/ipc/podfile_json.rb +30 -0
- data/lib/cocoapods/command/ipc/repl.rb +51 -0
- data/lib/cocoapods/command/ipc/spec.rb +29 -0
- data/lib/cocoapods/command/ipc/update_search_index.rb +24 -0
- data/lib/cocoapods/command/lib.rb +11 -0
- data/lib/cocoapods/command/lib/create.rb +105 -0
- data/lib/cocoapods/command/lib/lint.rb +121 -0
- data/lib/cocoapods/command/list.rb +39 -0
- data/lib/cocoapods/command/options/project_directory.rb +36 -0
- data/lib/cocoapods/command/options/repo_update.rb +34 -0
- data/lib/cocoapods/command/outdated.rb +140 -0
- data/lib/cocoapods/command/repo.rb +29 -0
- data/lib/cocoapods/command/repo/add.rb +103 -0
- data/lib/cocoapods/command/repo/lint.rb +82 -0
- data/lib/cocoapods/command/repo/list.rb +93 -0
- data/lib/cocoapods/command/repo/push.rb +281 -0
- data/lib/cocoapods/command/repo/remove.rb +36 -0
- data/lib/cocoapods/command/repo/update.rb +28 -0
- data/lib/cocoapods/command/setup.rb +103 -0
- data/lib/cocoapods/command/spec.rb +112 -0
- data/lib/cocoapods/command/spec/cat.rb +51 -0
- data/lib/cocoapods/command/spec/create.rb +283 -0
- data/lib/cocoapods/command/spec/edit.rb +87 -0
- data/lib/cocoapods/command/spec/env_spec.rb +53 -0
- data/lib/cocoapods/command/spec/lint.rb +137 -0
- data/lib/cocoapods/command/spec/which.rb +43 -0
- data/lib/cocoapods/command/update.rb +101 -0
- data/lib/cocoapods/config.rb +347 -0
- data/lib/cocoapods/core_overrides.rb +1 -0
- data/lib/cocoapods/downloader.rb +190 -0
- data/lib/cocoapods/downloader/cache.rb +233 -0
- data/lib/cocoapods/downloader/request.rb +86 -0
- data/lib/cocoapods/downloader/response.rb +16 -0
- data/lib/cocoapods/executable.rb +222 -0
- data/lib/cocoapods/external_sources.rb +57 -0
- data/lib/cocoapods/external_sources/abstract_external_source.rb +205 -0
- data/lib/cocoapods/external_sources/downloader_source.rb +30 -0
- data/lib/cocoapods/external_sources/path_source.rb +55 -0
- data/lib/cocoapods/external_sources/podspec_source.rb +54 -0
- data/lib/cocoapods/gem_version.rb +5 -0
- data/lib/cocoapods/generator/acknowledgements.rb +107 -0
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +44 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +94 -0
- data/lib/cocoapods/generator/app_target_helper.rb +244 -0
- data/lib/cocoapods/generator/bridge_support.rb +22 -0
- data/lib/cocoapods/generator/constant.rb +19 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +230 -0
- data/lib/cocoapods/generator/dummy_source.rb +31 -0
- data/lib/cocoapods/generator/embed_frameworks_script.rb +215 -0
- data/lib/cocoapods/generator/header.rb +103 -0
- data/lib/cocoapods/generator/info_plist_file.rb +116 -0
- data/lib/cocoapods/generator/module_map.rb +99 -0
- data/lib/cocoapods/generator/prefix_header.rb +60 -0
- data/lib/cocoapods/generator/umbrella_header.rb +46 -0
- data/lib/cocoapods/hooks_manager.rb +132 -0
- data/lib/cocoapods/installer.rb +703 -0
- data/lib/cocoapods/installer/analyzer.rb +972 -0
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +87 -0
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +98 -0
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +67 -0
- data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +157 -0
- data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +240 -0
- data/lib/cocoapods/installer/analyzer/specs_state.rb +84 -0
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +53 -0
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +260 -0
- data/lib/cocoapods/installer/installation_options.rb +158 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +202 -0
- data/lib/cocoapods/installer/pod_source_preparer.rb +77 -0
- data/lib/cocoapods/installer/podfile_validator.rb +139 -0
- data/lib/cocoapods/installer/post_install_hooks_context.rb +132 -0
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +51 -0
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +34 -0
- data/lib/cocoapods/installer/user_project_integrator.rb +250 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +463 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +146 -0
- data/lib/cocoapods/installer/xcode.rb +8 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +416 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +181 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +84 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +334 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +777 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +116 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +86 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +256 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +68 -0
- data/lib/cocoapods/installer/xcode/target_validator.rb +147 -0
- data/lib/cocoapods/open-uri.rb +33 -0
- data/lib/cocoapods/project.rb +414 -0
- data/lib/cocoapods/resolver.rb +585 -0
- data/lib/cocoapods/resolver/lazy_specification.rb +79 -0
- data/lib/cocoapods/sandbox.rb +404 -0
- data/lib/cocoapods/sandbox/file_accessor.rb +444 -0
- data/lib/cocoapods/sandbox/headers_store.rb +146 -0
- data/lib/cocoapods/sandbox/path_list.rb +220 -0
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
- data/lib/cocoapods/sandbox/podspec_finder.rb +23 -0
- data/lib/cocoapods/sources_manager.rb +157 -0
- data/lib/cocoapods/target.rb +261 -0
- data/lib/cocoapods/target/aggregate_target.rb +338 -0
- data/lib/cocoapods/target/build_settings.rb +1075 -0
- data/lib/cocoapods/target/pod_target.rb +559 -0
- data/lib/cocoapods/user_interface.rb +459 -0
- data/lib/cocoapods/user_interface/error_report.rb +187 -0
- data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
- data/lib/cocoapods/validator.rb +981 -0
- metadata +533 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'cocoapods/sources_manager'
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
require 'cocoapods-downloader'
|
|
2
|
+
require 'claide/informative_error'
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'tmpdir'
|
|
5
|
+
|
|
6
|
+
module Pod
|
|
7
|
+
module Downloader
|
|
8
|
+
require 'cocoapods/downloader/cache'
|
|
9
|
+
require 'cocoapods/downloader/request'
|
|
10
|
+
require 'cocoapods/downloader/response'
|
|
11
|
+
|
|
12
|
+
# Downloads a pod from the given `request` to the given `target` location.
|
|
13
|
+
#
|
|
14
|
+
# @return [Response] The download response for this download.
|
|
15
|
+
#
|
|
16
|
+
# @param [Request] request
|
|
17
|
+
# the request that describes this pod download.
|
|
18
|
+
#
|
|
19
|
+
# @param [Pathname,Nil] target
|
|
20
|
+
# the location to which this pod should be downloaded. If `nil`,
|
|
21
|
+
# then the pod will only be cached.
|
|
22
|
+
#
|
|
23
|
+
# @param [Boolean] can_cache
|
|
24
|
+
# whether caching is allowed.
|
|
25
|
+
#
|
|
26
|
+
# @param [Pathname,Nil] cache_path
|
|
27
|
+
# the path used to cache pod downloads.
|
|
28
|
+
#
|
|
29
|
+
def self.download(
|
|
30
|
+
request,
|
|
31
|
+
target,
|
|
32
|
+
can_cache: true,
|
|
33
|
+
cache_path: Config.instance.cache_root + 'Pods'
|
|
34
|
+
)
|
|
35
|
+
can_cache &&= !Config.instance.skip_download_cache
|
|
36
|
+
|
|
37
|
+
request = preprocess_request(request)
|
|
38
|
+
|
|
39
|
+
if can_cache
|
|
40
|
+
raise ArgumentError, 'Must provide a `cache_path` when caching.' unless cache_path
|
|
41
|
+
cache = Cache.new(cache_path)
|
|
42
|
+
result = cache.download_pod(request)
|
|
43
|
+
else
|
|
44
|
+
raise ArgumentError, 'Must provide a `target` when caching is disabled.' unless target
|
|
45
|
+
|
|
46
|
+
require 'cocoapods/installer/pod_source_preparer'
|
|
47
|
+
result, = download_request(request, target)
|
|
48
|
+
Installer::PodSourcePreparer.new(result.spec, result.location).prepare!
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
if target && result.location && target != result.location
|
|
52
|
+
UI.message "Copying #{request.name} from `#{result.location}` to #{UI.path target}", '> ' do
|
|
53
|
+
FileUtils.rm_rf target
|
|
54
|
+
FileUtils.cp_r(result.location, target)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
result
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Performs the download from the given `request` to the given `target` location.
|
|
61
|
+
#
|
|
62
|
+
# @return [Response, Hash<String,Specification>]
|
|
63
|
+
# The download response for this download, and the specifications
|
|
64
|
+
# for this download grouped by name.
|
|
65
|
+
#
|
|
66
|
+
# @param [Request] request
|
|
67
|
+
# the request that describes this pod download.
|
|
68
|
+
#
|
|
69
|
+
# @param [Pathname,Nil] target
|
|
70
|
+
# the location to which this pod should be downloaded. If `nil`,
|
|
71
|
+
# then the pod will only be cached.
|
|
72
|
+
#
|
|
73
|
+
def self.download_request(request, target)
|
|
74
|
+
result = Response.new
|
|
75
|
+
result.checkout_options = download_source(target, request.params)
|
|
76
|
+
result.location = target
|
|
77
|
+
|
|
78
|
+
if request.released_pod?
|
|
79
|
+
result.spec = request.spec
|
|
80
|
+
podspecs = { request.name => request.spec }
|
|
81
|
+
else
|
|
82
|
+
podspecs = Sandbox::PodspecFinder.new(target).podspecs
|
|
83
|
+
podspecs[request.name] = request.spec if request.spec
|
|
84
|
+
podspecs.each do |name, spec|
|
|
85
|
+
if request.name == name
|
|
86
|
+
result.spec = spec
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
[result, podspecs]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
|
|
96
|
+
# Downloads a pod with the given `params` to `target`.
|
|
97
|
+
#
|
|
98
|
+
# @param [Pathname] target
|
|
99
|
+
#
|
|
100
|
+
# @param [Hash<Symbol,String>] params
|
|
101
|
+
#
|
|
102
|
+
# @return [Hash] The checkout options required to re-download this exact
|
|
103
|
+
# same source.
|
|
104
|
+
#
|
|
105
|
+
def self.download_source(target, params)
|
|
106
|
+
FileUtils.rm_rf(target)
|
|
107
|
+
downloader = Downloader.for_target(target, params)
|
|
108
|
+
downloader.download
|
|
109
|
+
target.mkpath
|
|
110
|
+
|
|
111
|
+
if downloader.options_specific?
|
|
112
|
+
params
|
|
113
|
+
else
|
|
114
|
+
downloader.checkout_options
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Return a new request after preprocessing by the downloader
|
|
119
|
+
#
|
|
120
|
+
# @param [Request] request
|
|
121
|
+
# the request that needs preprocessing
|
|
122
|
+
#
|
|
123
|
+
# @return [Request] the preprocessed request
|
|
124
|
+
#
|
|
125
|
+
def self.preprocess_request(request)
|
|
126
|
+
Request.new(
|
|
127
|
+
:spec => request.spec,
|
|
128
|
+
:released => request.released_pod?,
|
|
129
|
+
:name => request.name,
|
|
130
|
+
:params => Downloader.preprocess_options(request.params))
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
public
|
|
134
|
+
|
|
135
|
+
class DownloaderError; include CLAide::InformativeError; end
|
|
136
|
+
|
|
137
|
+
class Base
|
|
138
|
+
override_api do
|
|
139
|
+
def execute_command(executable, command, raise_on_failure = false)
|
|
140
|
+
Executable.execute_command(executable, command, raise_on_failure)
|
|
141
|
+
rescue CLAide::InformativeError => e
|
|
142
|
+
raise DownloaderError, e.message
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Indicates that an action will be performed. The action is passed as a
|
|
146
|
+
# block.
|
|
147
|
+
#
|
|
148
|
+
# @param [String] message
|
|
149
|
+
# The message associated with the action.
|
|
150
|
+
#
|
|
151
|
+
# @yield The action, this block is always executed.
|
|
152
|
+
#
|
|
153
|
+
# @return [void]
|
|
154
|
+
#
|
|
155
|
+
def ui_action(message)
|
|
156
|
+
UI.section(" > #{message}", '', 1) do
|
|
157
|
+
yield
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Indicates that a minor action will be performed. The action is passed
|
|
162
|
+
# as a block.
|
|
163
|
+
#
|
|
164
|
+
# @param [String] message
|
|
165
|
+
# The message associated with the action.
|
|
166
|
+
#
|
|
167
|
+
# @yield The action, this block is always executed.
|
|
168
|
+
#
|
|
169
|
+
# @return [void]
|
|
170
|
+
#
|
|
171
|
+
def ui_sub_action(message)
|
|
172
|
+
UI.section(" > #{message}", '', 2) do
|
|
173
|
+
yield
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Prints an UI message.
|
|
178
|
+
#
|
|
179
|
+
# @param [String] message
|
|
180
|
+
# The message associated with the action.
|
|
181
|
+
#
|
|
182
|
+
# @return [void]
|
|
183
|
+
#
|
|
184
|
+
def ui_message(message)
|
|
185
|
+
UI.puts message
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'tmpdir'
|
|
3
|
+
|
|
4
|
+
module Pod
|
|
5
|
+
module Downloader
|
|
6
|
+
# The class responsible for managing Pod downloads, transparently caching
|
|
7
|
+
# them in a cache directory.
|
|
8
|
+
#
|
|
9
|
+
class Cache
|
|
10
|
+
# @return [Pathname] The root directory where this cache store its
|
|
11
|
+
# downloads.
|
|
12
|
+
#
|
|
13
|
+
attr_reader :root
|
|
14
|
+
|
|
15
|
+
# Initialize a new instance
|
|
16
|
+
#
|
|
17
|
+
# @param [Pathname,String] root
|
|
18
|
+
# see {#root}
|
|
19
|
+
#
|
|
20
|
+
def initialize(root)
|
|
21
|
+
@root = Pathname(root)
|
|
22
|
+
ensure_matching_version
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Downloads the Pod from the given `request`
|
|
26
|
+
#
|
|
27
|
+
# @param [Request] request
|
|
28
|
+
# the request to be downloaded.
|
|
29
|
+
#
|
|
30
|
+
# @return [Response] the response from downloading `request`
|
|
31
|
+
#
|
|
32
|
+
def download_pod(request)
|
|
33
|
+
cached_pod(request) || uncached_pod(request)
|
|
34
|
+
rescue Informative
|
|
35
|
+
raise
|
|
36
|
+
rescue
|
|
37
|
+
UI.puts("\n[!] Error installing #{request.name}".red)
|
|
38
|
+
raise
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [Hash<String, Hash<Symbol, String>>]
|
|
42
|
+
# A hash whose keys are the pod name
|
|
43
|
+
# And values are a hash with the following keys:
|
|
44
|
+
# :spec_file : path to the spec file
|
|
45
|
+
# :name : name of the pod
|
|
46
|
+
# :version : pod version
|
|
47
|
+
# :release : boolean to tell if that's a release pod
|
|
48
|
+
# :slug : the slug path where the pod cache is located
|
|
49
|
+
#
|
|
50
|
+
def cache_descriptors_per_pod
|
|
51
|
+
specs_dir = root + 'Specs'
|
|
52
|
+
release_specs_dir = specs_dir + 'Release'
|
|
53
|
+
return {} unless specs_dir.exist?
|
|
54
|
+
|
|
55
|
+
spec_paths = specs_dir.find.select { |f| f.fnmatch('*.podspec.json') }
|
|
56
|
+
spec_paths.reduce({}) do |hash, spec_path|
|
|
57
|
+
spec = Specification.from_file(spec_path)
|
|
58
|
+
hash[spec.name] ||= []
|
|
59
|
+
is_release = spec_path.to_s.start_with?(release_specs_dir.to_s)
|
|
60
|
+
request = Downloader::Request.new(:spec => spec, :released => is_release)
|
|
61
|
+
hash[spec.name] << {
|
|
62
|
+
:spec_file => spec_path,
|
|
63
|
+
:name => spec.name,
|
|
64
|
+
:version => spec.version,
|
|
65
|
+
:release => is_release,
|
|
66
|
+
:slug => root + request.slug,
|
|
67
|
+
}
|
|
68
|
+
hash
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
# Ensures the cache on disk was created with the same CocoaPods version as
|
|
75
|
+
# is currently running.
|
|
76
|
+
#
|
|
77
|
+
# @return [Void]
|
|
78
|
+
#
|
|
79
|
+
def ensure_matching_version
|
|
80
|
+
version_file = root + 'VERSION'
|
|
81
|
+
version = version_file.read.strip if version_file.file?
|
|
82
|
+
|
|
83
|
+
root.rmtree if version != Pod::VERSION && root.exist?
|
|
84
|
+
root.mkpath
|
|
85
|
+
|
|
86
|
+
version_file.open('w') { |f| f << Pod::VERSION }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @param [Request] request
|
|
90
|
+
# the request to be downloaded.
|
|
91
|
+
#
|
|
92
|
+
# @param [Hash<Symbol,String>] slug_opts
|
|
93
|
+
# the download options that should be used in constructing the
|
|
94
|
+
# cache slug for this request.
|
|
95
|
+
#
|
|
96
|
+
# @return [Pathname] The path for the Pod downloaded from the given
|
|
97
|
+
# `request`.
|
|
98
|
+
#
|
|
99
|
+
def path_for_pod(request, slug_opts = {})
|
|
100
|
+
root + request.slug(slug_opts)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @param [Request] request
|
|
104
|
+
# the request to be downloaded.
|
|
105
|
+
#
|
|
106
|
+
# @param [Hash<Symbol,String>] slug_opts
|
|
107
|
+
# the download options that should be used in constructing the
|
|
108
|
+
# cache slug for this request.
|
|
109
|
+
#
|
|
110
|
+
# @return [Pathname] The path for the podspec downloaded from the given
|
|
111
|
+
# `request`.
|
|
112
|
+
#
|
|
113
|
+
def path_for_spec(request, slug_opts = {})
|
|
114
|
+
path = root + 'Specs' + request.slug(slug_opts)
|
|
115
|
+
path.sub_ext('.podspec.json')
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @param [Request] request
|
|
119
|
+
# the request to be downloaded.
|
|
120
|
+
#
|
|
121
|
+
# @return [Response] The download response for the given `request` that
|
|
122
|
+
# was found in the download cache.
|
|
123
|
+
#
|
|
124
|
+
def cached_pod(request)
|
|
125
|
+
cached_spec = cached_spec(request)
|
|
126
|
+
path = path_for_pod(request)
|
|
127
|
+
|
|
128
|
+
return unless cached_spec && path.directory?
|
|
129
|
+
spec = request.spec || cached_spec
|
|
130
|
+
Response.new(path, spec, request.params)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# @param [Request] request
|
|
134
|
+
# the request to be downloaded.
|
|
135
|
+
#
|
|
136
|
+
# @return [Specification] The cached specification for the given
|
|
137
|
+
# `request`.
|
|
138
|
+
#
|
|
139
|
+
def cached_spec(request)
|
|
140
|
+
path = path_for_spec(request)
|
|
141
|
+
path.file? && Specification.from_file(path)
|
|
142
|
+
rescue JSON::ParserError
|
|
143
|
+
nil
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @param [Request] request
|
|
147
|
+
# the request to be downloaded.
|
|
148
|
+
#
|
|
149
|
+
# @return [Response] The download response for the given `request` that
|
|
150
|
+
# was not found in the download cache.
|
|
151
|
+
#
|
|
152
|
+
def uncached_pod(request)
|
|
153
|
+
in_tmpdir do |target|
|
|
154
|
+
result, podspecs = download(request, target)
|
|
155
|
+
result.location = nil
|
|
156
|
+
|
|
157
|
+
podspecs.each do |name, spec|
|
|
158
|
+
destination = path_for_pod(request, :name => name, :params => result.checkout_options)
|
|
159
|
+
copy_and_clean(target, destination, spec)
|
|
160
|
+
write_spec(spec, path_for_spec(request, :name => name, :params => result.checkout_options))
|
|
161
|
+
if request.name == name
|
|
162
|
+
result.location = destination
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
result
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def download(request, target)
|
|
171
|
+
Downloader.download_request(request, target)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Performs the given block inside a temporary directory,
|
|
175
|
+
# which is removed at the end of the block's scope.
|
|
176
|
+
#
|
|
177
|
+
# @return [Object] The return value of the given block
|
|
178
|
+
#
|
|
179
|
+
def in_tmpdir(&blk)
|
|
180
|
+
tmpdir = Pathname(Dir.mktmpdir)
|
|
181
|
+
blk.call(tmpdir)
|
|
182
|
+
ensure
|
|
183
|
+
FileUtils.remove_entry(tmpdir, :force => true) if tmpdir && tmpdir.exist?
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Copies the `source` directory to `destination`, cleaning the directory
|
|
187
|
+
# of any files unused by `spec`.
|
|
188
|
+
#
|
|
189
|
+
# @param [Pathname] source
|
|
190
|
+
#
|
|
191
|
+
# @param [Pathname] destination
|
|
192
|
+
#
|
|
193
|
+
# @param [Specification] spec
|
|
194
|
+
#
|
|
195
|
+
# @return [Void]
|
|
196
|
+
#
|
|
197
|
+
def copy_and_clean(source, destination, spec)
|
|
198
|
+
specs_by_platform = group_subspecs_by_platform(spec)
|
|
199
|
+
destination.parent.mkpath
|
|
200
|
+
FileUtils.rm_rf(destination)
|
|
201
|
+
FileUtils.cp_r(source, destination)
|
|
202
|
+
Pod::Installer::PodSourcePreparer.new(spec, destination).prepare!
|
|
203
|
+
Sandbox::PodDirCleaner.new(destination, specs_by_platform).clean!
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def group_subspecs_by_platform(spec)
|
|
207
|
+
specs_by_platform = {}
|
|
208
|
+
[spec, *spec.recursive_subspecs].each do |ss|
|
|
209
|
+
ss.available_platforms.each do |platform|
|
|
210
|
+
specs_by_platform[platform] ||= []
|
|
211
|
+
specs_by_platform[platform] << ss
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
specs_by_platform
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Writes the given `spec` to the given `path`.
|
|
218
|
+
#
|
|
219
|
+
# @param [Specification] spec
|
|
220
|
+
# the specification to be written.
|
|
221
|
+
#
|
|
222
|
+
# @param [Pathname] path
|
|
223
|
+
# the path the specification is to be written to.
|
|
224
|
+
#
|
|
225
|
+
# @return [Void]
|
|
226
|
+
#
|
|
227
|
+
def write_spec(spec, path)
|
|
228
|
+
path.dirname.mkpath
|
|
229
|
+
path.open('w') { |f| f.write spec.to_pretty_json }
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'digest'
|
|
2
|
+
|
|
3
|
+
module Pod
|
|
4
|
+
module Downloader
|
|
5
|
+
# This class represents a download request for a given Pod.
|
|
6
|
+
#
|
|
7
|
+
class Request
|
|
8
|
+
# @return [Specification,Nil] The specification for the pod whose download
|
|
9
|
+
# is being requested.
|
|
10
|
+
#
|
|
11
|
+
attr_reader :spec
|
|
12
|
+
|
|
13
|
+
# @return [Boolean] Whether this download request is for a released pod.
|
|
14
|
+
#
|
|
15
|
+
attr_reader :released_pod
|
|
16
|
+
alias_method :released_pod?, :released_pod
|
|
17
|
+
|
|
18
|
+
# @return [String] The name of the pod whose dowload is being requested.
|
|
19
|
+
#
|
|
20
|
+
attr_reader :name
|
|
21
|
+
|
|
22
|
+
# @return [Hash<Symbol, String>] The download parameters for this request.
|
|
23
|
+
#
|
|
24
|
+
attr_reader :params
|
|
25
|
+
|
|
26
|
+
# Initialize a new instance
|
|
27
|
+
#
|
|
28
|
+
# @param [Specification,Nil] spec
|
|
29
|
+
# see {#spec}
|
|
30
|
+
#
|
|
31
|
+
# @param [Boolean] released
|
|
32
|
+
# see {#released_pod}
|
|
33
|
+
#
|
|
34
|
+
# @param [String,Nil] name
|
|
35
|
+
# see {#name}
|
|
36
|
+
#
|
|
37
|
+
# @param [Hash<Symbol,String>,Nil] params
|
|
38
|
+
# see {#params}
|
|
39
|
+
#
|
|
40
|
+
def initialize(spec: nil, released: false, name: nil, params: false)
|
|
41
|
+
@released_pod = released
|
|
42
|
+
@spec = spec
|
|
43
|
+
@params = spec ? (spec.source && spec.source.dup) : params
|
|
44
|
+
@name = spec ? spec.name : name
|
|
45
|
+
|
|
46
|
+
validate!
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @param [String] name
|
|
50
|
+
# the name of the pod being downloaded.
|
|
51
|
+
#
|
|
52
|
+
# @param [Hash<#to_s, #to_s>] params
|
|
53
|
+
# the download parameters of the pod being downloaded.
|
|
54
|
+
#
|
|
55
|
+
# @param [Specification] spec
|
|
56
|
+
# the specification of the pod being downloaded.
|
|
57
|
+
#
|
|
58
|
+
# @return [String] The slug used to store the files resulting from this
|
|
59
|
+
# download request.
|
|
60
|
+
#
|
|
61
|
+
def slug(name: self.name, params: self.params, spec: self.spec)
|
|
62
|
+
checksum = spec && spec.checksum && '-' << spec.checksum[0, 5]
|
|
63
|
+
if released_pod?
|
|
64
|
+
"Release/#{name}/#{spec.version}#{checksum}"
|
|
65
|
+
else
|
|
66
|
+
opts = params.to_a.sort_by(&:first).map { |k, v| "#{k}=#{v}" }.join('-')
|
|
67
|
+
digest = Digest::MD5.hexdigest(opts)
|
|
68
|
+
"External/#{name}/#{digest}#{checksum}"
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
# Validates that the given request is well-formed.
|
|
75
|
+
#
|
|
76
|
+
# @return [Void]
|
|
77
|
+
#
|
|
78
|
+
def validate!
|
|
79
|
+
raise ArgumentError, 'Requires a name' unless name
|
|
80
|
+
raise ArgumentError, 'Must give a spec for a released download request' if released_pod? && !spec
|
|
81
|
+
raise ArgumentError, 'Requires a version if released' if released_pod? && !spec.version
|
|
82
|
+
raise ArgumentError, 'Requires params' unless params
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|