cocoapods-square-stable 0.19.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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1296 -0
  3. data/LICENSE +20 -0
  4. data/README.md +94 -0
  5. data/bin/pod +16 -0
  6. data/bin/sandbox-pod +120 -0
  7. data/lib/cocoapods.rb +77 -0
  8. data/lib/cocoapods/command.rb +116 -0
  9. data/lib/cocoapods/command/help.rb +23 -0
  10. data/lib/cocoapods/command/inter_process_communication.rb +178 -0
  11. data/lib/cocoapods/command/list.rb +77 -0
  12. data/lib/cocoapods/command/outdated.rb +56 -0
  13. data/lib/cocoapods/command/podfile_info.rb +91 -0
  14. data/lib/cocoapods/command/project.rb +88 -0
  15. data/lib/cocoapods/command/push.rb +172 -0
  16. data/lib/cocoapods/command/repo.rb +145 -0
  17. data/lib/cocoapods/command/search.rb +61 -0
  18. data/lib/cocoapods/command/setup.rb +134 -0
  19. data/lib/cocoapods/command/spec.rb +590 -0
  20. data/lib/cocoapods/config.rb +231 -0
  21. data/lib/cocoapods/downloader.rb +59 -0
  22. data/lib/cocoapods/executable.rb +118 -0
  23. data/lib/cocoapods/external_sources.rb +363 -0
  24. data/lib/cocoapods/file_list.rb +36 -0
  25. data/lib/cocoapods/gem_version.rb +7 -0
  26. data/lib/cocoapods/generator/acknowledgements.rb +107 -0
  27. data/lib/cocoapods/generator/acknowledgements/markdown.rb +40 -0
  28. data/lib/cocoapods/generator/acknowledgements/plist.rb +64 -0
  29. data/lib/cocoapods/generator/bridge_support.rb +22 -0
  30. data/lib/cocoapods/generator/copy_resources_script.rb +54 -0
  31. data/lib/cocoapods/generator/dummy_source.rb +22 -0
  32. data/lib/cocoapods/generator/prefix_header.rb +82 -0
  33. data/lib/cocoapods/generator/target_environment_header.rb +86 -0
  34. data/lib/cocoapods/generator/xcconfig.rb +185 -0
  35. data/lib/cocoapods/hooks/installer_representation.rb +134 -0
  36. data/lib/cocoapods/hooks/library_representation.rb +94 -0
  37. data/lib/cocoapods/hooks/pod_representation.rb +74 -0
  38. data/lib/cocoapods/installer.rb +571 -0
  39. data/lib/cocoapods/installer/analyzer.rb +559 -0
  40. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +253 -0
  41. data/lib/cocoapods/installer/file_references_installer.rb +179 -0
  42. data/lib/cocoapods/installer/pod_source_installer.rb +248 -0
  43. data/lib/cocoapods/installer/target_installer.rb +379 -0
  44. data/lib/cocoapods/installer/user_project_integrator.rb +180 -0
  45. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +224 -0
  46. data/lib/cocoapods/library.rb +202 -0
  47. data/lib/cocoapods/open_uri.rb +24 -0
  48. data/lib/cocoapods/project.rb +209 -0
  49. data/lib/cocoapods/resolver.rb +212 -0
  50. data/lib/cocoapods/sandbox.rb +343 -0
  51. data/lib/cocoapods/sandbox/file_accessor.rb +217 -0
  52. data/lib/cocoapods/sandbox/headers_store.rb +96 -0
  53. data/lib/cocoapods/sandbox/path_list.rb +208 -0
  54. data/lib/cocoapods/sources_manager.rb +276 -0
  55. data/lib/cocoapods/user_interface.rb +304 -0
  56. data/lib/cocoapods/user_interface/error_report.rb +101 -0
  57. data/lib/cocoapods/validator.rb +350 -0
  58. metadata +238 -0
@@ -0,0 +1,253 @@
1
+ module Pod
2
+ class Installer
3
+ class Analyzer
4
+
5
+ # Analyze the sandbox to detect which Pods should be removed, and which
6
+ # ones should be reinstalled.
7
+ #
8
+ # The logic is the following:
9
+ #
10
+ # Added
11
+ # - If not present in the sandbox lockfile.
12
+ # - The directory of the Pod doesn't exits.
13
+ #
14
+ # Changed
15
+ # - The version of the Pod changed.
16
+ # - The SHA of the specification file changed.
17
+ # - The specific installed (sub)specs of the same Pod changed.
18
+ # - The specification is in head mode or from an external source and the
19
+ # installation process is in update mode.
20
+ # - The directory of the Pod is empty.
21
+ # - The Pod has been pre-downloaded.
22
+ #
23
+ # Removed
24
+ # - If a specification is present in the lockfile but not in the resolved
25
+ # specs.
26
+ #
27
+ # Unchanged
28
+ # - If none of the above conditions match.
29
+ #
30
+ class SandboxAnalyzer
31
+
32
+ # @return [Sandbox] The sandbox to analyze.
33
+ #
34
+ attr_reader :sandbox
35
+
36
+ # @return [Array<Specifications>] The specifications returned by the
37
+ # resolver.
38
+ #
39
+ attr_reader :specs
40
+
41
+ # @return [Bool] Whether the installation is performed in update mode.
42
+ #
43
+ attr_reader :update_mode
44
+
45
+ # @return [Lockfile] The lockfile of the installation as a fall-back if
46
+ # there is no sandbox manifest. This is indented as a temporary
47
+ # solution to prevent the full re-installation from users which
48
+ # are upgrading from CP < 0.17.
49
+ #
50
+ # @todo Remove for CP 0.18.
51
+ #
52
+ attr_reader :lockfile
53
+
54
+ # @param [Sandbox] sandbox @see sandbox
55
+ # @param [Array<Specifications>] specs @see specs
56
+ # @param [Bool] update_mode @see update_mode
57
+ # @param [Lockfile] lockfile @see lockfile
58
+ #
59
+ def initialize(sandbox, specs, update_mode, lockfile = nil)
60
+ @sandbox = sandbox
61
+ @specs = specs
62
+ @update_mode = update_mode
63
+ @lockfile = lockfile
64
+ end
65
+
66
+ # Performs the analysis to the detect the state of the sandbox respect
67
+ # to the resolved specifications.
68
+ #
69
+ # @return [SpecsState] the state of the sandbox.
70
+ #
71
+ def analyze
72
+ state = SpecsState.new
73
+ if sandbox_manifest
74
+ all_names = (resolved_pods + sandbox_pods).uniq.sort
75
+ all_names.sort.each do |name|
76
+ state.add_name(name, pod_state(name))
77
+ end
78
+ else
79
+ state.added.concat(resolved_pods)
80
+ end
81
+ state
82
+ end
83
+
84
+ #---------------------------------------------------------------------#
85
+
86
+ private
87
+
88
+ # @!group Pod state
89
+
90
+ # Returns the state of the Pod with the given name.
91
+ #
92
+ # @param [String] pod
93
+ # the name of the Pod.
94
+ #
95
+ # @return [Symbol] The state
96
+ #
97
+ def pod_state(pod)
98
+ return :added if pod_added?(pod)
99
+ return :deleted if pod_deleted?(pod)
100
+ return :changed if pod_changed?(pod)
101
+ return :unchanged
102
+ end
103
+
104
+ # Returns whether the Pod with the given name should be installed.
105
+ #
106
+ # @note A Pod whose folder doesn't exists is considered added.
107
+ #
108
+ # @param [String] pod
109
+ # the name of the Pod.
110
+ #
111
+ # @return [Bool] Whether the Pod is added.
112
+ #
113
+ def pod_added?(pod)
114
+ return true if resolved_pods.include?(pod) && !sandbox_pods.include?(pod)
115
+ return true if !folder_exist?(pod)
116
+ return false
117
+ end
118
+
119
+ # Returns whether the Pod with the given name should be removed from
120
+ # the installation.
121
+ #
122
+ # @param [String] pod
123
+ # the name of the Pod.
124
+ #
125
+ # @return [Bool] Whether the Pod is deleted.
126
+ #
127
+ def pod_deleted?(pod)
128
+ return true if !resolved_pods.include?(pod) && sandbox_pods.include?(pod)
129
+ return false
130
+ end
131
+
132
+ # Returns whether the Pod with the given name should be considered
133
+ # changed and thus should be reinstalled.
134
+ #
135
+ # @note In update mode, as there is no way to know if a remote source
136
+ # hash changed the Pods in head mode and the ones from external
137
+ # sources are always marked as changed.
138
+ #
139
+ # @note A Pod whose folder is empty is considered changed.
140
+ #
141
+ # @param [String] pod
142
+ # the name of the Pod.
143
+ #
144
+ # @return [Bool] Whether the Pod is changed.
145
+ #
146
+ def pod_changed?(pod)
147
+ spec = root_spec(pod)
148
+ return true if spec.version != sandbox_version(pod)
149
+ return true if spec.checksum != sandbox_checksum(pod)
150
+ return true if resolved_spec_names(pod) != sandbox_spec_names(pod)
151
+ return true if sandbox.predownloaded?(pod)
152
+ return true if folder_empty?(pod)
153
+ if update_mode
154
+ return true if spec.version.head?
155
+ end
156
+ return false
157
+ end
158
+
159
+ #---------------------------------------------------------------------#
160
+
161
+ private
162
+
163
+ # @!group Private helpers
164
+
165
+ # @return [Lockfile] The manifest to use for the sandbox.
166
+ #
167
+ def sandbox_manifest
168
+ sandbox.manifest || lockfile
169
+ end
170
+
171
+ #--------------------------------------#
172
+
173
+ # @return [Array<String>] The name of the resolved Pods.
174
+ #
175
+ def resolved_pods
176
+ specs.map { |spec| spec.root.name }.uniq
177
+ end
178
+
179
+ # @return [Array<String>] The name of the Pods stored in the sandbox
180
+ # manifest.
181
+ #
182
+ def sandbox_pods
183
+ sandbox_manifest.pod_names.map { |name| Specification.root_name(name) }.uniq
184
+ end
185
+
186
+ # @return [Array<String>] The name of the resolved specifications
187
+ # (includes subspecs).
188
+ #
189
+ # @param [String] pod
190
+ # the name of the Pod.
191
+ #
192
+ def resolved_spec_names(pod)
193
+ specs.select { |s| s.root.name == pod }.map(&:name).uniq.sort
194
+ end
195
+
196
+ # @return [Array<String>] The name of the specifications stored in the
197
+ # sandbox manifest (includes subspecs).
198
+ #
199
+ # @param [String] pod
200
+ # the name of the Pod.
201
+ #
202
+ def sandbox_spec_names(pod)
203
+ sandbox_manifest.pod_names.select { |name| Specification.root_name(name) == pod }.uniq.sort
204
+ end
205
+
206
+ # @return [Specification] The root specification for the Pod with the
207
+ # given name.
208
+ #
209
+ # @param [String] pod
210
+ # the name of the Pod.
211
+ #
212
+ def root_spec(pod)
213
+ specs.find { |s| s.root.name == pod }.root
214
+ end
215
+
216
+ #--------------------------------------#
217
+
218
+ # @return [Version] The version of Pod with the given name stored in
219
+ # the sandbox.
220
+ #
221
+ # @param [String] pod
222
+ # the name of the Pod.
223
+ #
224
+ def sandbox_version(pod)
225
+ sandbox_manifest.version(pod)
226
+ end
227
+
228
+ # @return [String] The checksum of the specification of the Pod with
229
+ # the given name stored in the sandbox.
230
+ #
231
+ # @param [String] pod
232
+ # the name of the Pod.
233
+ #
234
+ def sandbox_checksum(pod)
235
+ sandbox_manifest.checksum(pod)
236
+ end
237
+
238
+ #--------------------------------------#
239
+
240
+ def folder_exist?(pod)
241
+ sandbox.pod_dir(pod).exist?
242
+ end
243
+
244
+ def folder_empty?(pod)
245
+ Dir.glob(sandbox.pod_dir(pod) + '*').empty?
246
+ end
247
+
248
+ #---------------------------------------------------------------------#
249
+
250
+ end
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,179 @@
1
+ module Pod
2
+ class Installer
3
+
4
+ # Controller class responsible of installing the file references of the
5
+ # specifications in the Pods project.
6
+ #
7
+ class FileReferencesInstaller
8
+
9
+ # @return [Sandbox] The sandbox of the installation.
10
+ #
11
+ attr_reader :sandbox
12
+
13
+ # @return [Array<Library>] The libraries of the installation.
14
+ #
15
+ attr_reader :libraries
16
+
17
+ # @return [Project] The Pods project.
18
+ #
19
+ attr_reader :pods_project
20
+
21
+ # @param [Sandbox] sandbox @see sandbox
22
+ # @param [Array<Library>] libraries @see libraries
23
+ # @param [Project] libraries @see libraries
24
+ #
25
+ def initialize(sandbox, libraries, pods_project)
26
+ @sandbox = sandbox
27
+ @libraries = libraries
28
+ @pods_project = pods_project
29
+ end
30
+
31
+ # Installs the file references.
32
+ #
33
+ # @return [void]
34
+ #
35
+ def install!
36
+ refresh_file_accessors
37
+ add_source_files_references
38
+ add_resources_references
39
+ link_headers
40
+ end
41
+
42
+ #-----------------------------------------------------------------------#
43
+
44
+ private
45
+
46
+ # @!group Installation Steps
47
+
48
+ # Reads the file accessors contents from the file system.
49
+ #
50
+ # @note The contents of the file accessors are modified by the clean
51
+ # step of the #{PodSourceInstaller} and by the pre install hooks.
52
+ #
53
+ # @return [void]
54
+ #
55
+ def refresh_file_accessors
56
+ file_accessors.each do |fa|
57
+ fa.path_list.read_file_system
58
+ end
59
+ end
60
+
61
+ # Adds the source files of the Pods to the Pods project.
62
+ #
63
+ # @note The source files are grouped by Pod and in turn by subspec
64
+ # (recursively).
65
+ #
66
+ # @note Pods are generally added to the `Pods` group, however, if they
67
+ # have a local source they are added to the
68
+ # `Local Pods` group.
69
+ #
70
+ # @return [void]
71
+ #
72
+ def add_source_files_references
73
+ UI.message "- Adding source files to Pods project" do
74
+ file_accessors.each do |file_accessor|
75
+ files = file_accessor.source_files
76
+ spec_name = file_accessor.spec.name
77
+ local = sandbox.local?(file_accessor.spec.root.name)
78
+ parent_group = local ? pods_project.local_pods : pods_project.pods
79
+ pods_project.add_file_references(files, spec_name, parent_group)
80
+ end
81
+ end
82
+ end
83
+
84
+ # Adds the resources of the Pods to the Pods project.
85
+ #
86
+ # @note The source files are grouped by Pod and in turn by subspec
87
+ # (recursively) in the resources group.
88
+ #
89
+ # @return [void]
90
+ #
91
+ def add_resources_references
92
+ UI.message "- Adding resources to Pods project" do
93
+ file_accessors.each do |file_accessor|
94
+ file_accessor.resources.each do |resources|
95
+ files = file_accessor.resources
96
+ spec_name = file_accessor.spec.name
97
+ parent_group = pods_project.resources
98
+ pods_project.add_file_references(files, spec_name, parent_group)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ # Creates the link to the headers of the Pod in the sandbox.
105
+ #
106
+ # @return [void]
107
+ #
108
+ def link_headers
109
+ UI.message "- Linking headers" do
110
+
111
+ file_accessors.each do |file_accessor|
112
+ headers_sandbox = Pathname.new(file_accessor.spec.root.name)
113
+ sandbox.build_headers.add_search_path(headers_sandbox)
114
+ sandbox.public_headers.add_search_path(headers_sandbox)
115
+
116
+ header_mappings(headers_sandbox, file_accessor, file_accessor.headers).each do |namespaced_path, files|
117
+ sandbox.build_headers.add_files(namespaced_path, files)
118
+ end
119
+
120
+ header_mappings(headers_sandbox, file_accessor, file_accessor.public_headers).each do |namespaced_path, files|
121
+ sandbox.public_headers.add_files(namespaced_path, files)
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ #-----------------------------------------------------------------------#
128
+
129
+ private
130
+
131
+ # @!group Private Helpers
132
+
133
+ # @return [Array<Sandbox::FileAccessor>] The file accessors for all the
134
+ # specs platform combinations.
135
+ #
136
+ def file_accessors
137
+ @file_accessors ||= libraries.map(&:file_accessors).flatten.compact
138
+ end
139
+
140
+ # Computes the destination sub-directory in the sandbox
141
+ #
142
+ # @param [Pathname] headers_sandbox
143
+ # The sandbox where the headers links should be stored for this
144
+ # Pod.
145
+ #
146
+ # @param [Specification::Consumer] consumer
147
+ # The consumer for which the headers need to be linked.
148
+ #
149
+ # @param [Array<Pathname>] headers
150
+ # The absolute paths of the headers which need to be mapped.
151
+ #
152
+ # @return [Hash{Pathname => Array<Pathname>}] A hash containing the
153
+ # headers folders as the keys and the absolute paths of the
154
+ # header files as the values.
155
+ #
156
+ def header_mappings(headers_sandbox, file_accessor, headers)
157
+ consumer = file_accessor.spec_consumer
158
+ dir = headers_sandbox
159
+ dir = dir + consumer.header_dir if consumer.header_dir
160
+
161
+ mappings = {}
162
+ headers.each do |header|
163
+ sub_dir = dir
164
+ if consumer.header_mappings_dir
165
+ header_mappings_dir = file_accessor.path_list.root + consumer.header_mappings_dir
166
+ relative_path = header.relative_path_from(header_mappings_dir)
167
+ sub_dir = sub_dir + relative_path.dirname
168
+ end
169
+ mappings[sub_dir] ||= []
170
+ mappings[sub_dir] << header
171
+ end
172
+ mappings
173
+ end
174
+
175
+ #-----------------------------------------------------------------------#
176
+
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,248 @@
1
+ module Pod
2
+ class Installer
3
+
4
+ # Controller class responsible of installing the activated specifications
5
+ # of a single Pod.
6
+ #
7
+ # @note This class needs to consider all the activated specs of a Pod.
8
+ #
9
+ class PodSourceInstaller
10
+
11
+ # @return [Sandbox]
12
+ #
13
+ attr_reader :sandbox
14
+
15
+ # @return [Hash{Symbol=>Array}] The specifications that need to be
16
+ # installed grouped by platform.
17
+ #
18
+ attr_reader :specs_by_platform
19
+
20
+ # @param [Sandbox] sandbox @see sandbox
21
+ # @param [Hash{Symbol=>Array}] specs_by_platform @see specs_by_platform
22
+ #
23
+ def initialize(sandbox, specs_by_platform)
24
+ @sandbox = sandbox
25
+ @specs_by_platform = specs_by_platform
26
+
27
+ @aggressive_cache = false
28
+ end
29
+
30
+ # @return [String] A string suitable for debugging.
31
+ #
32
+ def inspect
33
+ "<#{self.class} sandbox=#{sandbox.root} pod=#{root_spec.name}"
34
+ end
35
+
36
+ #-----------------------------------------------------------------------#
37
+
38
+ public
39
+
40
+ # @!group Configuration
41
+
42
+ # @return [Bool] whether the downloader should always check against the
43
+ # remote if issues might be generated (mostly useful to speed up
44
+ # testing).
45
+ #
46
+ # @note This might be removed in future.
47
+ #
48
+ attr_accessor :aggressive_cache
49
+ alias_method :aggressive_cache?, :aggressive_cache
50
+
51
+ #-----------------------------------------------------------------------#
52
+
53
+ public
54
+
55
+ # @!group Installation
56
+
57
+ # Creates the target in the Pods project and the relative support files.
58
+ #
59
+ # @return [void]
60
+ #
61
+ def install!
62
+ download_source unless predownloaded? || local?
63
+ end
64
+
65
+ # Cleans the installations if appropriate.
66
+ #
67
+ # @todo As the pre install hooks need to run before cleaning this
68
+ # method should be refactored.
69
+ #
70
+ # @return [void]
71
+ #
72
+ def clean!
73
+ clean_installation if !local?
74
+ end
75
+
76
+ # @return [Hash]
77
+ #
78
+ attr_reader :specific_source
79
+
80
+ #-----------------------------------------------------------------------#
81
+
82
+ private
83
+
84
+ # @!group Installation Steps
85
+
86
+ # Downloads the source of the Pod. It also stores the specific options
87
+ # needed to recreate the same exact installation if needed in
88
+ # `#specific_source`.
89
+ #
90
+ # @return [void]
91
+ #
92
+ def download_source
93
+ root.rmtree if root.exist?
94
+ if root_spec.version.head?
95
+ downloader.download_head
96
+ @specific_source = downloader.checkout_options
97
+ else
98
+ downloader.download
99
+ unless downloader.options_specific?
100
+ @specific_source = downloader.checkout_options
101
+ end
102
+ end
103
+
104
+ if specific_source
105
+ sandbox.store_checkout_source(root_spec.name, specific_source)
106
+ end
107
+ end
108
+
109
+ # Removes all the files not needed for the installation according to the
110
+ # specs by platform.
111
+ #
112
+ # @return [void]
113
+ #
114
+ def clean_installation
115
+ clean_paths.each { |path| FileUtils.rm_rf(path) }
116
+ end
117
+
118
+ #-----------------------------------------------------------------------#
119
+
120
+ public
121
+
122
+ # @!group Dependencies
123
+
124
+ # @return [Downloader] The downloader to use for the retrieving the
125
+ # source.
126
+ #
127
+ def downloader
128
+ return @downloader if @downloader
129
+ @downloader = Downloader.for_target(root, root_spec.source.dup)
130
+ @downloader.cache_root = CACHE_ROOT.to_s
131
+ @downloader.max_cache_size = MAX_CACHE_SIZE
132
+ @downloader.aggressive_cache = aggressive_cache?
133
+ @downloader
134
+ end
135
+
136
+ #-----------------------------------------------------------------------#
137
+
138
+ private
139
+
140
+ # @!group Convenience methods.
141
+
142
+ # @return [Array<Specifications>] the specification of the Pod used in
143
+ # this installation.
144
+ #
145
+ def specs
146
+ specs_by_platform.values.flatten
147
+ end
148
+
149
+ # @return [Specification] the root specification of the Pod.
150
+ #
151
+ def root_spec
152
+ specs.first.root
153
+ end
154
+
155
+ # @return [Pathname] the folder where the source of the Pod is located.
156
+ #
157
+ def root
158
+ sandbox.pod_dir(root_spec.name)
159
+ end
160
+
161
+ # @return [Boolean] whether the source has been pre downloaded in the
162
+ # resolution process to retrieve its podspec.
163
+ #
164
+ def predownloaded?
165
+ sandbox.predownloaded_pods.include?(root_spec.name)
166
+ end
167
+
168
+ # @return [Boolean] whether the pod uses the local option and thus
169
+ # CocoaPods should not interfere with the files of the user.
170
+ #
171
+ def local?
172
+ sandbox.local?(root_spec.name)
173
+ end
174
+
175
+ #-----------------------------------------------------------------------#
176
+
177
+ private
178
+
179
+ # @!group Private helpers
180
+
181
+ # @return [Array<Sandbox::FileAccessor>] the file accessors for all the
182
+ # specifications on their respective platform.
183
+ #
184
+ def file_accessors
185
+ return @file_accessors if @file_accessors
186
+ @file_accessors = []
187
+ specs_by_platform.each do |platform, specs|
188
+ specs.each do |spec|
189
+ @file_accessors << Sandbox::FileAccessor.new(path_list, spec.consumer(platform))
190
+ end
191
+ end
192
+ @file_accessors
193
+ end
194
+
195
+ # @return [Sandbox::PathList] The path list for this Pod.
196
+ #
197
+ def path_list
198
+ @path_list ||= Sandbox::PathList.new(root)
199
+ end
200
+
201
+ # Finds the absolute paths, including hidden ones, of the files
202
+ # that are not used by the pod and thus can be safely deleted.
203
+ #
204
+ # @note Implementation detail: Don't use `Dir#glob` as there is an
205
+ # unexplained issue (#568, #572 and #602).
206
+ #
207
+ # @todo The paths are down-cased for the comparison as issues similar
208
+ # to #602 lead the files not being matched and so cleaning all
209
+ # the files. This solution might create side effects.
210
+ #
211
+ # @return [Array<Strings>] The paths that can be deleted.
212
+ #
213
+ def clean_paths
214
+ cached_used = used_files
215
+ glob_options = File::FNM_DOTMATCH | File::FNM_CASEFOLD
216
+ files = Pathname.glob(root + "**/*", glob_options).map(&:to_s)
217
+
218
+ files.reject! do |candidate|
219
+ candidate = candidate.downcase
220
+ candidate.end_with?('.', '..') || cached_used.any? do |path|
221
+ path = path.downcase
222
+ path.include?(candidate) || candidate.include?(path)
223
+ end
224
+ end
225
+ files
226
+ end
227
+
228
+ # @return [Array<String>] The absolute path of all the files used by the
229
+ # specifications (according to their platform) of this Pod.
230
+ #
231
+ def used_files
232
+ files = [
233
+ file_accessors.map(&:source_files),
234
+ file_accessors.map(&:resources),
235
+ file_accessors.map(&:preserve_paths),
236
+ file_accessors.map(&:prefix_header),
237
+ file_accessors.map(&:readme),
238
+ file_accessors.map(&:license),
239
+ ]
240
+
241
+ files.flatten.compact.map{ |path| path.to_s }.uniq
242
+ end
243
+
244
+ #-----------------------------------------------------------------------#
245
+
246
+ end
247
+ end
248
+ end