cocoapods 0.36.0.beta.1 → 0.36.0.beta.2
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 +67 -5
- data/bin/pod +11 -10
- data/bin/sandbox-pod +1 -1
- data/lib/cocoapods.rb +1 -1
- data/lib/cocoapods/command/lib.rb +0 -1
- data/lib/cocoapods/command/outdated.rb +1 -3
- data/lib/cocoapods/command/repo.rb +5 -267
- data/lib/cocoapods/command/repo/add.rb +53 -0
- data/lib/cocoapods/command/repo/lint.rb +73 -0
- data/lib/cocoapods/command/repo/list.rb +95 -0
- data/lib/cocoapods/command/repo/remove.rb +36 -0
- data/lib/cocoapods/command/repo/update.rb +27 -0
- data/lib/cocoapods/command/setup.rb +1 -1
- data/lib/cocoapods/command/spec.rb +5 -546
- data/lib/cocoapods/command/spec/cat.rb +51 -0
- data/lib/cocoapods/command/spec/create.rb +279 -0
- data/lib/cocoapods/command/spec/edit.rb +87 -0
- data/lib/cocoapods/command/spec/lint.rb +105 -0
- data/lib/cocoapods/command/spec/which.rb +43 -0
- data/lib/cocoapods/downloader.rb +0 -2
- data/lib/cocoapods/external_sources/podspec_source.rb +13 -3
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/copy_resources_script.rb +22 -11
- data/lib/cocoapods/generator/embed_frameworks_script.rb +3 -0
- data/lib/cocoapods/generator/header.rb +3 -3
- data/lib/cocoapods/generator/target_environment_header.rb +1 -1
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +7 -7
- data/lib/cocoapods/generator/xcconfig/public_pod_xcconfig.rb +1 -1
- data/lib/cocoapods/hooks_manager.rb +4 -4
- data/lib/cocoapods/installer.rb +17 -4
- data/lib/cocoapods/installer/analyzer.rb +19 -12
- data/lib/cocoapods/installer/pod_source_installer.rb +1 -1
- data/lib/cocoapods/installer/target_installer.rb +1 -1
- data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +9 -8
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +2 -2
- data/lib/cocoapods/sandbox.rb +0 -2
- data/lib/cocoapods/sandbox/headers_store.rb +1 -1
- data/lib/cocoapods/sources_manager.rb +8 -7
- data/lib/cocoapods/target.rb +1 -1
- data/lib/cocoapods/target/aggregate_target.rb +1 -0
- data/lib/cocoapods/target/pod_target.rb +1 -1
- data/lib/cocoapods/user_interface/error_report.rb +10 -0
- data/lib/cocoapods/validator.rb +15 -4
- metadata +17 -6
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class Spec < Command
|
4
|
+
class Which < Spec
|
5
|
+
self.summary = 'Prints the path of the given spec.'
|
6
|
+
|
7
|
+
self.description = <<-DESC
|
8
|
+
Prints the path of the .podspec file(s) whose name matches `QUERY`
|
9
|
+
DESC
|
10
|
+
|
11
|
+
self.arguments = [
|
12
|
+
CLAide::Argument.new('QUERY', false),
|
13
|
+
]
|
14
|
+
|
15
|
+
def self.options
|
16
|
+
[
|
17
|
+
['--regex', 'Interpret the `QUERY` as a regular expression'],
|
18
|
+
['--show-all', 'Print all versions of the given podspec'],
|
19
|
+
].concat(super)
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(argv)
|
23
|
+
@use_regex = argv.flag?('regex')
|
24
|
+
@show_all = argv.flag?('show-all')
|
25
|
+
@query = argv.shift_argument
|
26
|
+
@query = @query.gsub('.podspec', '') unless @query.nil?
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate!
|
31
|
+
super
|
32
|
+
help! 'A podspec name is required.' unless @query
|
33
|
+
validate_regex!(@query) if @use_regex
|
34
|
+
end
|
35
|
+
|
36
|
+
def run
|
37
|
+
query = @use_regex ? @query : Regexp.escape(@query)
|
38
|
+
UI.puts get_path_of_spec(query, @show_all)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/cocoapods/downloader.rb
CHANGED
@@ -7,7 +7,6 @@ module Pod
|
|
7
7
|
|
8
8
|
class Base
|
9
9
|
override_api do
|
10
|
-
|
11
10
|
def execute_command(executable, command, raise_on_failure = false)
|
12
11
|
Executable.execute_command(executable, command, raise_on_failure)
|
13
12
|
rescue CLAide::InformativeError => e
|
@@ -56,7 +55,6 @@ module Pod
|
|
56
55
|
def ui_message(message)
|
57
56
|
UI.puts message
|
58
57
|
end
|
59
|
-
|
60
58
|
end
|
61
59
|
end
|
62
60
|
end
|
@@ -9,9 +9,19 @@ module Pod
|
|
9
9
|
def fetch(sandbox)
|
10
10
|
title = "Fetching podspec for `#{name}` #{description}"
|
11
11
|
UI.titled_section(title, :verbose_prefix => '-> ') do
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
podspec_path = Pathname(podspec_uri)
|
13
|
+
is_json = podspec_path.extname == '.json'
|
14
|
+
if podspec_path.exist?
|
15
|
+
store_podspec(sandbox, podspec_path, is_json)
|
16
|
+
else
|
17
|
+
require 'open-uri'
|
18
|
+
begin
|
19
|
+
open(podspec_uri) { |io| store_podspec(sandbox, io.read, is_json) }
|
20
|
+
rescue OpenURI::HTTPError => e
|
21
|
+
status = e.io.status.join(' ')
|
22
|
+
raise Informative, "Failed to fetch podspec for `#{name}` at `#{podspec_uri}`.\n Error: #{status}"
|
23
|
+
end
|
24
|
+
end
|
15
25
|
end
|
16
26
|
end
|
17
27
|
|
@@ -1,21 +1,22 @@
|
|
1
1
|
module Pod
|
2
2
|
module Generator
|
3
3
|
class CopyResourcesScript
|
4
|
-
# @return [Array
|
5
|
-
# root.
|
4
|
+
# @return [Hash{String, Array{String}] A list of files relative to the
|
5
|
+
# project pods root, keyed by build configuration.
|
6
6
|
#
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :resources_by_config
|
8
8
|
|
9
9
|
# @return [Platform] The platform of the library for which the copy
|
10
10
|
# resources script is needed.
|
11
11
|
#
|
12
12
|
attr_reader :platform
|
13
13
|
|
14
|
-
# @param [Array
|
14
|
+
# @param [Hash{String, Array{String}]
|
15
|
+
# resources_by_config @see resources_by_config
|
15
16
|
# @param [Platform] platform @see platform
|
16
17
|
#
|
17
|
-
def initialize(
|
18
|
-
@
|
18
|
+
def initialize(resources_by_config, platform)
|
19
|
+
@resources_by_config = resources_by_config
|
19
20
|
@platform = platform
|
20
21
|
end
|
21
22
|
|
@@ -58,25 +59,35 @@ module Pod
|
|
58
59
|
#
|
59
60
|
def install_resources_function
|
60
61
|
if use_external_strings_file?
|
61
|
-
|
62
|
+
INSTALL_RESOURCES_FUNCTION
|
62
63
|
else
|
63
|
-
|
64
|
+
INSTALL_RESOURCES_FUNCTION.gsub(' --reference-external-strings-file', '')
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
67
68
|
# @return [String] The contents of the copy resources script.
|
68
69
|
#
|
69
70
|
def script
|
71
|
+
# Define install function
|
70
72
|
script = install_resources_function
|
71
|
-
|
72
|
-
|
73
|
+
|
74
|
+
# Call function for each configuration-dependent resource
|
75
|
+
resources_by_config.each do |config, resources|
|
76
|
+
unless resources.empty?
|
77
|
+
script += %(if [[ "$CONFIGURATION" == "#{config}" ]]; then\n)
|
78
|
+
resources.each do |resource|
|
79
|
+
script += " install_resource '#{resource}'\n"
|
80
|
+
end
|
81
|
+
script += "fi\n"
|
82
|
+
end
|
73
83
|
end
|
84
|
+
|
74
85
|
script += RSYNC_CALL
|
75
86
|
script += XCASSETS_COMPILE
|
76
87
|
script
|
77
88
|
end
|
78
89
|
|
79
|
-
|
90
|
+
INSTALL_RESOURCES_FUNCTION = <<EOS
|
80
91
|
#!/bin/sh
|
81
92
|
set -e
|
82
93
|
|
@@ -78,6 +78,9 @@ module Pod
|
|
78
78
|
for lib in $swift_runtime_libs; do
|
79
79
|
echo "rsync -av \\"${SWIFT_STDLIB_PATH}/${lib}\\" \\"${destination}\\""
|
80
80
|
rsync -av "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
|
81
|
+
if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then
|
82
|
+
code_sign "${destination}/${lib}"
|
83
|
+
fi
|
81
84
|
done
|
82
85
|
}
|
83
86
|
|
@@ -37,18 +37,18 @@ module Pod
|
|
37
37
|
# @return [String]
|
38
38
|
#
|
39
39
|
def generate
|
40
|
-
result =
|
40
|
+
result = ''
|
41
41
|
result << generate_platform_import_header
|
42
42
|
|
43
43
|
result << "\n"
|
44
44
|
|
45
45
|
imports.each do |import|
|
46
|
-
result <<
|
46
|
+
result << %(#import "#{import}"\n)
|
47
47
|
end
|
48
48
|
|
49
49
|
unless module_imports.empty?
|
50
50
|
module_imports.each do |import|
|
51
|
-
result <<
|
51
|
+
result << %(\n@import #{import})
|
52
52
|
end
|
53
53
|
result << "\n"
|
54
54
|
end
|
@@ -74,7 +74,7 @@ module Pod
|
|
74
74
|
def common_specs(specs_by_configuration)
|
75
75
|
result = specs_by_configuration.values.flatten.uniq
|
76
76
|
specs_by_configuration.values.each do |configuration_specs|
|
77
|
-
result
|
77
|
+
result &= configuration_specs
|
78
78
|
end
|
79
79
|
result.sort_by(&:name)
|
80
80
|
end
|
@@ -49,7 +49,7 @@ module Pod
|
|
49
49
|
def generate
|
50
50
|
pod_targets = target.pod_targets_for_build_configuration(@configuration_name)
|
51
51
|
config = {
|
52
|
-
'OTHER_LDFLAGS' => XCConfigHelper.default_ld_flags(target),
|
52
|
+
'OTHER_LDFLAGS' => '$(inherited) ' + XCConfigHelper.default_ld_flags(target),
|
53
53
|
'OTHER_LIBTOOLFLAGS' => '$(OTHER_LDFLAGS)',
|
54
54
|
'PODS_ROOT' => target.relative_pods_root,
|
55
55
|
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1',
|
@@ -62,7 +62,7 @@ module Pod
|
|
62
62
|
'PODS_FRAMEWORK_BUILD_PATH' => target.configuration_build_dir,
|
63
63
|
'FRAMEWORK_SEARCH_PATHS' => '"$PODS_FRAMEWORK_BUILD_PATH"',
|
64
64
|
# Make headers discoverable by `import "…"`
|
65
|
-
'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths, '-iquote')
|
65
|
+
'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths, '-iquote'),
|
66
66
|
}
|
67
67
|
config.merge!(build_settings)
|
68
68
|
else
|
@@ -70,9 +70,9 @@ module Pod
|
|
70
70
|
header_search_paths = target.sandbox.public_headers.search_paths(target.platform)
|
71
71
|
build_settings = {
|
72
72
|
# by `#import "…"`
|
73
|
-
'HEADER_SEARCH_PATHS' => XCConfigHelper.quote(header_search_paths),
|
73
|
+
'HEADER_SEARCH_PATHS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths),
|
74
74
|
# by `#import <…>`
|
75
|
-
'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths, '-isystem')
|
75
|
+
'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths, '-isystem'),
|
76
76
|
}
|
77
77
|
config.merge!(build_settings)
|
78
78
|
end
|
@@ -101,7 +101,7 @@ module Pod
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
# TODO Need to decide how we are going to ensure settings like these
|
104
|
+
# TODO: Need to decide how we are going to ensure settings like these
|
105
105
|
# are always excluded from the user's project.
|
106
106
|
#
|
107
107
|
# See https://github.com/CocoaPods/CocoaPods/issues/1216
|
@@ -125,7 +125,7 @@ module Pod
|
|
125
125
|
else
|
126
126
|
ld_runpath_search_paths << [
|
127
127
|
"'@executable_path/Frameworks'",
|
128
|
-
"'@loader_path/Frameworks'"
|
128
|
+
"'@loader_path/Frameworks'",
|
129
129
|
]
|
130
130
|
end
|
131
131
|
@xcconfig.merge!('LD_RUNPATH_SEARCH_PATHS' => ld_runpath_search_paths.join(' '))
|
@@ -133,6 +133,6 @@ module Pod
|
|
133
133
|
|
134
134
|
#---------------------------------------------------------------------#
|
135
135
|
end
|
136
|
+
end
|
136
137
|
end
|
137
138
|
end
|
138
|
-
end
|
@@ -20,12 +20,12 @@ module Pod
|
|
20
20
|
#
|
21
21
|
class Hook
|
22
22
|
# @return [String]
|
23
|
-
# The name of the hook
|
23
|
+
# The name of the plugin that registered the hook.
|
24
24
|
#
|
25
25
|
attr_reader :plugin_name
|
26
26
|
|
27
27
|
# @return [String]
|
28
|
-
# The name of the
|
28
|
+
# The name of the hook.
|
29
29
|
#
|
30
30
|
attr_reader :name
|
31
31
|
|
@@ -54,8 +54,8 @@ module Pod
|
|
54
54
|
end
|
55
55
|
|
56
56
|
class << self
|
57
|
-
# @return [Hash{Symbol => Array<
|
58
|
-
# registered for each
|
57
|
+
# @return [Hash{Symbol => Array<Hook>}] The list of the hooks that are
|
58
|
+
# registered for each hook name.
|
59
59
|
#
|
60
60
|
attr_reader :registrations
|
61
61
|
|
data/lib/cocoapods/installer.rb
CHANGED
@@ -446,8 +446,7 @@ module Pod
|
|
446
446
|
target_installer.install!
|
447
447
|
end
|
448
448
|
|
449
|
-
# TODO
|
450
|
-
# Move and add specs
|
449
|
+
# TODO: Move and add specs
|
451
450
|
pod_targets.sort_by(&:name).each do |pod_target|
|
452
451
|
pod_target.file_accessors.each do |file_accessor|
|
453
452
|
file_accessor.spec_consumer.frameworks.each do |framework|
|
@@ -468,6 +467,9 @@ module Pod
|
|
468
467
|
def set_target_dependencies
|
469
468
|
frameworks_group = pods_project.frameworks_group
|
470
469
|
aggregate_targets.each do |aggregate_target|
|
470
|
+
is_app_extension = aggregate_target.user_targets.map(&:symbol_type).include?(:app_extension)
|
471
|
+
configure_app_extension_api_only_for_target(aggregate_target) if is_app_extension
|
472
|
+
|
471
473
|
aggregate_target.pod_targets.each do |pod_target|
|
472
474
|
unless pod_target.should_build?
|
473
475
|
pod_target.resource_bundle_targets.each do |resource_bundle_target|
|
@@ -478,17 +480,19 @@ module Pod
|
|
478
480
|
end
|
479
481
|
|
480
482
|
aggregate_target.native_target.add_dependency(pod_target.native_target)
|
481
|
-
pod_target
|
483
|
+
configure_app_extension_api_only_for_target(pod_target) if is_app_extension
|
482
484
|
|
485
|
+
pod_target.dependencies.each do |dep|
|
483
486
|
unless dep == pod_target.pod_name
|
484
487
|
pod_dependency_target = aggregate_target.pod_targets.find { |target| target.pod_name == dep }
|
485
|
-
# TODO remove me
|
488
|
+
# TODO: remove me
|
486
489
|
unless pod_dependency_target
|
487
490
|
puts "[BUG] DEP: #{dep}"
|
488
491
|
end
|
489
492
|
|
490
493
|
next unless pod_dependency_target.should_build?
|
491
494
|
pod_target.native_target.add_dependency(pod_dependency_target.native_target)
|
495
|
+
configure_app_extension_api_only_for_target(pod_dependency_target) if is_app_extension
|
492
496
|
|
493
497
|
if pod_target.requires_frameworks?
|
494
498
|
product_ref = frameworks_group.files.find { |f| f.path == pod_dependency_target.product_name } ||
|
@@ -696,6 +700,15 @@ module Pod
|
|
696
700
|
analysis_result.sandbox_state
|
697
701
|
end
|
698
702
|
|
703
|
+
# Sets the APPLICATION_EXTENSION_API_ONLY build setting to YES for all
|
704
|
+
# configurations of the given target
|
705
|
+
#
|
706
|
+
def configure_app_extension_api_only_for_target(target)
|
707
|
+
target.native_target.build_configurations.each do |config|
|
708
|
+
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'YES'
|
709
|
+
end
|
710
|
+
end
|
711
|
+
|
699
712
|
#-------------------------------------------------------------------------#
|
700
713
|
end
|
701
714
|
end
|
@@ -101,7 +101,7 @@ module Pod
|
|
101
101
|
# change in the Podfile should be locked.
|
102
102
|
#
|
103
103
|
def update_mode?
|
104
|
-
|
104
|
+
update != nil
|
105
105
|
end
|
106
106
|
|
107
107
|
# @return [Symbol] Whether and how the dependencies in the Podfile
|
@@ -163,12 +163,18 @@ module Pod
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
# Updates the source repositories unless the config indicates to skip it.
|
166
|
+
# Updates the git source repositories unless the config indicates to skip it.
|
167
167
|
#
|
168
168
|
def update_repositories_if_needed
|
169
169
|
unless config.skip_repo_update?
|
170
170
|
UI.section 'Updating spec repositories' do
|
171
|
-
sources.each
|
171
|
+
sources.each do |source|
|
172
|
+
if SourcesManager.git_repo?(source.repo)
|
173
|
+
SourcesManager.update(source.name)
|
174
|
+
else
|
175
|
+
UI.message "Skipping `#{source.name}` update because the repository is not a git source repository."
|
176
|
+
end
|
177
|
+
end
|
172
178
|
end
|
173
179
|
end
|
174
180
|
end
|
@@ -306,7 +312,7 @@ module Pod
|
|
306
312
|
#
|
307
313
|
# @return [void]
|
308
314
|
#
|
309
|
-
# TODO Specs
|
315
|
+
# TODO: Specs
|
310
316
|
#
|
311
317
|
def fetch_external_sources
|
312
318
|
return unless allow_pre_downloads?
|
@@ -325,7 +331,7 @@ module Pod
|
|
325
331
|
deps_with_different_sources = podfile.dependencies.group_by(&:root_name).
|
326
332
|
select { |_root_name, dependencies| dependencies.map(&:external_source).uniq.count > 1 }
|
327
333
|
deps_with_different_sources.each do |root_name, dependencies|
|
328
|
-
raise Informative,
|
334
|
+
raise Informative, 'There are multiple dependencies with different ' \
|
329
335
|
"sources for `#{root_name}` in #{UI.path podfile.defined_in_file}:" \
|
330
336
|
"\n\n- #{dependencies.map(&:to_s).join("\n- ")}"
|
331
337
|
end
|
@@ -344,7 +350,6 @@ module Pod
|
|
344
350
|
def dependencies_to_fetch
|
345
351
|
@deps_to_fetch ||= begin
|
346
352
|
deps_to_fetch = []
|
347
|
-
deps_to_fetch_if_needed = []
|
348
353
|
deps_with_external_source = podfile.dependencies.select(&:external_source)
|
349
354
|
|
350
355
|
if update_mode == :all
|
@@ -466,7 +471,8 @@ module Pod
|
|
466
471
|
|
467
472
|
# Returns the sources used to query for specifications
|
468
473
|
#
|
469
|
-
# When no explicit Podfile sources are defined, this defaults to
|
474
|
+
# When no explicit Podfile sources are defined, this defaults to the
|
475
|
+
# master spec repository.
|
470
476
|
# available sources ({SourcesManager.all}).
|
471
477
|
#
|
472
478
|
# @return [Array<Source>] the sources to be used in finding
|
@@ -476,10 +482,11 @@ module Pod
|
|
476
482
|
@sources ||= begin
|
477
483
|
sources = podfile.sources
|
478
484
|
if sources.empty?
|
479
|
-
|
485
|
+
url = 'https://github.com/CocoaPods/Specs.git'
|
486
|
+
[SourcesManager.find_or_create_source_with_url(url)]
|
480
487
|
else
|
481
|
-
sources.map do |
|
482
|
-
SourcesManager.find_or_create_source_with_url(
|
488
|
+
sources.map do |source_url|
|
489
|
+
SourcesManager.find_or_create_source_with_url(source_url)
|
483
490
|
end
|
484
491
|
end
|
485
492
|
end
|
@@ -647,7 +654,7 @@ module Pod
|
|
647
654
|
end
|
648
655
|
|
649
656
|
archs = archs.compact.uniq.sort
|
650
|
-
UI.message(
|
657
|
+
UI.message('Using `ARCHS` setting to build architectures of ' \
|
651
658
|
"target `#{target_definition.label}`: " \
|
652
659
|
"(`#{archs.join('`, `')}`)")
|
653
660
|
archs.length > 1 ? archs : archs.first
|
@@ -668,7 +675,7 @@ module Pod
|
|
668
675
|
project_path = compute_user_project_path(target_definition)
|
669
676
|
user_project = Xcodeproj::Project.open(project_path)
|
670
677
|
targets = compute_user_project_targets(target_definition, user_project)
|
671
|
-
|
678
|
+
compute_platform_for_target_definition(target_definition, targets)
|
672
679
|
archs = compute_archs_for_target_definition(target_definition, targets)
|
673
680
|
@archs_by_target_def[target_definition] = archs
|
674
681
|
else
|