cocoapods 0.37.2 → 0.38.0.beta.1
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 +4 -4
- data/CHANGELOG.md +136 -1
- data/lib/cocoapods.rb +0 -5
- data/lib/cocoapods/command.rb +3 -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/lib.rb +11 -4
- data/lib/cocoapods/command/list.rb +4 -4
- data/lib/cocoapods/command/outdated.rb +1 -10
- data/lib/cocoapods/command/project.rb +3 -2
- data/lib/cocoapods/command/spec.rb +0 -17
- data/lib/cocoapods/command/spec/cat.rb +1 -1
- data/lib/cocoapods/command/spec/create.rb +1 -0
- data/lib/cocoapods/command/spec/edit.rb +1 -1
- data/lib/cocoapods/command/spec/lint.rb +10 -4
- data/lib/cocoapods/config.rb +6 -0
- data/lib/cocoapods/downloader/cache.rb +48 -1
- data/lib/cocoapods/executable.rb +27 -6
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/copy_resources_script.rb +1 -0
- data/lib/cocoapods/generator/embed_frameworks_script.rb +23 -28
- data/lib/cocoapods/generator/header.rb +5 -1
- data/lib/cocoapods/generator/umbrella_header.rb +1 -1
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +139 -33
- data/lib/cocoapods/generator/xcconfig/private_pod_xcconfig.rb +2 -2
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +3 -3
- data/lib/cocoapods/installer.rb +64 -109
- data/lib/cocoapods/installer/analyzer.rb +167 -336
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +46 -0
- data/lib/cocoapods/installer/analyzer/specs_state.rb +76 -0
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +41 -0
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +203 -0
- data/lib/cocoapods/installer/file_references_installer.rb +48 -13
- data/lib/cocoapods/installer/podfile_validator.rb +86 -0
- data/lib/cocoapods/installer/{hooks_context.rb → post_install_hooks_context.rb} +3 -3
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +41 -0
- data/lib/cocoapods/installer/target_installer.rb +1 -7
- data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +15 -17
- data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +4 -4
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +16 -16
- data/lib/cocoapods/sandbox/file_accessor.rb +20 -2
- data/lib/cocoapods/sandbox/path_list.rb +15 -13
- data/lib/cocoapods/sandbox/podspec_finder.rb +1 -0
- data/lib/cocoapods/sources_manager.rb +2 -0
- data/lib/cocoapods/target.rb +7 -37
- data/lib/cocoapods/target/aggregate_target.rb +25 -1
- data/lib/cocoapods/target/pod_target.rb +106 -10
- data/lib/cocoapods/user_interface.rb +26 -0
- data/lib/cocoapods/user_interface/error_report.rb +6 -0
- data/lib/cocoapods/validator.rb +22 -0
- metadata +21 -16
- data/lib/cocoapods/generator/target_environment_header.rb +0 -171
- data/lib/cocoapods/hooks/installer_representation.rb +0 -133
- data/lib/cocoapods/hooks/library_representation.rb +0 -93
- data/lib/cocoapods/hooks/pod_representation.rb +0 -70
@@ -0,0 +1,86 @@
|
|
1
|
+
module Pod
|
2
|
+
class Installer
|
3
|
+
# Validate the podfile before installing to catch errors and
|
4
|
+
# problems
|
5
|
+
#
|
6
|
+
class PodfileValidator
|
7
|
+
# @return [Podfile] The podfile being validated
|
8
|
+
#
|
9
|
+
attr_reader :podfile
|
10
|
+
|
11
|
+
# @return [Array<String>] any errors that have occured during the validation
|
12
|
+
#
|
13
|
+
attr_reader :errors
|
14
|
+
|
15
|
+
# Initialize a new instance
|
16
|
+
# @param [Podfile] podfile
|
17
|
+
# The podfile to validate
|
18
|
+
#
|
19
|
+
def initialize(podfile)
|
20
|
+
@podfile = podfile
|
21
|
+
@errors = []
|
22
|
+
@validated = false
|
23
|
+
end
|
24
|
+
|
25
|
+
# Validate the podfile
|
26
|
+
# Errors are added to the errors array
|
27
|
+
#
|
28
|
+
def validate
|
29
|
+
validate_pod_directives
|
30
|
+
|
31
|
+
@validated = true
|
32
|
+
end
|
33
|
+
|
34
|
+
# Wether the podfile is valid is not
|
35
|
+
# NOTE: Will execute `validate` if the podfile
|
36
|
+
# has not yet been validated
|
37
|
+
#
|
38
|
+
def valid?
|
39
|
+
validate unless @validated
|
40
|
+
|
41
|
+
@validated && errors.size == 0
|
42
|
+
end
|
43
|
+
|
44
|
+
# A message describing any errors in the
|
45
|
+
# validation
|
46
|
+
#
|
47
|
+
def message
|
48
|
+
errors.join("\n")
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def add_error(error)
|
54
|
+
errors << error
|
55
|
+
end
|
56
|
+
|
57
|
+
def validate_pod_directives
|
58
|
+
dependencies = podfile.target_definitions.flat_map do |_, target|
|
59
|
+
target.dependencies
|
60
|
+
end.uniq
|
61
|
+
|
62
|
+
dependencies.each do |dependency|
|
63
|
+
validate_conflicting_external_sources!(dependency)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def validate_conflicting_external_sources!(dependency)
|
68
|
+
external_source = dependency.external_source
|
69
|
+
return false if external_source.nil?
|
70
|
+
|
71
|
+
available_downloaders = Downloader.downloader_class_by_key.keys
|
72
|
+
specified_downloaders = external_source.select { |key| available_downloaders.include?(key) }
|
73
|
+
if specified_downloaders.size > 1
|
74
|
+
add_error "The dependency `#{dependency.name}` specifies more than one download strategy(#{specified_downloaders.keys.join(',')})." \
|
75
|
+
'Only one is allowed'
|
76
|
+
end
|
77
|
+
|
78
|
+
pod_spec_or_path = external_source[:podspec].present? || external_source[:path].present?
|
79
|
+
if pod_spec_or_path && specified_downloaders.size > 0
|
80
|
+
add_error "The dependency `#{dependency.name}` specifies `podspec` or `path` in combination with other" \
|
81
|
+
' download strategies. This is not allowed'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -3,7 +3,7 @@ module Pod
|
|
3
3
|
# Context object designed to be used with the HooksManager which describes
|
4
4
|
# the context of the installer.
|
5
5
|
#
|
6
|
-
class
|
6
|
+
class PostInstallHooksContext
|
7
7
|
# @return [String] The path to the sandbox root (`Pods` directory).
|
8
8
|
#
|
9
9
|
attr_accessor :sandbox_root
|
@@ -13,7 +13,7 @@ module Pod
|
|
13
13
|
#
|
14
14
|
attr_accessor :umbrella_targets
|
15
15
|
|
16
|
-
#
|
16
|
+
# @return [PostInstallHooksContext] Convenience class generator method
|
17
17
|
#
|
18
18
|
# @param [Sandbox] sandbox
|
19
19
|
# The sandbox
|
@@ -66,7 +66,7 @@ module Pod
|
|
66
66
|
#
|
67
67
|
attr_accessor :specs
|
68
68
|
|
69
|
-
# @return [Symbol] The platform (either `:ios` or `:osx`).
|
69
|
+
# @return [Symbol] The platform (either `:ios`, `:watchos` or `:osx`).
|
70
70
|
#
|
71
71
|
attr_accessor :platform_name
|
72
72
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Pod
|
2
|
+
class Installer
|
3
|
+
# Context object designed to be used with the HooksManager which describes
|
4
|
+
# the context of the installer before analysis has been completed.
|
5
|
+
#
|
6
|
+
class PreInstallHooksContext
|
7
|
+
# @return [String] The path to the sandbox root (`Pods` directory).
|
8
|
+
#
|
9
|
+
attr_accessor :sandbox_root
|
10
|
+
|
11
|
+
# @return [Podfile] The Podfile for the project.
|
12
|
+
#
|
13
|
+
attr_accessor :podfile
|
14
|
+
|
15
|
+
# @return [Sandbox] The Sandbox for the project.
|
16
|
+
#
|
17
|
+
attr_accessor :sandbox
|
18
|
+
|
19
|
+
# @return [Lockfile] The Lockfile for the project.
|
20
|
+
#
|
21
|
+
attr_accessor :lockfile
|
22
|
+
|
23
|
+
# @param [Sandbox] sandbox see {#sandbox}
|
24
|
+
#
|
25
|
+
# @param [Podfile] podfile see {#podfile}
|
26
|
+
#
|
27
|
+
# @param [Lockfile] lockfile see {#lockfile}
|
28
|
+
#
|
29
|
+
# @return [PreInstallHooksContext] Convenience class method to generate the
|
30
|
+
# static context.
|
31
|
+
#
|
32
|
+
def self.generate(sandbox, podfile, lockfile)
|
33
|
+
result = new
|
34
|
+
result.podfile = podfile
|
35
|
+
result.sandbox = sandbox
|
36
|
+
result.lockfile = lockfile
|
37
|
+
result
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -67,7 +67,7 @@ module Pod
|
|
67
67
|
def custom_build_settings
|
68
68
|
settings = {}
|
69
69
|
|
70
|
-
|
70
|
+
unless target.archs.empty?
|
71
71
|
settings['ARCHS'] = target.archs
|
72
72
|
end
|
73
73
|
|
@@ -184,12 +184,6 @@ module Pod
|
|
184
184
|
sandbox.project
|
185
185
|
end
|
186
186
|
|
187
|
-
# @return [TargetDefinition] the target definition of the library.
|
188
|
-
#
|
189
|
-
def target_definition
|
190
|
-
target.target_definition
|
191
|
-
end
|
192
|
-
|
193
187
|
# @return [PBXGroup] the group where the file references to the support
|
194
188
|
# files should be stored.
|
195
189
|
#
|
@@ -20,7 +20,6 @@ module Pod
|
|
20
20
|
create_umbrella_header
|
21
21
|
create_embed_frameworks_script
|
22
22
|
end
|
23
|
-
create_target_environment_header
|
24
23
|
create_bridge_support_file
|
25
24
|
create_copy_resources_script
|
26
25
|
create_acknowledgements
|
@@ -32,6 +31,12 @@ module Pod
|
|
32
31
|
|
33
32
|
private
|
34
33
|
|
34
|
+
# @return [TargetDefinition] the target definition of the library.
|
35
|
+
#
|
36
|
+
def target_definition
|
37
|
+
target.target_definition
|
38
|
+
end
|
39
|
+
|
35
40
|
# Ensure that vendored static frameworks and libraries are not linked
|
36
41
|
# twice to the aggregate target, which shares the xcconfig of the user
|
37
42
|
# target.
|
@@ -73,16 +78,6 @@ module Pod
|
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
76
|
-
# Generates a header which allows to inspect at compile time the installed
|
77
|
-
# pods and the installed specifications of a pod.
|
78
|
-
#
|
79
|
-
def create_target_environment_header
|
80
|
-
path = target.target_environment_header_path
|
81
|
-
generator = Generator::TargetEnvironmentHeader.new(target.specs_by_build_configuration)
|
82
|
-
generator.save_as(path)
|
83
|
-
add_file_to_support_group(path)
|
84
|
-
end
|
85
|
-
|
86
81
|
# Generates the bridge support metadata if requested by the {Podfile}.
|
87
82
|
#
|
88
83
|
# @note The bridge support metadata is added to the resources of the
|
@@ -92,7 +87,7 @@ module Pod
|
|
92
87
|
# @return [void]
|
93
88
|
#
|
94
89
|
def create_bridge_support_file
|
95
|
-
if
|
90
|
+
if target.podfile.generate_bridge_support?
|
96
91
|
path = target.bridge_support_path
|
97
92
|
headers = native_target.headers_build_phase.files.map { |bf| sandbox.root + bf.file_ref.path }
|
98
93
|
generator = Generator::BridgeSupport.new(headers)
|
@@ -112,7 +107,7 @@ module Pod
|
|
112
107
|
end
|
113
108
|
resources_by_config = {}
|
114
109
|
target.user_build_configurations.keys.each do |config|
|
115
|
-
file_accessors = library_targets.select { |t| t.include_in_build_config?(config) }.flat_map(&:file_accessors)
|
110
|
+
file_accessors = library_targets.select { |t| t.include_in_build_config?(target_definition, config) }.flat_map(&:file_accessors)
|
116
111
|
resource_paths = file_accessors.flat_map { |accessor| accessor.resources.flat_map { |res| res.relative_path_from(project.path.dirname) } }
|
117
112
|
resource_bundles = file_accessors.flat_map { |accessor| accessor.resource_bundles.keys.map { |name| "${BUILT_PRODUCTS_DIR}/#{name.shellescape}.bundle" } }
|
118
113
|
resources_by_config[config] = (resource_paths + resource_bundles).uniq
|
@@ -149,11 +144,14 @@ module Pod
|
|
149
144
|
path = target.embed_frameworks_script_path
|
150
145
|
frameworks_by_config = {}
|
151
146
|
target.user_build_configurations.keys.each do |config|
|
152
|
-
|
153
|
-
pod_target.include_in_build_config?(config) && pod_target.should_build?
|
154
|
-
end
|
147
|
+
relevant_pod_targets = target.pod_targets.select do |pod_target|
|
148
|
+
pod_target.include_in_build_config?(target_definition, config) && pod_target.should_build?
|
149
|
+
end
|
150
|
+
frameworks_by_config[config] = relevant_pod_targets.map do |pod_target|
|
151
|
+
"#{target_definition.label}/#{pod_target.product_name}"
|
152
|
+
end
|
155
153
|
end
|
156
|
-
generator = Generator::EmbedFrameworksScript.new(
|
154
|
+
generator = Generator::EmbedFrameworksScript.new(frameworks_by_config)
|
157
155
|
generator.save_as(path)
|
158
156
|
add_file_to_support_group(path)
|
159
157
|
end
|
@@ -130,7 +130,7 @@ module Pod
|
|
130
130
|
|
131
131
|
bundle_target.build_configurations.each do |c|
|
132
132
|
c.build_settings['PRODUCT_NAME'] = bundle_name
|
133
|
-
if target.requires_frameworks?
|
133
|
+
if target.requires_frameworks? && target.scoped?
|
134
134
|
c.build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir
|
135
135
|
end
|
136
136
|
end
|
@@ -174,7 +174,6 @@ module Pod
|
|
174
174
|
def create_prefix_header
|
175
175
|
path = target.prefix_header_path
|
176
176
|
generator = Generator::PrefixHeader.new(target.file_accessors, target.platform)
|
177
|
-
generator.imports << target.target_environment_header_path.basename
|
178
177
|
generator.save_as(path)
|
179
178
|
add_file_to_support_group(path)
|
180
179
|
|
@@ -187,6 +186,7 @@ module Pod
|
|
187
186
|
ENABLE_OBJECT_USE_OBJC_FROM = {
|
188
187
|
:ios => Version.new('6'),
|
189
188
|
:osx => Version.new('10.8'),
|
189
|
+
:watchos => Version.new('2.0'),
|
190
190
|
}
|
191
191
|
|
192
192
|
# Returns the compiler flags for the source files of the given specification.
|
@@ -235,8 +235,8 @@ module Pod
|
|
235
235
|
flags << '-DOS_OBJECT_USE_OBJC=0'
|
236
236
|
end
|
237
237
|
end
|
238
|
-
if
|
239
|
-
flags << '-w -Xanalyzer -analyzer-disable-
|
238
|
+
if target.inhibit_warnings?
|
239
|
+
flags << '-w -Xanalyzer -analyzer-disable-all-checks'
|
240
240
|
end
|
241
241
|
flags * ' '
|
242
242
|
end
|
@@ -142,19 +142,13 @@ module Pod
|
|
142
142
|
# @return [void]
|
143
143
|
#
|
144
144
|
def add_embed_frameworks_script_phase
|
145
|
-
phase_name = 'Embed Pods Frameworks'
|
146
145
|
targets_to_embed_in = native_targets_to_integrate.select do |target|
|
147
146
|
EMBED_FRAMEWORK_TARGET_TYPES.include?(target.symbol_type)
|
148
147
|
end
|
149
148
|
targets_to_embed_in.each do |native_target|
|
150
|
-
|
151
|
-
unless embed_build_phase.present?
|
152
|
-
UI.message("Adding Build Phase '#{phase_name}' to project.")
|
153
|
-
embed_build_phase = native_target.new_shell_script_build_phase(phase_name)
|
154
|
-
end
|
149
|
+
phase = create_or_update_build_phase(native_target, 'Embed Pods Frameworks')
|
155
150
|
script_path = target.embed_frameworks_script_relative_path
|
156
|
-
|
157
|
-
embed_build_phase.show_env_vars_in_log = '0'
|
151
|
+
phase.shell_script = %("#{script_path}"\n)
|
158
152
|
end
|
159
153
|
end
|
160
154
|
|
@@ -189,11 +183,9 @@ module Pod
|
|
189
183
|
def add_copy_resources_script_phase
|
190
184
|
phase_name = 'Copy Pods Resources'
|
191
185
|
native_targets_to_integrate.each do |native_target|
|
192
|
-
phase = native_target
|
193
|
-
phase ||= native_target.new_shell_script_build_phase(phase_name)
|
186
|
+
phase = create_or_update_build_phase(native_target, phase_name)
|
194
187
|
script_path = target.copy_resources_script_relative_path
|
195
188
|
phase.shell_script = %("#{script_path}"\n)
|
196
|
-
phase.show_env_vars_in_log = '0'
|
197
189
|
end
|
198
190
|
end
|
199
191
|
|
@@ -209,10 +201,8 @@ module Pod
|
|
209
201
|
def add_check_manifest_lock_script_phase
|
210
202
|
phase_name = 'Check Pods Manifest.lock'
|
211
203
|
native_targets_to_integrate.each do |native_target|
|
212
|
-
|
213
|
-
|
214
|
-
native_target.build_phases.unshift(phase)
|
215
|
-
phase.name = phase_name
|
204
|
+
phase = create_or_update_build_phase(native_target, phase_name)
|
205
|
+
native_target.build_phases.unshift(phase).uniq!
|
216
206
|
phase.shell_script = <<-EOS.strip_heredoc
|
217
207
|
diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
|
218
208
|
if [[ $? != 0 ]] ; then
|
@@ -222,7 +212,6 @@ module Pod
|
|
222
212
|
exit 1
|
223
213
|
fi
|
224
214
|
EOS
|
225
|
-
phase.show_env_vars_in_log = '0'
|
226
215
|
end
|
227
216
|
end
|
228
217
|
|
@@ -278,6 +267,17 @@ module Pod
|
|
278
267
|
"Integrating target `#{target.name}` " \
|
279
268
|
"(#{UI.path target.user_project_path} project)"
|
280
269
|
end
|
270
|
+
|
271
|
+
def create_or_update_build_phase(target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
|
272
|
+
target.build_phases.grep(phase_class).find { |phase| phase.name == phase_name } ||
|
273
|
+
target.project.new(phase_class).tap do |phase|
|
274
|
+
UI.message("Adding Build Phase '#{phase_name}' to project.") do
|
275
|
+
phase.name = phase_name
|
276
|
+
phase.show_env_vars_in_log = '0'
|
277
|
+
target.build_phases << phase
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
281
|
end
|
282
282
|
end
|
283
283
|
end
|
@@ -152,13 +152,31 @@ module Pod
|
|
152
152
|
paths_for_attribute(:vendored_frameworks, true)
|
153
153
|
end
|
154
154
|
|
155
|
+
# @param [Pathname] framework
|
156
|
+
# The vendored framework to search into.
|
157
|
+
# @return [Pathname] The path of the header directory of the
|
158
|
+
# vendored framework.
|
159
|
+
#
|
160
|
+
def self.vendored_frameworks_headers_dir(framework)
|
161
|
+
(framework + 'Headers').realpath
|
162
|
+
end
|
163
|
+
|
164
|
+
# @param [Pathname] framework
|
165
|
+
# The vendored framework to search into.
|
166
|
+
# @return [Array<Pathname>] The paths of the headers included in the
|
167
|
+
# vendored framework.
|
168
|
+
#
|
169
|
+
def self.vendored_frameworks_headers(framework)
|
170
|
+
headers_dir = vendored_frameworks_headers_dir(framework)
|
171
|
+
Pathname.glob(headers_dir + '**/' + GLOB_PATTERNS[:public_header_files])
|
172
|
+
end
|
173
|
+
|
155
174
|
# @return [Array<Pathname>] The paths of the framework headers that come
|
156
175
|
# shipped with the Pod.
|
157
176
|
#
|
158
177
|
def vendored_frameworks_headers
|
159
178
|
vendored_frameworks.map do |framework|
|
160
|
-
|
161
|
-
Pathname.glob(headers_dir + GLOB_PATTERNS[:public_header_files])
|
179
|
+
self.class.vendored_frameworks_headers(framework)
|
162
180
|
end.flatten.uniq
|
163
181
|
end
|
164
182
|
|
@@ -21,6 +21,7 @@ module Pod
|
|
21
21
|
#
|
22
22
|
def initialize(root)
|
23
23
|
@root = root
|
24
|
+
@glob_cache = {}
|
24
25
|
end
|
25
26
|
|
26
27
|
# @return [Array<String>] The list of absolute the path of all the files
|
@@ -55,6 +56,7 @@ module Pod
|
|
55
56
|
relative_paths = absolute_paths.map { |p| p[root_length..-1] }
|
56
57
|
@files = relative_paths - relative_dirs
|
57
58
|
@dirs = relative_dirs.map { |d| d.gsub(/\/\.\.?$/, '') }.reject { |d| d == '.' || d == '..' } .uniq
|
59
|
+
@glob_cache = {}
|
58
60
|
end
|
59
61
|
|
60
62
|
#-----------------------------------------------------------------------#
|
@@ -101,6 +103,10 @@ module Pod
|
|
101
103
|
def relative_glob(patterns, options = {})
|
102
104
|
return [] if patterns.empty?
|
103
105
|
|
106
|
+
cache_key = options.merge(:patterns => patterns)
|
107
|
+
cached_value = @glob_cache[cache_key]
|
108
|
+
return cached_value if cached_value
|
109
|
+
|
104
110
|
dir_pattern = options[:dir_pattern]
|
105
111
|
exclude_patterns = options[:exclude_patterns]
|
106
112
|
include_dirs = options[:include_dirs]
|
@@ -112,19 +118,15 @@ module Pod
|
|
112
118
|
end
|
113
119
|
|
114
120
|
list = Array(patterns).map do |pattern|
|
115
|
-
if
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
File.fnmatch(p, path, File::FNM_CASEFOLD | File::FNM_PATHNAME)
|
124
|
-
end
|
121
|
+
if directory?(pattern) && dir_pattern
|
122
|
+
pattern += '/' unless pattern.end_with?('/')
|
123
|
+
pattern += dir_pattern
|
124
|
+
end
|
125
|
+
expanded_patterns = dir_glob_equivalent_patterns(pattern)
|
126
|
+
full_list.select do |path|
|
127
|
+
expanded_patterns.any? do |p|
|
128
|
+
File.fnmatch(p, path, File::FNM_CASEFOLD | File::FNM_PATHNAME)
|
125
129
|
end
|
126
|
-
else
|
127
|
-
full_list.select { |path| path.match(pattern) }
|
128
130
|
end
|
129
131
|
end.flatten
|
130
132
|
|
@@ -133,7 +135,7 @@ module Pod
|
|
133
135
|
exclude_options = { :dir_pattern => '**/*', :include_dirs => include_dirs }
|
134
136
|
list -= relative_glob(exclude_patterns, exclude_options)
|
135
137
|
end
|
136
|
-
list
|
138
|
+
@glob_cache[cache_key] = list
|
137
139
|
end
|
138
140
|
|
139
141
|
#-----------------------------------------------------------------------#
|