cocoapods 0.35.0 → 0.36.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 +185 -6
- data/README.md +1 -1
- data/lib/cocoapods.rb +4 -0
- data/lib/cocoapods/command.rb +2 -2
- data/lib/cocoapods/command/inter_process_communication.rb +1 -1
- data/lib/cocoapods/command/lib.rb +3 -0
- data/lib/cocoapods/command/list.rb +0 -35
- data/lib/cocoapods/command/search.rb +1 -2
- data/lib/cocoapods/command/spec.rb +6 -3
- data/lib/cocoapods/config.rb +1 -20
- data/lib/cocoapods/external_sources/abstract_external_source.rb +4 -0
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/embed_frameworks_script.rb +107 -0
- data/lib/cocoapods/generator/header.rb +13 -1
- data/lib/cocoapods/generator/info_plist_file.rb +84 -0
- data/lib/cocoapods/generator/module_map.rb +49 -0
- data/lib/cocoapods/generator/umbrella_header.rb +44 -0
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +69 -23
- data/lib/cocoapods/generator/xcconfig/private_pod_xcconfig.rb +12 -0
- data/lib/cocoapods/generator/xcconfig/public_pod_xcconfig.rb +1 -9
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +79 -1
- data/lib/cocoapods/hooks_manager.rb +75 -13
- data/lib/cocoapods/installer.rb +59 -2
- data/lib/cocoapods/installer/analyzer.rb +115 -38
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +6 -1
- data/lib/cocoapods/installer/file_references_installer.rb +11 -5
- data/lib/cocoapods/installer/migrator.rb +9 -0
- data/lib/cocoapods/installer/target_installer.rb +89 -5
- data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +49 -5
- data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +57 -9
- data/lib/cocoapods/installer/user_project_integrator.rb +3 -2
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +67 -6
- data/lib/cocoapods/project.rb +18 -2
- data/lib/cocoapods/resolver.rb +2 -2
- data/lib/cocoapods/sandbox/file_accessor.rb +23 -3
- data/lib/cocoapods/sandbox/headers_store.rb +4 -0
- data/lib/cocoapods/sources_manager.rb +5 -1
- data/lib/cocoapods/target.rb +117 -1
- data/lib/cocoapods/target/aggregate_target.rb +46 -4
- data/lib/cocoapods/target/pod_target.rb +39 -1
- data/lib/cocoapods/user_interface.rb +16 -21
- data/lib/cocoapods/user_interface/error_report.rb +2 -2
- data/lib/cocoapods/validator.rb +68 -23
- metadata +23 -19
@@ -12,8 +12,14 @@ module Pod
|
|
12
12
|
UI.message "- Installing target `#{target.name}` #{target.platform}" do
|
13
13
|
add_target
|
14
14
|
create_support_files_dir
|
15
|
-
|
15
|
+
create_support_files_group
|
16
16
|
create_xcconfig_file
|
17
|
+
if target.requires_frameworks?
|
18
|
+
create_info_plist_file
|
19
|
+
create_module_map
|
20
|
+
create_umbrella_header
|
21
|
+
create_embed_frameworks_script
|
22
|
+
end
|
17
23
|
create_target_environment_header
|
18
24
|
create_bridge_support_file
|
19
25
|
create_copy_resources_script
|
@@ -26,12 +32,25 @@ module Pod
|
|
26
32
|
|
27
33
|
private
|
28
34
|
|
35
|
+
# Ensure that vendored static frameworks and libraries are not linked
|
36
|
+
# twice to the aggregate target, which shares the xcconfig of the user
|
37
|
+
# target.
|
38
|
+
#
|
39
|
+
def custom_build_settings
|
40
|
+
settings = {
|
41
|
+
'OTHER_LDFLAGS' => '',
|
42
|
+
'OTHER_LIBTOOLFLAGS' => '',
|
43
|
+
'PODS_ROOT' => '$(SRCROOT)',
|
44
|
+
}
|
45
|
+
super.merge(settings)
|
46
|
+
end
|
47
|
+
|
29
48
|
# Creates the group that holds the references to the support files
|
30
49
|
# generated by this installer.
|
31
50
|
#
|
32
51
|
# @return [void]
|
33
52
|
#
|
34
|
-
def
|
53
|
+
def create_support_files_group
|
35
54
|
parent = project.support_files_group
|
36
55
|
name = target.name
|
37
56
|
dir = target.support_files_dir
|
@@ -92,9 +111,12 @@ module Pod
|
|
92
111
|
#
|
93
112
|
def create_copy_resources_script
|
94
113
|
path = target.copy_resources_script_path
|
95
|
-
|
96
|
-
|
97
|
-
|
114
|
+
library_targets = target.pod_targets.reject do |pod_target|
|
115
|
+
pod_target.should_build? && pod_target.requires_frameworks?
|
116
|
+
end
|
117
|
+
file_accessors = library_targets.flat_map(&:file_accessors)
|
118
|
+
resource_paths = file_accessors.flat_map { |accessor| accessor.resources.flat_map { |res| res.relative_path_from(project.path.dirname) } }
|
119
|
+
resource_bundles = file_accessors.flat_map { |accessor| accessor.resource_bundles.keys.map { |name| "${BUILT_PRODUCTS_DIR}/#{name}.bundle" } }
|
98
120
|
resources = []
|
99
121
|
resources.concat(resource_paths)
|
100
122
|
resources.concat(resource_bundles)
|
@@ -104,6 +126,28 @@ module Pod
|
|
104
126
|
add_file_to_support_group(path)
|
105
127
|
end
|
106
128
|
|
129
|
+
# Creates a script that embeds the frameworks to the bundle of the client
|
130
|
+
# target.
|
131
|
+
#
|
132
|
+
# @note We can't use Xcode default copy bundle resource phase, because
|
133
|
+
# we need to ensure that we only copy the resources, which are
|
134
|
+
# relevant for the current build configuration.
|
135
|
+
#
|
136
|
+
# @return [void]
|
137
|
+
#
|
138
|
+
def create_embed_frameworks_script
|
139
|
+
path = target.embed_frameworks_script_path
|
140
|
+
frameworks_by_config = {}
|
141
|
+
target.user_build_configurations.keys.each do |config|
|
142
|
+
frameworks_by_config[config] = target.pod_targets.select do |pod_target|
|
143
|
+
pod_target.include_in_build_config?(config) && pod_target.should_build?
|
144
|
+
end.map(&:product_name)
|
145
|
+
end
|
146
|
+
generator = Generator::EmbedFrameworksScript.new(target_definition, frameworks_by_config)
|
147
|
+
generator.save_as(path)
|
148
|
+
add_file_to_support_group(path)
|
149
|
+
end
|
150
|
+
|
107
151
|
# Generates the acknowledgement files (markdown and plist) for the target.
|
108
152
|
#
|
109
153
|
# @return [void]
|
@@ -9,12 +9,24 @@ module Pod
|
|
9
9
|
# @return [void]
|
10
10
|
#
|
11
11
|
def install!
|
12
|
+
unless target.should_build?
|
13
|
+
add_resources_bundle_targets
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
12
17
|
UI.message "- Installing target `#{target.name}` #{target.platform}" do
|
13
18
|
add_target
|
14
19
|
create_support_files_dir
|
15
|
-
add_files_to_build_phases
|
16
20
|
add_resources_bundle_targets
|
21
|
+
add_files_to_build_phases
|
17
22
|
create_xcconfig_file
|
23
|
+
if target.requires_frameworks?
|
24
|
+
create_info_plist_file
|
25
|
+
create_module_map
|
26
|
+
create_umbrella_header do |generator|
|
27
|
+
generator.imports += target.file_accessors.flat_map(&:public_headers).map(&:basename)
|
28
|
+
end
|
29
|
+
end
|
18
30
|
create_prefix_header
|
19
31
|
create_dummy_source
|
20
32
|
end
|
@@ -36,20 +48,41 @@ module Pod
|
|
36
48
|
target.file_accessors.each do |file_accessor|
|
37
49
|
consumer = file_accessor.spec_consumer
|
38
50
|
|
51
|
+
headers = file_accessor.headers
|
52
|
+
public_headers = file_accessor.public_headers
|
39
53
|
other_source_files = file_accessor.source_files.select { |sf| sf.extname == '.d' }
|
40
54
|
|
41
55
|
{
|
42
56
|
true => file_accessor.arc_source_files,
|
43
57
|
false => file_accessor.non_arc_source_files,
|
44
58
|
}.each do |arc, files|
|
45
|
-
files = files - other_source_files
|
59
|
+
files = files - headers - other_source_files
|
46
60
|
flags = compiler_flags_for_consumer(consumer, arc)
|
47
61
|
regular_file_refs = files.map { |sf| project.reference_for_path(sf) }
|
48
62
|
native_target.add_file_references(regular_file_refs, flags)
|
49
63
|
end
|
50
64
|
|
65
|
+
header_file_refs = headers.map { |sf| project.reference_for_path(sf) }
|
66
|
+
native_target.add_file_references(header_file_refs) do |build_file|
|
67
|
+
# Set added headers as public if needed
|
68
|
+
if target.requires_frameworks?
|
69
|
+
if public_headers.include?(build_file.file_ref.real_path)
|
70
|
+
build_file.settings ||= {}
|
71
|
+
build_file.settings['ATTRIBUTES'] = ['Public']
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
51
76
|
other_file_refs = other_source_files.map { |sf| project.reference_for_path(sf) }
|
52
77
|
native_target.add_file_references(other_file_refs, nil)
|
78
|
+
|
79
|
+
next unless target.requires_frameworks?
|
80
|
+
|
81
|
+
resource_refs = file_accessor.resources.flatten.map do |res|
|
82
|
+
project.reference_for_path(res)
|
83
|
+
end
|
84
|
+
|
85
|
+
native_target.add_resources(resource_refs)
|
53
86
|
end
|
54
87
|
end
|
55
88
|
|
@@ -63,20 +96,35 @@ module Pod
|
|
63
96
|
def add_resources_bundle_targets
|
64
97
|
target.file_accessors.each do |file_accessor|
|
65
98
|
file_accessor.resource_bundles.each do |bundle_name, paths|
|
66
|
-
# Add a dependency on an existing Resource Bundle target if possible
|
67
|
-
if bundle_target = project.targets.find { |target| target.name == bundle_name }
|
68
|
-
native_target.add_dependency(bundle_target)
|
69
|
-
next
|
70
|
-
end
|
71
99
|
file_references = paths.map { |sf| project.reference_for_path(sf) }
|
72
|
-
|
100
|
+
label = target.resources_bundle_target_label(bundle_name)
|
101
|
+
bundle_target = project.new_resources_bundle(label, file_accessor.spec_consumer.platform_name)
|
102
|
+
bundle_target.product_reference.tap do |bundle_product|
|
103
|
+
bundle_file_name = "#{bundle_name}.bundle"
|
104
|
+
bundle_product.name = bundle_file_name
|
105
|
+
bundle_product.path = bundle_file_name
|
106
|
+
end
|
73
107
|
bundle_target.add_resources(file_references)
|
74
108
|
|
75
109
|
target.user_build_configurations.each do |bc_name, type|
|
76
110
|
bundle_target.add_build_configuration(bc_name, type)
|
77
111
|
end
|
78
112
|
|
79
|
-
|
113
|
+
target.resource_bundle_targets << bundle_target
|
114
|
+
|
115
|
+
if target.should_build?
|
116
|
+
native_target.add_dependency(bundle_target)
|
117
|
+
if target.requires_frameworks?
|
118
|
+
native_target.add_resources([bundle_target.product_reference])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
bundle_target.build_configurations.each do |c|
|
123
|
+
c.build_settings['PRODUCT_NAME'] = bundle_name
|
124
|
+
if target.requires_frameworks?
|
125
|
+
c.build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir
|
126
|
+
end
|
127
|
+
end
|
80
128
|
end
|
81
129
|
end
|
82
130
|
end
|
@@ -132,7 +132,8 @@ module Pod
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
|
135
|
+
IGNORED_KEYS = %w(CODE_SIGN_IDENTITY).freeze
|
136
|
+
INHERITED_FLAGS = %w($(inherited) ${inherited}).freeze
|
136
137
|
|
137
138
|
# Checks whether the settings of the CocoaPods generated xcconfig are
|
138
139
|
# overridden by the build configuration of a target and prints a
|
@@ -144,7 +145,7 @@ module Pod
|
|
144
145
|
user_target.build_configurations.each do |config|
|
145
146
|
xcconfig = aggregate_target.xcconfigs[config.name]
|
146
147
|
if xcconfig
|
147
|
-
xcconfig.to_hash.keys.each do |key|
|
148
|
+
(xcconfig.to_hash.keys - IGNORED_KEYS).each do |key|
|
148
149
|
target_values = config.build_settings[key]
|
149
150
|
if target_values &&
|
150
151
|
!INHERITED_FLAGS.any? { |flag| target_values.include?(flag) }
|
@@ -31,8 +31,10 @@ module Pod
|
|
31
31
|
project_is_dirty = [
|
32
32
|
XCConfigIntegrator.integrate(target, native_targets),
|
33
33
|
update_to_cocoapods_0_34,
|
34
|
+
remove_embed_frameworks_script_phases,
|
34
35
|
unless native_targets_to_integrate.empty?
|
35
36
|
add_pods_library
|
37
|
+
add_embed_frameworks_script_phase if target.requires_frameworks?
|
36
38
|
add_copy_resources_script_phase
|
37
39
|
add_check_manifest_lock_script_phase
|
38
40
|
true
|
@@ -91,9 +93,9 @@ module Pod
|
|
91
93
|
changes
|
92
94
|
end
|
93
95
|
|
94
|
-
# Adds spec
|
96
|
+
# Adds spec product reference to the frameworks build phase of the
|
95
97
|
# {TargetDefinition} integration libraries. Adds a file reference to
|
96
|
-
# the
|
98
|
+
# the frameworks group of the project and adds it to the frameworks
|
97
99
|
# build phase of the targets.
|
98
100
|
#
|
99
101
|
# @return [void]
|
@@ -101,12 +103,71 @@ module Pod
|
|
101
103
|
def add_pods_library
|
102
104
|
frameworks = user_project.frameworks_group
|
103
105
|
native_targets_to_integrate.each do |native_target|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
106
|
+
build_phase = native_target.frameworks_build_phase
|
107
|
+
|
108
|
+
# Find and delete possible reference for the other product type
|
109
|
+
old_product_name = target.requires_frameworks? ? target.static_library_name : target.framework_name
|
110
|
+
old_product_ref = frameworks.files.find { |f| f.path == old_product_name }
|
111
|
+
if old_product_ref.present?
|
112
|
+
UI.message("Removing old Pod product reference #{old_product_name} from project.")
|
113
|
+
build_phase.remove_file_reference(old_product_ref)
|
114
|
+
frameworks.remove_reference(old_product_ref)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Find or create and add a reference for the current product type
|
118
|
+
target_basename = target.product_basename
|
119
|
+
new_product_ref = frameworks.files.find { |f| f.path == target.product_name } ||
|
120
|
+
frameworks.new_product_ref_for_target(target_basename, target.product_type)
|
121
|
+
build_file = build_phase.build_file(new_product_ref) ||
|
122
|
+
build_phase.add_file_reference(new_product_ref)
|
123
|
+
if target.requires_frameworks?
|
124
|
+
# Weak link the aggregate target's product, because as it contains
|
125
|
+
# no symbols, it isn't copied into the app bundle. dyld will so
|
126
|
+
# never try to find the missing executable at runtime.
|
127
|
+
build_file.settings ||= {}
|
128
|
+
build_file.settings['ATTRIBUTES'] = ['Weak']
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Find or create a 'Embed Pods Frameworks' Copy Files Build Phase
|
134
|
+
#
|
135
|
+
# @return [void]
|
136
|
+
#
|
137
|
+
def add_embed_frameworks_script_phase
|
138
|
+
phase_name = 'Embed Pods Frameworks'
|
139
|
+
native_targets_to_integrate.each do |native_target|
|
140
|
+
embed_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name == phase_name }
|
141
|
+
unless embed_build_phase.present?
|
142
|
+
UI.message("Adding Build Phase '#{phase_name}' to project.")
|
143
|
+
embed_build_phase = native_target.new_shell_script_build_phase(phase_name)
|
108
144
|
end
|
145
|
+
script_path = target.embed_frameworks_script_relative_path
|
146
|
+
embed_build_phase.shell_script = %("#{script_path}"\n)
|
147
|
+
embed_build_phase.show_env_vars_in_log = '0'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Delete 'Embed Pods Frameworks' Build Phases, if they exist
|
152
|
+
# and are not needed anymore due to not integrating the
|
153
|
+
# dependencies by frameworks.
|
154
|
+
#
|
155
|
+
# @return [Bool] whether any changes to the project were made.
|
156
|
+
#
|
157
|
+
def remove_embed_frameworks_script_phases
|
158
|
+
return false if target.requires_frameworks?
|
159
|
+
|
160
|
+
phase_name = 'Embed Pods Frameworks'
|
161
|
+
result = false
|
162
|
+
|
163
|
+
native_targets.each do |native_target|
|
164
|
+
embed_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name == phase_name }
|
165
|
+
next unless embed_build_phase.present?
|
166
|
+
native_target.build_phases.delete(embed_build_phase)
|
167
|
+
result = true
|
109
168
|
end
|
169
|
+
|
170
|
+
result
|
110
171
|
end
|
111
172
|
|
112
173
|
# Adds a shell script build phase responsible to copy the resources
|
data/lib/cocoapods/project.rb
CHANGED
@@ -59,6 +59,7 @@ module Pod
|
|
59
59
|
|
60
60
|
parent_group = development ? development_pods : pods
|
61
61
|
source_tree = absolute ? :absolute : :group
|
62
|
+
|
62
63
|
group = parent_group.new_group(pod_name, path, source_tree)
|
63
64
|
group
|
64
65
|
end
|
@@ -144,13 +145,28 @@ module Pod
|
|
144
145
|
# @param [PBXGroup] group
|
145
146
|
# The group for the new file reference.
|
146
147
|
#
|
148
|
+
# @param [Bool] reflect_file_system_structure
|
149
|
+
# Wether group structure should reflect the file system structure.
|
150
|
+
# If yes, where needed, intermediate groups are created, similar to
|
151
|
+
# how mkdir -p operates.
|
152
|
+
#
|
147
153
|
# @return [PBXFileReference] The new file reference.
|
148
154
|
#
|
149
|
-
def add_file_reference(absolute_path, group)
|
150
|
-
|
155
|
+
def add_file_reference(absolute_path, group, reflect_file_system_structure = false)
|
156
|
+
file_path_name = Pathname.new(absolute_path)
|
157
|
+
unless file_path_name.absolute?
|
151
158
|
raise ArgumentError, "Paths must be absolute #{absolute_path}"
|
152
159
|
end
|
153
160
|
|
161
|
+
if reflect_file_system_structure
|
162
|
+
relative_path = file_path_name.relative_path_from(group.real_path)
|
163
|
+
relative_dir = relative_path.dirname
|
164
|
+
relative_dir.each_filename do|name|
|
165
|
+
next if name == '.'
|
166
|
+
group = group[name] || group.new_group(name, name)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
154
170
|
if ref = reference_for_path(absolute_path)
|
155
171
|
ref
|
156
172
|
else
|
data/lib/cocoapods/resolver.rb
CHANGED
@@ -50,7 +50,7 @@ module Pod
|
|
50
50
|
# definition.
|
51
51
|
#
|
52
52
|
def resolve
|
53
|
-
dependencies =
|
53
|
+
dependencies = podfile.target_definition_list.map(&:dependencies).flatten
|
54
54
|
@cached_sets = {}
|
55
55
|
@activated = Molinillo::Resolver.new(self, self).resolve(dependencies, locked_dependencies)
|
56
56
|
specs_by_target
|
@@ -78,7 +78,6 @@ module Pod
|
|
78
78
|
uniq.
|
79
79
|
sort_by(&:name).
|
80
80
|
each do |spec|
|
81
|
-
validate_platform(spec, target)
|
82
81
|
sandbox.store_head_pod(spec.name) if spec.version.head?
|
83
82
|
end
|
84
83
|
end
|
@@ -408,6 +407,7 @@ module Pod
|
|
408
407
|
# dependencies for `target`.
|
409
408
|
#
|
410
409
|
def valid_dependencies_for_target_from_node(target, node)
|
410
|
+
validate_platform(node.payload, target)
|
411
411
|
dependency_nodes = node.outgoing_edges.select do |edge|
|
412
412
|
edge_is_valid_for_target?(edge, target)
|
413
413
|
end.map(&:destination)
|
@@ -12,7 +12,7 @@ module Pod
|
|
12
12
|
GLOB_PATTERNS = {
|
13
13
|
:readme => 'readme{*,.*}'.freeze,
|
14
14
|
:license => 'licen{c,s}e{*,.*}'.freeze,
|
15
|
-
:source_files => '*.{h,hpp,hh,m,mm,c,cpp}'.freeze,
|
15
|
+
:source_files => '*.{h,hpp,hh,m,mm,c,cpp,swift}'.freeze,
|
16
16
|
:public_header_files => "*{#{HEADER_EXTENSIONS.join(',')}}".freeze,
|
17
17
|
}.freeze
|
18
18
|
|
@@ -113,8 +113,8 @@ module Pod
|
|
113
113
|
# @return [Array<Pathname>] the public headers of the specification.
|
114
114
|
#
|
115
115
|
def public_headers(include_frameworks = false)
|
116
|
-
public_headers =
|
117
|
-
private_headers =
|
116
|
+
public_headers = public_header_files
|
117
|
+
private_headers = private_header_files
|
118
118
|
if public_headers.nil? || public_headers.empty?
|
119
119
|
header_files = headers
|
120
120
|
else
|
@@ -210,6 +210,26 @@ module Pod
|
|
210
210
|
|
211
211
|
private
|
212
212
|
|
213
|
+
# @!group Private paths
|
214
|
+
|
215
|
+
# @return [Array<Pathname>] The paths of the user-specified public header
|
216
|
+
# files.
|
217
|
+
#
|
218
|
+
def public_header_files
|
219
|
+
paths_for_attribute(:public_header_files)
|
220
|
+
end
|
221
|
+
|
222
|
+
# @return [Array<Pathname>] The paths of the user-specified public header
|
223
|
+
# files.
|
224
|
+
#
|
225
|
+
def private_header_files
|
226
|
+
paths_for_attribute(:private_header_files)
|
227
|
+
end
|
228
|
+
|
229
|
+
#-----------------------------------------------------------------------#
|
230
|
+
|
231
|
+
private
|
232
|
+
|
213
233
|
# @!group Private helpers
|
214
234
|
|
215
235
|
# Returns the list of the paths founds in the file system for the
|
@@ -26,6 +26,10 @@ module Pod
|
|
26
26
|
@search_paths = []
|
27
27
|
end
|
28
28
|
|
29
|
+
# @param [Platform] platform
|
30
|
+
# the platform for which the header search paths should be
|
31
|
+
# returned
|
32
|
+
#
|
29
33
|
# @return [Array<String>] All the search paths of the header directory in
|
30
34
|
# xcconfig format. The paths are specified relative to the pods
|
31
35
|
# root with the `${PODS_ROOT}` variable.
|
@@ -9,6 +9,7 @@ module Pod
|
|
9
9
|
# known Pods.
|
10
10
|
#
|
11
11
|
def aggregate
|
12
|
+
return Source::Aggregate.new([]) unless config.repos_dir.exist?
|
12
13
|
dirs = config.repos_dir.children.select(&:directory?)
|
13
14
|
Source::Aggregate.new(dirs)
|
14
15
|
end
|
@@ -60,6 +61,7 @@ module Pod
|
|
60
61
|
# installation of CocoaPods.
|
61
62
|
#
|
62
63
|
def all
|
64
|
+
return [] unless config.repos_dir.exist?
|
63
65
|
dirs = config.repos_dir.children.select(&:directory?)
|
64
66
|
dirs.map { |repo| Source.new(repo) }
|
65
67
|
end
|
@@ -393,7 +395,9 @@ module Pod
|
|
393
395
|
#
|
394
396
|
def source_with_url(url)
|
395
397
|
url = url.downcase.gsub(/.git$/, '')
|
396
|
-
aggregate.sources.find
|
398
|
+
aggregate.sources.find do |source|
|
399
|
+
source.url && source.url.downcase.gsub(/.git$/, '') == url
|
400
|
+
end
|
397
401
|
end
|
398
402
|
|
399
403
|
# Returns a suitable repository name for `url`.
|