cocoapods 0.39.0 → 1.0.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +261 -12
  3. data/lib/cocoapods.rb +1 -0
  4. data/lib/cocoapods/command.rb +1 -0
  5. data/lib/cocoapods/command/env.rb +66 -0
  6. data/lib/cocoapods/command/init.rb +1 -1
  7. data/lib/cocoapods/command/lib.rb +1 -1
  8. data/lib/cocoapods/command/project.rb +0 -4
  9. data/lib/cocoapods/command/repo/lint.rb +7 -6
  10. data/lib/cocoapods/command/repo/push.rb +22 -1
  11. data/lib/cocoapods/command/setup.rb +0 -24
  12. data/lib/cocoapods/command/spec/create.rb +3 -1
  13. data/lib/cocoapods/command/spec/edit.rb +14 -21
  14. data/lib/cocoapods/command/spec/env_spec.rb +53 -0
  15. data/lib/cocoapods/command/spec/lint.rb +1 -1
  16. data/lib/cocoapods/config.rb +1 -34
  17. data/lib/cocoapods/downloader.rb +9 -4
  18. data/lib/cocoapods/external_sources.rb +0 -4
  19. data/lib/cocoapods/external_sources/abstract_external_source.rb +38 -11
  20. data/lib/cocoapods/external_sources/path_source.rb +2 -2
  21. data/lib/cocoapods/gem_version.rb +2 -2
  22. data/lib/cocoapods/generator/acknowledgements.rb +1 -1
  23. data/lib/cocoapods/generator/acknowledgements/plist.rb +1 -1
  24. data/lib/cocoapods/generator/copy_resources_script.rb +28 -21
  25. data/lib/cocoapods/generator/info_plist_file.rb +34 -8
  26. data/lib/cocoapods/generator/module_map.rb +3 -18
  27. data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +22 -10
  28. data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +2 -1
  29. data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +2 -1
  30. data/lib/cocoapods/hooks_manager.rb +3 -11
  31. data/lib/cocoapods/installer.rb +45 -25
  32. data/lib/cocoapods/installer/analyzer.rb +53 -25
  33. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +2 -13
  34. data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +4 -0
  35. data/lib/cocoapods/installer/analyzer/target_inspector.rb +22 -19
  36. data/lib/cocoapods/installer/file_references_installer.rb +53 -6
  37. data/lib/cocoapods/installer/installation_options.rb +156 -0
  38. data/lib/cocoapods/installer/migrator.rb +1 -56
  39. data/lib/cocoapods/installer/pod_source_installer.rb +10 -8
  40. data/lib/cocoapods/installer/podfile_validator.rb +42 -1
  41. data/lib/cocoapods/installer/post_install_hooks_context.rb +19 -2
  42. data/lib/cocoapods/installer/target_installer.rb +6 -2
  43. data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +6 -5
  44. data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +82 -14
  45. data/lib/cocoapods/installer/user_project_integrator.rb +37 -16
  46. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +14 -136
  47. data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +15 -22
  48. data/lib/cocoapods/project.rb +109 -19
  49. data/lib/cocoapods/resolver.rb +17 -15
  50. data/lib/cocoapods/resolver/lazy_specification.rb +4 -0
  51. data/lib/cocoapods/sandbox.rb +0 -32
  52. data/lib/cocoapods/sandbox/headers_store.rb +2 -2
  53. data/lib/cocoapods/sandbox/podspec_finder.rb +1 -1
  54. data/lib/cocoapods/sources_manager.rb +181 -50
  55. data/lib/cocoapods/target/aggregate_target.rb +17 -11
  56. data/lib/cocoapods/target/pod_target.rb +31 -4
  57. data/lib/cocoapods/user_interface.rb +32 -3
  58. data/lib/cocoapods/user_interface/error_report.rb +46 -36
  59. data/lib/cocoapods/validator.rb +132 -43
  60. metadata +164 -79
@@ -24,7 +24,7 @@ module Pod
24
24
  # @see AbstractExternalSource#description
25
25
  #
26
26
  def description
27
- "from `#{params[:path] || params[:local]}`"
27
+ "from `#{declared_path}`"
28
28
  end
29
29
 
30
30
  private
@@ -34,7 +34,7 @@ module Pod
34
34
  # @return [String] The path as declared by the user.
35
35
  #
36
36
  def declared_path
37
- result = params[:path] || params[:local]
37
+ result = params[:path]
38
38
  result.to_s if result
39
39
  end
40
40
 
@@ -1,5 +1,5 @@
1
1
  module Pod
2
- # The version of the cocoapods command line tool.
2
+ # The version of the CocoaPods command line tool.
3
3
  #
4
- VERSION = '0.39.0' unless defined? Pod::VERSION
4
+ VERSION = '1.0.0.beta.1'.freeze unless defined? Pod::VERSION
5
5
  end
@@ -45,7 +45,7 @@ module Pod
45
45
  # @return [String] the foot notes.
46
46
  #
47
47
  def footnote_text
48
- 'Generated by CocoaPods - http://cocoapods.org'
48
+ 'Generated by CocoaPods - https://cocoapods.org'
49
49
  end
50
50
 
51
51
  #-----------------------------------------------------------------------#
@@ -6,7 +6,7 @@ module Pod
6
6
  end
7
7
 
8
8
  def save_as(path)
9
- Xcodeproj::PlistHelper.write(plist, path)
9
+ Xcodeproj::Plist.write_to_path(plist, path)
10
10
  end
11
11
 
12
12
  def plist
@@ -114,44 +114,51 @@ realpath() {
114
114
 
115
115
  install_resource()
116
116
  {
117
- case $1 in
117
+ if [[ "$1" = /* ]] ; then
118
+ RESOURCE_PATH="$1"
119
+ else
120
+ RESOURCE_PATH="${PODS_ROOT}/$1"
121
+ fi
122
+ if [[ ! -e "$RESOURCE_PATH" ]] ; then
123
+ cat << EOM
124
+ error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
125
+ EOM
126
+ exit 1
127
+ fi
128
+ case $RESOURCE_PATH in
118
129
  *\.storyboard)
119
- echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$1\\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}"
120
- ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$1\\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}"
130
+ echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT}"
131
+ ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}"
121
132
  ;;
122
133
  *\.xib)
123
- echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$1\\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}"
124
- ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$1\\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}"
134
+ echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT}"
135
+ ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}"
125
136
  ;;
126
137
  *.framework)
127
138
  echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
128
139
  mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
129
- echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
130
- rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
140
+ echo "rsync -av $RESOURCE_PATH ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
141
+ rsync -av "$RESOURCE_PATH" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
131
142
  ;;
132
143
  *.xcdatamodel)
133
- echo "xcrun momc \\"${PODS_ROOT}/$1\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\\""
134
- xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom"
144
+ echo "xcrun momc \\"$RESOURCE_PATH\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\\""
145
+ xcrun momc "$RESOURCE_PATH" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
135
146
  ;;
136
147
  *.xcdatamodeld)
137
- echo "xcrun momc \\"${PODS_ROOT}/$1\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\\""
138
- xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd"
148
+ echo "xcrun momc \\"$RESOURCE_PATH\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\\""
149
+ xcrun momc "$RESOURCE_PATH" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
139
150
  ;;
140
151
  *.xcmappingmodel)
141
- echo "xcrun mapc \\"${PODS_ROOT}/$1\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\\""
142
- xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm"
152
+ echo "xcrun mapc \\"$RESOURCE_PATH\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\\""
153
+ xcrun mapc "$RESOURCE_PATH" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
143
154
  ;;
144
155
  *.xcassets)
145
- ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1")
156
+ ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH")
146
157
  XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
147
158
  ;;
148
- /*)
149
- echo "$1"
150
- echo "$1" >> "$RESOURCES_TO_COPY"
151
- ;;
152
159
  *)
153
- echo "${PODS_ROOT}/$1"
154
- echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY"
160
+ echo "$RESOURCE_PATH"
161
+ echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
155
162
  ;;
156
163
  esac
157
164
  }
@@ -195,7 +202,7 @@ then
195
202
  fi
196
203
  done <<<"$OTHER_XCASSETS"
197
204
 
198
- printf "%s\\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
205
+ printf "%s\\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
199
206
  fi
200
207
  EOS
201
208
  end
@@ -39,7 +39,8 @@ module Pod
39
39
  #
40
40
  def target_version
41
41
  if target && target.respond_to?(:root_spec)
42
- target.root_spec.version.to_s
42
+ version = target.root_spec.version
43
+ [version.major, version.minor, version.patch].join('.')
43
44
  else
44
45
  '1.0.0'
45
46
  end
@@ -50,20 +51,35 @@ module Pod
50
51
  # @return [String]
51
52
  #
52
53
  def generate
53
- FILE_CONTENTS.sub('${CURRENT_PROJECT_VERSION_STRING}', target_version)
54
+ header + dict + footer
54
55
  end
55
56
 
56
- FILE_CONTENTS = <<-EOS
57
+ private
58
+
59
+ def header
60
+ <<-PLIST
57
61
  <?xml version="1.0" encoding="UTF-8"?>
58
62
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
59
63
  <plist version="1.0">
60
64
  <dict>
65
+ PLIST
66
+ end
67
+
68
+ def footer
69
+ <<-PLIST
70
+ </dict>
71
+ </plist>
72
+ PLIST
73
+ end
74
+
75
+ def dict
76
+ dict = <<-PLIST
61
77
  <key>CFBundleDevelopmentRegion</key>
62
78
  <string>en</string>
63
79
  <key>CFBundleExecutable</key>
64
80
  <string>${EXECUTABLE_NAME}</string>
65
81
  <key>CFBundleIdentifier</key>
66
- <string>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</string>
82
+ <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
67
83
  <key>CFBundleInfoDictionaryVersion</key>
68
84
  <string>6.0</string>
69
85
  <key>CFBundleName</key>
@@ -71,16 +87,26 @@ module Pod
71
87
  <key>CFBundlePackageType</key>
72
88
  <string>FMWK</string>
73
89
  <key>CFBundleShortVersionString</key>
74
- <string>${CURRENT_PROJECT_VERSION_STRING}</string>
90
+ <string>#{target_version}</string>
75
91
  <key>CFBundleSignature</key>
76
92
  <string>????</string>
77
93
  <key>CFBundleVersion</key>
78
94
  <string>${CURRENT_PROJECT_VERSION}</string>
79
95
  <key>NSPrincipalClass</key>
80
96
  <string></string>
81
- </dict>
82
- </plist>
83
- EOS
97
+ PLIST
98
+
99
+ if target.platform.name == :tvos
100
+ dict << <<-PLIST
101
+ <key>UIRequiredDeviceCapabilities</key>
102
+ <array>
103
+ <string>arm64</string>
104
+ </array>
105
+ PLIST
106
+ end
107
+
108
+ dict
109
+ end
84
110
  end
85
111
  end
86
112
  end
@@ -10,17 +10,12 @@ module Pod
10
10
  #
11
11
  attr_reader :target
12
12
 
13
- # @return [Array<#to_s>] the private headers of the module
14
- #
15
- attr_accessor :private_headers
16
-
17
13
  # Initialize a new instance
18
14
  #
19
15
  # @param [PodTarget] target @see target
20
16
  #
21
17
  def initialize(target)
22
18
  @target = target
23
- @private_headers = []
24
19
  end
25
20
 
26
21
  # Generates and saves the Info.plist to the given path.
@@ -42,24 +37,14 @@ module Pod
42
37
  # @return [String]
43
38
  #
44
39
  def generate
45
- result = <<-eos.strip_heredoc
40
+ <<-MODULE_MAP.strip_heredoc
46
41
  framework module #{target.product_module_name} {
47
42
  umbrella header "#{target.umbrella_header_path.basename}"
48
43
 
49
44
  export *
50
45
  module * { export * }
51
- eos
52
-
53
- result << "\n#{generate_private_header_exports}" unless private_headers.empty?
54
- result << "}\n"
55
- end
56
-
57
- private
58
-
59
- def generate_private_header_exports
60
- private_headers.reduce('') do |string, header|
61
- string << %( private header "#{header}"\n)
62
- end
46
+ }
47
+ MODULE_MAP
63
48
  end
64
49
  end
65
50
  end
@@ -87,15 +87,12 @@ module Pod
87
87
 
88
88
  #---------------------------------------------------------------------#
89
89
 
90
- private
90
+ protected
91
91
 
92
- # Add build settings, which ensure that the pod targets can be imported
93
- # from the integrating target by all sort of imports, which are:
94
- # - `#import <…>`
95
- # - `#import "…"`
96
- # - `@import …;` / `import …`
92
+ # @return [Hash<String, String>] the build settings necessary to import
93
+ # the pod targets.
97
94
  #
98
- def generate_settings_to_import_pod_targets
95
+ def settings_to_import_pod_targets
99
96
  if target.requires_frameworks?
100
97
  framework_header_search_paths = pod_targets.select(&:should_build?).map do |target|
101
98
  if target.scoped?
@@ -118,17 +115,32 @@ module Pod
118
115
  if pod_targets.any? { |t| t.should_build? && t.scoped? }
119
116
  build_settings['FRAMEWORK_SEARCH_PATHS'] = '"$PODS_FRAMEWORK_BUILD_PATH"'
120
117
  end
121
- @xcconfig.merge!(build_settings)
118
+ build_settings
122
119
  else
123
120
  # Make headers discoverable from $PODS_ROOT/Headers directory
124
121
  header_search_paths = target.sandbox.public_headers.search_paths(target.platform)
125
- build_settings = {
122
+ {
126
123
  # by `#import "…"`
127
124
  'HEADER_SEARCH_PATHS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths),
128
125
  # by `#import <…>`
129
126
  'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths, '-isystem'),
130
127
  }
131
- @xcconfig.merge!(build_settings)
128
+ end
129
+ end
130
+
131
+ private
132
+
133
+ # Add build settings, which ensure that the pod targets can be imported
134
+ # from the integrating target by all sort of imports, which are:
135
+ # - `#import <…>`
136
+ # - `#import "…"`
137
+ # - `@import …;` / `import …`
138
+ #
139
+ def generate_settings_to_import_pod_targets
140
+ @xcconfig.merge!(settings_to_import_pod_targets)
141
+ target.search_paths_aggregate_targets.each do |search_paths_target|
142
+ generator = AggregateXCConfig.new(search_paths_target, configuration_name)
143
+ @xcconfig.merge!(generator.settings_to_import_pod_targets)
132
144
  end
133
145
  end
134
146
 
@@ -50,7 +50,8 @@ module Pod
50
50
  'HEADER_SEARCH_PATHS' => XCConfigHelper.quote(search_paths),
51
51
  'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1',
52
52
  'SKIP_INSTALL' => 'YES',
53
- 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) '
53
+ 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) ',
54
+ 'PRODUCT_BUNDLE_IDENTIFIER' => 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}',
54
55
  # 'USE_HEADERMAP' => 'NO'
55
56
  }
56
57
 
@@ -153,7 +153,8 @@ module Pod
153
153
  # The path retrieved from Sandbox#root.
154
154
  #
155
155
  def self.add_library_build_settings(library_path, xcconfig, sandbox_root)
156
- name = File.basename(library_path, '.a').sub(/\Alib/, '')
156
+ extension = File.extname(library_path)
157
+ name = File.basename(library_path, extension).sub(/\Alib/, '')
157
158
  dirname = '${PODS_ROOT}/' + library_path.dirname.relative_path_from(sandbox_root).to_s
158
159
  build_settings = {
159
160
  'OTHER_LDFLAGS' => "-l#{name}",
@@ -44,11 +44,9 @@ module Pod
44
44
  #
45
45
  def initialize(name, plugin_name, block)
46
46
  raise ArgumentError, 'Missing name' unless name
47
+ raise ArgumentError, 'Missing plugin_name' unless plugin_name
47
48
  raise ArgumentError, 'Missing block' unless block
48
49
 
49
- UI.warn '[Hooks] The use of hooks without specifying a `plugin_name` ' \
50
- "has been deprecated (from file `#{block.binding.eval('File.expand_path __FILE__')}`)." unless plugin_name
51
-
52
50
  @name = name
53
51
  @plugin_name = plugin_name
54
52
  @block = block
@@ -72,13 +70,7 @@ module Pod
72
70
  # @param [Proc] block
73
71
  # The block.
74
72
  #
75
- def register(plugin_name, hook_name = nil, &block)
76
- # TODO: Backwards compatibility with nameless plugins from CP 0.34
77
- if hook_name.nil?
78
- hook_name = plugin_name
79
- plugin_name = nil
80
- end
81
-
73
+ def register(plugin_name, hook_name, &block)
82
74
  @registrations ||= {}
83
75
  @registrations[hook_name] ||= []
84
76
  @registrations[hook_name] << Hook.new(hook_name, plugin_name, block)
@@ -108,7 +100,7 @@ module Pod
108
100
  UI.message "- Running #{name.to_s.tr('_', ' ')} hooks" do
109
101
  hooks.each do |hook|
110
102
  next if whitelisted_plugins && !whitelisted_plugins.key?(hook.plugin_name)
111
- UI.message "- #{hook.plugin_name || 'unknown plugin'} from " \
103
+ UI.message "- #{hook.plugin_name} from " \
112
104
  "`#{hook.block.source_location.first}`" do
113
105
  block = hook.block
114
106
  if block.arity > 1
@@ -32,6 +32,7 @@ module Pod
32
32
  autoload :AggregateTargetInstaller, 'cocoapods/installer/target_installer/aggregate_target_installer'
33
33
  autoload :Analyzer, 'cocoapods/installer/analyzer'
34
34
  autoload :FileReferencesInstaller, 'cocoapods/installer/file_references_installer'
35
+ autoload :InstallationOptions, 'cocoapods/installer/installation_options'
35
36
  autoload :PostInstallHooksContext, 'cocoapods/installer/post_install_hooks_context'
36
37
  autoload :PreInstallHooksContext, 'cocoapods/installer/pre_install_hooks_context'
37
38
  autoload :SourceProviderHooksContext, 'cocoapods/installer/source_provider_hooks_context'
@@ -44,6 +45,9 @@ module Pod
44
45
  autoload :UserProjectIntegrator, 'cocoapods/installer/user_project_integrator'
45
46
 
46
47
  include Config::Mixin
48
+ include InstallationOptions::Mixin
49
+
50
+ delegate_installation_options { podfile }
47
51
 
48
52
  # @return [Sandbox] The sandbox where the Pods should be installed.
49
53
  #
@@ -109,12 +113,19 @@ module Pod
109
113
  verify_no_static_framework_transitive_dependencies
110
114
  verify_framework_usage
111
115
  generate_pods_project
112
- integrate_user_project if config.integrate_targets?
116
+ integrate_user_project if installation_options.integrate_targets?
113
117
  perform_post_install_actions
114
118
  end
115
119
 
116
120
  def prepare
121
+ # Raise if pwd is inside Pods
122
+ if Dir.pwd.start_with?(sandbox.root.to_path)
123
+ message = 'Command should be run from a directory outside Pods directory.'
124
+ message << "\n\n\tCurrent directory is #{UI.path(Pathname.pwd)}\n"
125
+ raise Informative, message
126
+ end
117
127
  UI.message 'Preparing' do
128
+ deintegrate_if_different_major_version
118
129
  sandbox.prepare
119
130
  ensure_plugins_are_installed!
120
131
  Migrator.migrate(sandbox)
@@ -135,7 +146,6 @@ module Pod
135
146
  UI.section 'Analyzing dependencies' do
136
147
  analyze(analyzer)
137
148
  validate_build_configurations
138
- prepare_for_legacy_compatibility
139
149
  clean_sandbox
140
150
  end
141
151
  end
@@ -215,7 +225,9 @@ module Pod
215
225
  end
216
226
 
217
227
  def create_analyzer
218
- Analyzer.new(sandbox, podfile, lockfile)
228
+ Analyzer.new(sandbox, podfile, lockfile).tap do |analyzer|
229
+ analyzer.installation_options = installation_options
230
+ end
219
231
  end
220
232
 
221
233
  # Ensures that the white-listed build configurations are known to prevent
@@ -237,17 +249,6 @@ module Pod
237
249
  end
238
250
  end
239
251
 
240
- # Prepares the Pods folder in order to be compatible with the most recent
241
- # version of CocoaPods.
242
- #
243
- # @return [void]
244
- #
245
- def prepare_for_legacy_compatibility
246
- # move_target_support_files_if_needed
247
- # move_Local_Podspecs_to_Podspecs_if_needed
248
- # move_pods_to_sources_folder_if_needed
249
- end
250
-
251
252
  # @return [void] In this step we clean all the folders that will be
252
253
  # regenerated from scratch and any file which might not be
253
254
  # overwritten.
@@ -323,7 +324,7 @@ module Pod
323
324
  end
324
325
 
325
326
  @pod_installers ||= []
326
- pod_installer = PodSourceInstaller.new(sandbox, specs_by_platform)
327
+ pod_installer = PodSourceInstaller.new(sandbox, specs_by_platform, :can_cache => installation_options.clean?)
327
328
  @pod_installers << pod_installer
328
329
  pod_installer
329
330
  end
@@ -345,7 +346,7 @@ module Pod
345
346
  # @todo Why the @pod_installers might be empty?
346
347
  #
347
348
  def clean_pod_sources
348
- return unless config.clean?
349
+ return unless installation_options.clean?
349
350
  return unless @pod_installers
350
351
  @pod_installers.each(&:clean!)
351
352
  end
@@ -367,7 +368,7 @@ module Pod
367
368
  # @todo Why the @pod_installers might be empty?
368
369
  #
369
370
  def lock_pod_sources
370
- return unless config.lock_pod_source?
371
+ return unless installation_options.lock_pod_sources?
371
372
  return unless @pod_installers
372
373
  @pod_installers.each do |installer|
373
374
  pod_target = pod_targets.find { |target| target.pod_name == installer.name }
@@ -386,6 +387,7 @@ module Pod
386
387
  aggregate_targets.each do |aggregate_target|
387
388
  aggregate_target.pod_targets.each do |pod_target|
388
389
  pod_target.host_requires_frameworks ||= aggregate_target.requires_frameworks?
390
+ pod_target.platform = nil # needs to be recomputed
389
391
  end
390
392
  end
391
393
  end
@@ -394,7 +396,7 @@ module Pod
394
396
  aggregate_targets.each do |aggregate_target|
395
397
  aggregate_target.user_build_configurations.keys.each do |config|
396
398
  pod_targets = aggregate_target.pod_targets_for_build_configuration(config)
397
- vendored_frameworks = pod_targets.flat_map(&:file_accessors).flat_map(&:vendored_frameworks)
399
+ vendored_frameworks = pod_targets.flat_map(&:file_accessors).flat_map(&:vendored_frameworks).uniq
398
400
  frameworks = vendored_frameworks.map { |fw| fw.basename('.framework') }
399
401
  frameworks += pod_targets.select { |pt| pt.should_build? && pt.requires_frameworks? }.map(&:product_module_name)
400
402
 
@@ -491,6 +493,25 @@ module Pod
491
493
  context.sources
492
494
  end
493
495
 
496
+ # Run the deintegrator against all projects in the installation root if the
497
+ # current CocoaPods major version part is different than the one in the
498
+ # lockfile.
499
+ #
500
+ # @return [void]
501
+ #
502
+ def deintegrate_if_different_major_version
503
+ return unless lockfile
504
+ return if lockfile.cocoapods_version.major == Version.create(VERSION).major
505
+ UI.section('Fully deintegrating due to major version update') do
506
+ projects = Pathname.glob(config.installation_root + '*.xcodeproj').map { |path| Xcodeproj::Project.open(path) }
507
+ deintegrator = Deintegrator.new
508
+ projects.sort.each do |project|
509
+ deintegrator.deintegrate_project(project)
510
+ project.save if project.dirty?
511
+ end
512
+ end
513
+ end
514
+
494
515
  # Ensures that all plugins specified in the {#podfile} are loaded.
495
516
  #
496
517
  # @return [void]
@@ -548,9 +569,7 @@ module Pod
548
569
  #
549
570
  def prepare_pods_project
550
571
  UI.message '- Creating Pods project' do
551
- object_version = aggregate_targets.map(&:user_project_path).compact.map do |path|
552
- Xcodeproj::Project.open(path).object_version.to_i
553
- end.min
572
+ object_version = aggregate_targets.map(&:user_project).compact.map { |p| p.object_version.to_i }.min
554
573
 
555
574
  if object_version
556
575
  @pods_project = Pod::Project.new(sandbox.project_path, false, object_version)
@@ -610,13 +629,13 @@ module Pod
610
629
  def install_libraries
611
630
  UI.message '- Installing targets' do
612
631
  pod_targets.sort_by(&:name).each do |pod_target|
613
- next if pod_target.target_definitions.flat_map(&:dependencies).empty?
632
+ next if pod_target.target_definitions.all?(&:abstract?)
614
633
  target_installer = PodTargetInstaller.new(sandbox, pod_target)
615
634
  target_installer.install!
616
635
  end
617
636
 
618
637
  aggregate_targets.sort_by(&:name).each do |target|
619
- next if target.target_definition.dependencies.empty?
638
+ next if target.target_definition.abstract?
620
639
  target_installer = AggregateTargetInstaller.new(sandbox, target)
621
640
  target_installer.install!
622
641
  end
@@ -643,7 +662,8 @@ module Pod
643
662
  frameworks_group = pods_project.frameworks_group
644
663
  aggregate_targets.each do |aggregate_target|
645
664
  is_app_extension = !(aggregate_target.user_targets.map(&:symbol_type) &
646
- [:app_extension, :watch_extension, :watch2_extension]).empty?
665
+ [:app_extension, :watch_extension, :watch2_extension, :tv_extension]).empty?
666
+ is_app_extension ||= aggregate_target.user_targets.any? { |ut| ut.common_resolved_build_setting('APPLICATION_EXTENSION_API_ONLY') == 'YES' }
647
667
 
648
668
  aggregate_target.pod_targets.each do |pod_target|
649
669
  configure_app_extension_api_only_for_target(aggregate_target) if is_app_extension
@@ -692,7 +712,7 @@ module Pod
692
712
  pods_project.development_pods.remove_from_project if pods_project.development_pods.empty?
693
713
  pods_project.sort(:groups_position => :below)
694
714
  pods_project.recreate_user_schemes(false)
695
- if config.deterministic_uuids?
715
+ if installation_options.deterministic_uuids?
696
716
  UI.message('- Generating deterministic UUIDs') { pods_project.predictabilize_uuids }
697
717
  end
698
718
  pods_project.save