cocoapods 1.5.2 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +365 -1
- data/bin/pod +1 -1
- data/lib/cocoapods/command/cache/clean.rb +1 -1
- data/lib/cocoapods/command/init.rb +4 -2
- data/lib/cocoapods/command/install.rb +7 -0
- data/lib/cocoapods/command/lib/lint.rb +8 -1
- data/lib/cocoapods/command/outdated.rb +4 -9
- data/lib/cocoapods/command/repo/add.rb +1 -1
- data/lib/cocoapods/command/repo/list.rb +1 -1
- data/lib/cocoapods/command/repo/push.rb +17 -12
- data/lib/cocoapods/command/repo/remove.rb +1 -1
- data/lib/cocoapods/command/repo/update.rb +1 -1
- data/lib/cocoapods/command/setup.rb +1 -1
- data/lib/cocoapods/command/spec/create.rb +39 -39
- data/lib/cocoapods/command/spec/lint.rb +8 -1
- data/lib/cocoapods/command.rb +3 -1
- data/lib/cocoapods/config.rb +13 -2
- data/lib/cocoapods/downloader/cache.rb +1 -1
- data/lib/cocoapods/executable.rb +3 -3
- data/lib/cocoapods/external_sources/abstract_external_source.rb +23 -13
- data/lib/cocoapods/external_sources.rb +7 -4
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +6 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +13 -2
- data/lib/cocoapods/generator/app_target_helper.rb +141 -17
- data/lib/cocoapods/generator/copy_resources_script.rb +14 -3
- data/lib/cocoapods/generator/dummy_source.rb +14 -5
- data/lib/cocoapods/generator/embed_frameworks_script.rb +37 -20
- data/lib/cocoapods/generator/header.rb +1 -1
- data/lib/cocoapods/generator/info_plist_file.rb +12 -4
- data/lib/cocoapods/generator/prefix_header.rb +2 -2
- data/lib/cocoapods/hooks_manager.rb +28 -17
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +52 -22
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +14 -6
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +4 -5
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +3 -14
- data/lib/cocoapods/installer/analyzer/specs_state.rb +28 -4
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +27 -14
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +17 -11
- data/lib/cocoapods/installer/analyzer.rb +391 -284
- data/lib/cocoapods/installer/installation_options.rb +2 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +31 -43
- data/lib/cocoapods/installer/post_install_hooks_context.rb +72 -47
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +22 -13
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +3 -1
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +44 -11
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +69 -29
- data/lib/cocoapods/installer/user_project_integrator.rb +6 -4
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +25 -16
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +104 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +23 -50
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +296 -177
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +51 -33
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +93 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +62 -69
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +72 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +130 -122
- data/lib/cocoapods/installer/xcode/target_validator.rb +15 -9
- data/lib/cocoapods/installer.rb +140 -63
- data/lib/cocoapods/project.rb +16 -14
- data/lib/cocoapods/resolver/resolver_specification.rb +41 -0
- data/lib/cocoapods/resolver.rb +79 -98
- data/lib/cocoapods/sandbox/file_accessor.rb +11 -6
- data/lib/cocoapods/sandbox/headers_store.rb +9 -8
- data/lib/cocoapods/sandbox/path_list.rb +5 -8
- data/lib/cocoapods/sandbox.rb +31 -43
- data/lib/cocoapods/sources_manager.rb +1 -1
- data/lib/cocoapods/target/aggregate_target.rb +143 -85
- data/lib/cocoapods/target/build_settings.rb +1124 -0
- data/lib/cocoapods/target/framework_paths.rb +36 -0
- data/lib/cocoapods/target/pod_target.rb +198 -295
- data/lib/cocoapods/target.rb +92 -37
- data/lib/cocoapods/user_interface.rb +5 -0
- data/lib/cocoapods/validator.rb +149 -44
- data/lib/cocoapods.rb +0 -1
- metadata +31 -23
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +0 -260
- data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +0 -87
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +0 -558
- data/lib/cocoapods/generator/xcconfig.rb +0 -13
@@ -38,26 +38,46 @@ module Pod
|
|
38
38
|
# @param [Symbol] platform
|
39
39
|
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
40
40
|
#
|
41
|
-
# @param [Boolean] use_frameworks
|
42
|
-
# whether to use frameworks or not when generating the contents of the import file.
|
43
|
-
#
|
44
41
|
# @param [String] name
|
45
42
|
# The name to use for the target, defaults to 'App'.
|
46
43
|
#
|
47
44
|
# @return [Array<PBXBuildFile>] the created build file references.
|
48
45
|
#
|
49
|
-
def self.add_app_project_import(project, target, pod_target, platform,
|
50
|
-
source_file = AppTargetHelper.create_app_import_source_file(project, pod_target, platform,
|
51
|
-
|
46
|
+
def self.add_app_project_import(project, target, pod_target, platform, name = 'App')
|
47
|
+
source_file = AppTargetHelper.create_app_import_source_file(project, pod_target, platform, name)
|
48
|
+
group = project[name] || project.new_group(name, name)
|
49
|
+
source_file_ref = group.new_file(source_file)
|
52
50
|
target.add_file_references([source_file_ref])
|
53
51
|
end
|
54
52
|
|
55
|
-
# Creates and links
|
53
|
+
# Creates and links an empty Swift file for the given target.
|
56
54
|
#
|
57
55
|
# @param [Project] project
|
58
56
|
# the Xcodeproj to generate the target into.
|
59
57
|
#
|
60
58
|
# @param [PBXNativeTarget] target
|
59
|
+
# the native target to link the generated import file into.
|
60
|
+
#
|
61
|
+
# @param [String] name
|
62
|
+
# The name to use for the target, defaults to 'App'.
|
63
|
+
#
|
64
|
+
# @return [Array<PBXBuildFile>] the created build file references.
|
65
|
+
#
|
66
|
+
def self.add_empty_swift_file(project, target, name = 'App')
|
67
|
+
swift_file = project.path.dirname.+("#{name}/dummy.swift")
|
68
|
+
swift_file.parent.mkpath
|
69
|
+
File.write(swift_file, '')
|
70
|
+
group = project[name] || project.new_group(name, name)
|
71
|
+
swift_file_ref = group.new_file(swift_file)
|
72
|
+
target.add_file_references([swift_file_ref])
|
73
|
+
end
|
74
|
+
|
75
|
+
# Creates and links a default app host 'main.m' file.
|
76
|
+
#
|
77
|
+
# @param [Project] project
|
78
|
+
# the Xcodeproj to generate the main file into.
|
79
|
+
#
|
80
|
+
# @param [PBXNativeTarget] target
|
61
81
|
# the native target to link the generated main file into.
|
62
82
|
#
|
63
83
|
# @param [Symbol] platform
|
@@ -68,12 +88,37 @@ module Pod
|
|
68
88
|
#
|
69
89
|
# @return [Array<PBXBuildFile>] the created build file references.
|
70
90
|
#
|
71
|
-
def self.add_app_host_main_file(project, target, platform, name = 'App')
|
91
|
+
def self.add_app_host_main_file(project, target, platform, group, name = 'App')
|
72
92
|
source_file = AppTargetHelper.create_app_host_main_file(project, platform, name)
|
73
|
-
source_file_ref =
|
93
|
+
source_file_ref = group.new_file(source_file)
|
74
94
|
target.add_file_references([source_file_ref])
|
75
95
|
end
|
76
96
|
|
97
|
+
# Creates a default launchscreen storyboard.
|
98
|
+
#
|
99
|
+
# @param [Project] project
|
100
|
+
# the Xcodeproj to generate the launchscreen storyboard into.
|
101
|
+
#
|
102
|
+
# @param [PBXNativeTarget] target
|
103
|
+
# the native target to link the generated launchscreen storyboard into.
|
104
|
+
#
|
105
|
+
# @param [Symbol] platform
|
106
|
+
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
107
|
+
#
|
108
|
+
# @param [String] deployment_target
|
109
|
+
# the deployment target for the platform.
|
110
|
+
#
|
111
|
+
# @param [String] name
|
112
|
+
# The name to use for the target, defaults to 'App'.
|
113
|
+
#
|
114
|
+
# @return [PBXFileReference] the created file reference of the launchscreen storyboard.
|
115
|
+
#
|
116
|
+
def self.add_launchscreen_storyboard(project, target, group, deployment_target, name = 'App')
|
117
|
+
launch_storyboard_file = AppTargetHelper.create_launchscreen_storyboard_file(project, deployment_target, name)
|
118
|
+
launch_storyboard_ref = group.new_file(launch_storyboard_file)
|
119
|
+
target.resources_build_phase.add_file_reference(launch_storyboard_ref)
|
120
|
+
end
|
121
|
+
|
77
122
|
# Adds the xctest framework search paths into the given target.
|
78
123
|
#
|
79
124
|
# @param [PBXNativeTarget] target
|
@@ -116,26 +161,23 @@ module Pod
|
|
116
161
|
# @param [Symbol] platform
|
117
162
|
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
118
163
|
#
|
119
|
-
# @param [Boolean] use_frameworks
|
120
|
-
# whether to use frameworks or not when generating the contents of the import file.
|
121
|
-
#
|
122
164
|
# @param [String] name
|
123
165
|
# The name of the folder to use and save the generated main file.
|
124
166
|
#
|
125
167
|
# @return [Pathname] the new source file that was generated.
|
126
168
|
#
|
127
|
-
def self.create_app_import_source_file(project, pod_target, platform,
|
169
|
+
def self.create_app_import_source_file(project, pod_target, platform, name = 'App')
|
128
170
|
language = pod_target.uses_swift? ? :swift : :objc
|
129
171
|
|
130
172
|
if language == :swift
|
131
173
|
source_file = project.path.dirname.+("#{name}/main.swift")
|
132
174
|
source_file.parent.mkpath
|
133
|
-
import_statement =
|
175
|
+
import_statement = pod_target.should_build? && pod_target.defines_module? ? "import #{pod_target.product_module_name}\n" : ''
|
134
176
|
source_file.open('w') { |f| f << import_statement }
|
135
177
|
else
|
136
178
|
source_file = project.path.dirname.+("#{name}/main.m")
|
137
179
|
source_file.parent.mkpath
|
138
|
-
import_statement = if
|
180
|
+
import_statement = if pod_target.should_build? && pod_target.defines_module?
|
139
181
|
"@import #{pod_target.product_module_name};\n"
|
140
182
|
else
|
141
183
|
header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
|
@@ -155,6 +197,30 @@ module Pod
|
|
155
197
|
source_file
|
156
198
|
end
|
157
199
|
|
200
|
+
# Creates a default launchscreen storyboard file.
|
201
|
+
#
|
202
|
+
# @param [Project] project
|
203
|
+
# the Xcodeproj to generate the launchscreen storyboard into.
|
204
|
+
#
|
205
|
+
# @param [String] deployment_target
|
206
|
+
# the deployment target for the platform.
|
207
|
+
#
|
208
|
+
# @param [String] name
|
209
|
+
# The name of the folder to use and save the generated launchscreen storyboard file.
|
210
|
+
#
|
211
|
+
# @return [Pathname] the new launchscreen storyboard file that was generated.
|
212
|
+
#
|
213
|
+
def self.create_launchscreen_storyboard_file(project, deployment_target, name = 'App')
|
214
|
+
launch_storyboard_file = project.path.dirname.+("#{name}/LaunchScreen.storyboard")
|
215
|
+
launch_storyboard_file.parent.mkpath
|
216
|
+
if Version.new(deployment_target) >= Version.new('9.0')
|
217
|
+
File.write(launch_storyboard_file, LAUNCHSCREEN_STORYBOARD_CONTENTS)
|
218
|
+
else
|
219
|
+
File.write(launch_storyboard_file, LAUNCHSCREEN_STORYBOARD_CONTENTS_IOS_8)
|
220
|
+
end
|
221
|
+
launch_storyboard_file
|
222
|
+
end
|
223
|
+
|
158
224
|
# Creates a default app host 'main.m' file.
|
159
225
|
#
|
160
226
|
# @param [Project] project
|
@@ -176,7 +242,7 @@ module Pod
|
|
176
242
|
when :ios, :tvos
|
177
243
|
f << IOS_APP_HOST_MAIN_CONTENTS
|
178
244
|
when :osx
|
179
|
-
f <<
|
245
|
+
f << MACOS_APP_HOST_MAIN_CONTENTS
|
180
246
|
end
|
181
247
|
end
|
182
248
|
source_file
|
@@ -215,13 +281,71 @@ int main(int argc, char *argv[])
|
|
215
281
|
}
|
216
282
|
EOS
|
217
283
|
|
218
|
-
|
284
|
+
MACOS_APP_HOST_MAIN_CONTENTS = <<EOS.freeze
|
219
285
|
#import <Cocoa/Cocoa.h>
|
220
286
|
|
221
287
|
int main(int argc, const char * argv[]) {
|
222
288
|
return NSApplicationMain(argc, argv);
|
223
289
|
}
|
224
290
|
EOS
|
291
|
+
|
292
|
+
LAUNCHSCREEN_STORYBOARD_CONTENTS_IOS_8 = <<-XML.strip_heredoc.freeze
|
293
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
294
|
+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
295
|
+
<dependencies>
|
296
|
+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
|
297
|
+
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
298
|
+
</dependencies>
|
299
|
+
<scenes>
|
300
|
+
<!--View Controller-->
|
301
|
+
<scene sceneID="EHf-IW-A2E">
|
302
|
+
<objects>
|
303
|
+
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
304
|
+
<layoutGuides>
|
305
|
+
<viewControllerLayoutGuide type="top" id="rUq-ht-380"/>
|
306
|
+
<viewControllerLayoutGuide type="bottom" id="a9l-8d-mfx"/>
|
307
|
+
</layoutGuides>
|
308
|
+
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
309
|
+
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
310
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
311
|
+
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
312
|
+
</view>
|
313
|
+
</viewController>
|
314
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
315
|
+
</objects>
|
316
|
+
<point key="canvasLocation" x="53" y="375"/>
|
317
|
+
</scene>
|
318
|
+
</scenes>
|
319
|
+
</document>
|
320
|
+
XML
|
321
|
+
|
322
|
+
LAUNCHSCREEN_STORYBOARD_CONTENTS = <<-XML.strip_heredoc.freeze
|
323
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
324
|
+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
325
|
+
<dependencies>
|
326
|
+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
|
327
|
+
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
328
|
+
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
329
|
+
</dependencies>
|
330
|
+
<scenes>
|
331
|
+
<!--View Controller-->
|
332
|
+
<scene sceneID="EHf-IW-A2E">
|
333
|
+
<objects>
|
334
|
+
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
335
|
+
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
336
|
+
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
337
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
338
|
+
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
339
|
+
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
340
|
+
</view>
|
341
|
+
</viewController>
|
342
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
343
|
+
</objects>
|
344
|
+
<point key="canvasLocation" x="53" y="375"/>
|
345
|
+
</scene>
|
346
|
+
</scenes>
|
347
|
+
</document>
|
348
|
+
XML
|
225
349
|
end
|
226
350
|
end
|
227
351
|
end
|
@@ -38,6 +38,12 @@ module Pod
|
|
38
38
|
File.chmod(0755, pathname.to_s)
|
39
39
|
end
|
40
40
|
|
41
|
+
# @return [String] The contents of the copy resources script.
|
42
|
+
#
|
43
|
+
def generate
|
44
|
+
script
|
45
|
+
end
|
46
|
+
|
41
47
|
private
|
42
48
|
|
43
49
|
# @!group Private Helpers
|
@@ -99,10 +105,15 @@ set -e
|
|
99
105
|
set -u
|
100
106
|
set -o pipefail
|
101
107
|
|
108
|
+
function on_error {
|
109
|
+
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
|
110
|
+
}
|
111
|
+
trap 'on_error $LINENO' ERR
|
112
|
+
|
102
113
|
if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then
|
103
|
-
|
104
|
-
|
105
|
-
|
114
|
+
# If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy
|
115
|
+
# resources to, so exit 0 (signalling the script phase was successful).
|
116
|
+
exit 0
|
106
117
|
fi
|
107
118
|
|
108
119
|
mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
|
@@ -8,13 +8,22 @@ module Pod
|
|
8
8
|
@class_name = "PodsDummy_#{validated_class_name_identifier}"
|
9
9
|
end
|
10
10
|
|
11
|
+
# @return [String] the string contents of the dummy source file.
|
12
|
+
#
|
13
|
+
def generate
|
14
|
+
result = <<-source.strip_heredoc
|
15
|
+
#import <Foundation/Foundation.h>
|
16
|
+
@interface #{class_name} : NSObject
|
17
|
+
@end
|
18
|
+
@implementation #{class_name}
|
19
|
+
@end
|
20
|
+
source
|
21
|
+
result
|
22
|
+
end
|
23
|
+
|
11
24
|
def save_as(pathname)
|
12
25
|
pathname.open('w') do |source|
|
13
|
-
source.
|
14
|
-
source.puts "@interface #{class_name} : NSObject"
|
15
|
-
source.puts '@end'
|
16
|
-
source.puts "@implementation #{class_name}"
|
17
|
-
source.puts '@end'
|
26
|
+
source.write(generate)
|
18
27
|
end
|
19
28
|
end
|
20
29
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
require 'cocoapods/target/framework_paths'
|
2
|
+
|
1
3
|
module Pod
|
2
4
|
module Generator
|
3
5
|
class EmbedFrameworksScript
|
4
|
-
# @return [Hash{String => Array<
|
6
|
+
# @return [Hash{String => Array<FrameworkPaths>}] Multiple lists of frameworks per
|
5
7
|
# configuration.
|
6
8
|
#
|
7
9
|
attr_reader :frameworks_by_config
|
8
10
|
|
9
|
-
# @param [Hash{String => Array<
|
11
|
+
# @param [Hash{String => Array<FrameworkPaths>] frameworks_by_config
|
10
12
|
# @see #frameworks_by_config
|
11
13
|
#
|
12
14
|
def initialize(frameworks_by_config)
|
@@ -27,6 +29,12 @@ module Pod
|
|
27
29
|
File.chmod(0755, pathname.to_s)
|
28
30
|
end
|
29
31
|
|
32
|
+
# @return [String] The contents of the embed frameworks script.
|
33
|
+
#
|
34
|
+
def generate
|
35
|
+
script
|
36
|
+
end
|
37
|
+
|
30
38
|
private
|
31
39
|
|
32
40
|
# @!group Private Helpers
|
@@ -40,10 +48,15 @@ module Pod
|
|
40
48
|
set -u
|
41
49
|
set -o pipefail
|
42
50
|
|
51
|
+
function on_error {
|
52
|
+
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
|
53
|
+
}
|
54
|
+
trap 'on_error $LINENO' ERR
|
55
|
+
|
43
56
|
if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
|
44
|
-
|
45
|
-
|
46
|
-
|
57
|
+
# If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
|
58
|
+
# frameworks to, so exit 0 (signalling the script phase was successful).
|
59
|
+
exit 0
|
47
60
|
fi
|
48
61
|
|
49
62
|
echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
|
@@ -73,8 +86,8 @@ module Pod
|
|
73
86
|
local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
|
74
87
|
|
75
88
|
if [ -L "${source}" ]; then
|
76
|
-
|
77
|
-
|
89
|
+
echo "Symlinked..."
|
90
|
+
source="$(readlink "${source}")"
|
78
91
|
fi
|
79
92
|
|
80
93
|
# Use filter instead of exclude so missing patterns don't throw errors.
|
@@ -84,8 +97,13 @@ module Pod
|
|
84
97
|
local basename
|
85
98
|
basename="$(basename -s .framework "$1")"
|
86
99
|
binary="${destination}/${basename}.framework/${basename}"
|
100
|
+
|
87
101
|
if ! [ -r "$binary" ]; then
|
88
102
|
binary="${destination}/${basename}"
|
103
|
+
elif [ -L "${binary}" ]; then
|
104
|
+
echo "Destination binary is symlinked..."
|
105
|
+
dirname="$(dirname "${binary}")"
|
106
|
+
binary="${dirname}/$(readlink "${binary}")"
|
89
107
|
fi
|
90
108
|
|
91
109
|
# Strip invalid architectures so "fat" simulator / device frameworks work on device
|
@@ -99,7 +117,7 @@ module Pod
|
|
99
117
|
# Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
|
100
118
|
if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
|
101
119
|
local swift_runtime_libs
|
102
|
-
swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u
|
120
|
+
swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u)
|
103
121
|
for lib in $swift_runtime_libs; do
|
104
122
|
echo "rsync -auv \\"${SWIFT_STDLIB_PATH}/${lib}\\" \\"${destination}\\""
|
105
123
|
rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
|
@@ -138,8 +156,8 @@ module Pod
|
|
138
156
|
|
139
157
|
# Signs a framework with the provided identity
|
140
158
|
code_sign_if_enabled() {
|
141
|
-
if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
|
142
|
-
# Use the current
|
159
|
+
if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
|
160
|
+
# Use the current code_sign_identity
|
143
161
|
echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
|
144
162
|
local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
|
145
163
|
|
@@ -168,7 +186,7 @@ module Pod
|
|
168
186
|
for arch in $binary_archs; do
|
169
187
|
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
|
170
188
|
# Strip non-valid architectures in-place
|
171
|
-
lipo -remove "$arch" -output "$binary" "$binary"
|
189
|
+
lipo -remove "$arch" -output "$binary" "$binary"
|
172
190
|
stripped="$stripped $arch"
|
173
191
|
fi
|
174
192
|
done
|
@@ -181,16 +199,15 @@ module Pod
|
|
181
199
|
SH
|
182
200
|
script << "\n" unless frameworks_by_config.values.all?(&:empty?)
|
183
201
|
frameworks_by_config.each do |config, frameworks_with_dsyms|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
end
|
192
|
-
script << "fi\n"
|
202
|
+
next if frameworks_with_dsyms.empty?
|
203
|
+
script << %(if [[ "$CONFIGURATION" == "#{config}" ]]; then\n)
|
204
|
+
frameworks_with_dsyms.each do |framework_with_dsym|
|
205
|
+
script << %( install_framework "#{framework_with_dsym.source_path}"\n)
|
206
|
+
# Vendored frameworks might have a dSYM file next to them so ensure its copied. Frameworks built from
|
207
|
+
# sources will have their dSYM generated and copied by Xcode.
|
208
|
+
script << %( install_dsym "#{framework_with_dsym.dsym_path}"\n) unless framework_with_dsym.dsym_path.nil?
|
193
209
|
end
|
210
|
+
script << "fi\n"
|
194
211
|
end
|
195
212
|
script << <<-SH.strip_heredoc
|
196
213
|
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
|
@@ -18,16 +18,22 @@ module Pod
|
|
18
18
|
#
|
19
19
|
attr_reader :bundle_package_type
|
20
20
|
|
21
|
+
# @return [Hash] any additional entries to include in this Info.plist
|
22
|
+
#
|
23
|
+
attr_reader :additional_entries
|
24
|
+
|
21
25
|
# Initialize a new instance
|
22
26
|
#
|
23
|
-
# @param [Version] version @see version
|
24
|
-
# @param [Platform] platform @see platform
|
25
|
-
# @param [Symbol] bundle_package_type @see bundle_package_type
|
27
|
+
# @param [Version] version @see #version
|
28
|
+
# @param [Platform] platform @see #platform
|
29
|
+
# @param [Symbol] bundle_package_type @see #bundle_package_type
|
30
|
+
# @param [Hash] additional_entries @see #additional_entries
|
26
31
|
#
|
27
|
-
def initialize(version, platform, bundle_package_type = :fmwk)
|
32
|
+
def initialize(version, platform, bundle_package_type = :fmwk, additional_entries = {})
|
28
33
|
@version = version
|
29
34
|
@platform = platform
|
30
35
|
@bundle_package_type = bundle_package_type
|
36
|
+
@additional_entries = additional_entries
|
31
37
|
end
|
32
38
|
|
33
39
|
# Generates and saves the Info.plist to the given path.
|
@@ -109,6 +115,8 @@ module Pod
|
|
109
115
|
info['CFBundleVersion'] = '1' if bundle_package_type == :bndl
|
110
116
|
info['NSPrincipalClass'] = 'NSApplication' if bundle_package_type == :appl && platform == :osx
|
111
117
|
|
118
|
+
info.merge!(additional_entries)
|
119
|
+
|
112
120
|
info
|
113
121
|
end
|
114
122
|
end
|
@@ -15,10 +15,10 @@ module Pod
|
|
15
15
|
# Initialize a new instance
|
16
16
|
#
|
17
17
|
# @param [Array<FileAccessor>] file_accessors
|
18
|
-
# @see file_accessors
|
18
|
+
# @see #file_accessors
|
19
19
|
#
|
20
20
|
# @param [Platform] platform
|
21
|
-
# @see platform
|
21
|
+
# @see Header#platform
|
22
22
|
#
|
23
23
|
def initialize(file_accessors, platform)
|
24
24
|
@file_accessors = file_accessors
|
@@ -76,6 +76,20 @@ module Pod
|
|
76
76
|
@registrations[hook_name] << Hook.new(hook_name, plugin_name, block)
|
77
77
|
end
|
78
78
|
|
79
|
+
# Returns all the hooks to run for the given event name
|
80
|
+
# and set of whitelisted plugins
|
81
|
+
#
|
82
|
+
# @see #run
|
83
|
+
#
|
84
|
+
# @return [Array<Hook>] the hooks to run
|
85
|
+
#
|
86
|
+
def hooks_to_run(name, whitelisted_plugins = nil)
|
87
|
+
return [] unless registrations
|
88
|
+
hooks = registrations.fetch(name, [])
|
89
|
+
return hooks unless whitelisted_plugins
|
90
|
+
hooks.select { |hook| whitelisted_plugins.key?(hook.plugin_name) }
|
91
|
+
end
|
92
|
+
|
79
93
|
# Runs all the registered blocks for the hook with the given name.
|
80
94
|
#
|
81
95
|
# @param [Symbol] name
|
@@ -94,23 +108,20 @@ module Pod
|
|
94
108
|
raise ArgumentError, 'Missing name' unless name
|
95
109
|
raise ArgumentError, 'Missing options' unless context
|
96
110
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
block.call(context)
|
112
|
-
end
|
113
|
-
end
|
111
|
+
hooks = hooks_to_run(name, whitelisted_plugins)
|
112
|
+
return if hooks.empty?
|
113
|
+
|
114
|
+
UI.message "- Running #{name.to_s.tr('_', ' ')} hooks" do
|
115
|
+
hooks.each do |hook|
|
116
|
+
UI.message "- #{hook.plugin_name} from " \
|
117
|
+
"`#{hook.block.source_location.first}`" do
|
118
|
+
block = hook.block
|
119
|
+
if block.arity > 1
|
120
|
+
user_options = whitelisted_plugins[hook.plugin_name]
|
121
|
+
user_options = user_options.with_indifferent_access if user_options
|
122
|
+
block.call(context, user_options)
|
123
|
+
else
|
124
|
+
block.call(context)
|
114
125
|
end
|
115
126
|
end
|
116
127
|
end
|
@@ -1,45 +1,52 @@
|
|
1
1
|
module Pod
|
2
2
|
class Installer
|
3
3
|
class Analyzer
|
4
|
+
# A simple container produced after a analysis is completed by the {Analyzer}.
|
5
|
+
#
|
4
6
|
class AnalysisResult
|
5
7
|
# @return [SpecsState] the states of the Podfile specs.
|
6
8
|
#
|
7
|
-
|
9
|
+
attr_reader :podfile_state
|
8
10
|
|
9
|
-
# @return [Hash{TargetDefinition => Array<Specification>}] the
|
10
|
-
# specifications grouped by target.
|
11
|
+
# @return [Hash{TargetDefinition => Array<Specification>}] the specifications grouped by target.
|
11
12
|
#
|
12
|
-
|
13
|
+
attr_reader :specs_by_target
|
13
14
|
|
14
|
-
# @return [Hash{Source => Array<Specification>}] the
|
15
|
-
# specifications grouped by spec repo source.
|
15
|
+
# @return [Hash{Source => Array<Specification>}] the specifications grouped by spec repo source.
|
16
16
|
#
|
17
|
-
|
17
|
+
attr_reader :specs_by_source
|
18
18
|
|
19
|
-
# @return [Array<Specification>] the specifications of the resolved
|
20
|
-
# version of Pods that should be installed.
|
19
|
+
# @return [Array<Specification>] the specifications of the resolved version of Pods that should be installed.
|
21
20
|
#
|
22
|
-
|
21
|
+
attr_reader :specifications
|
23
22
|
|
24
|
-
# @return [SpecsState] the states of the {Sandbox} respect the resolved
|
25
|
-
# specifications.
|
23
|
+
# @return [SpecsState] the states of the {Sandbox} respect the resolved specifications.
|
26
24
|
#
|
27
|
-
|
25
|
+
attr_reader :sandbox_state
|
28
26
|
|
29
|
-
# @return [Array<AggregateTarget>] The aggregate targets created for each
|
30
|
-
# {TargetDefinition} from the {Podfile}.
|
27
|
+
# @return [Array<AggregateTarget>] The aggregate targets created for each {TargetDefinition} from the {Podfile}.
|
31
28
|
#
|
32
|
-
|
29
|
+
attr_reader :targets
|
33
30
|
|
34
|
-
# @return [
|
35
|
-
# results of inspecting the user targets
|
31
|
+
# @return [Array<PodTarget>] The pod targets created for all the aggregate targets.
|
36
32
|
#
|
37
|
-
|
33
|
+
attr_reader :pod_targets
|
38
34
|
|
39
|
-
# @return [PodfileDependencyCache] the cache of all dependencies in the
|
40
|
-
# podfile.
|
35
|
+
# @return [PodfileDependencyCache] the cache of all dependencies in the podfile.
|
41
36
|
#
|
42
|
-
|
37
|
+
attr_reader :podfile_dependency_cache
|
38
|
+
|
39
|
+
def initialize(podfile_state, specs_by_target, specs_by_source, specifications, sandbox_state, targets, pod_targets,
|
40
|
+
podfile_dependency_cache)
|
41
|
+
@podfile_state = podfile_state
|
42
|
+
@specs_by_target = specs_by_target
|
43
|
+
@specs_by_source = specs_by_source
|
44
|
+
@specifications = specifications
|
45
|
+
@sandbox_state = sandbox_state
|
46
|
+
@targets = targets
|
47
|
+
@pod_targets = pod_targets
|
48
|
+
@podfile_dependency_cache = podfile_dependency_cache
|
49
|
+
end
|
43
50
|
|
44
51
|
# @return [Hash{String=>Symbol}] A hash representing all the user build
|
45
52
|
# configurations across all integration targets. Each key
|
@@ -51,6 +58,29 @@ module Pod
|
|
51
58
|
result.merge(target.user_build_configurations)
|
52
59
|
end
|
53
60
|
end
|
61
|
+
|
62
|
+
# @return [Bool] Whether an installation should be performed or this
|
63
|
+
# CocoaPods project is already up to date.
|
64
|
+
#
|
65
|
+
def needs_install?
|
66
|
+
podfile_needs_install? || sandbox_needs_install?
|
67
|
+
end
|
68
|
+
|
69
|
+
# @return [Bool] Whether the podfile has changes respect to the lockfile.
|
70
|
+
#
|
71
|
+
def podfile_needs_install?
|
72
|
+
state = podfile_state
|
73
|
+
needing_install = state.added.length + state.changed.length + state.deleted.length
|
74
|
+
needing_install > 0
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [Bool] Whether the sandbox is in synch with the lockfile.
|
78
|
+
#
|
79
|
+
def sandbox_needs_install?
|
80
|
+
state = sandbox_state
|
81
|
+
needing_install = state.added.length + state.changed.length + state.deleted.length
|
82
|
+
needing_install > 0
|
83
|
+
end
|
54
84
|
end
|
55
85
|
end
|
56
86
|
end
|