pod-builder 1.9.3 → 2.0.0.beta.22

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/README.md +50 -13
  4. data/exe/pod_builder +39 -28
  5. data/lib/pod_builder/analyze.rb +32 -7
  6. data/lib/pod_builder/analyzer.rb +16 -0
  7. data/lib/pod_builder/command/build.rb +44 -161
  8. data/lib/pod_builder/command/build_all.rb +2 -2
  9. data/lib/pod_builder/command/clean.rb +34 -55
  10. data/lib/pod_builder/command/clear_lldbinit.rb +7 -3
  11. data/lib/pod_builder/command/deintegrate.rb +29 -7
  12. data/lib/pod_builder/command/generate_lfs.rb +3 -3
  13. data/lib/pod_builder/command/generate_podspec.rb +3 -2
  14. data/lib/pod_builder/command/info.rb +1 -1
  15. data/lib/pod_builder/command/init.rb +37 -14
  16. data/lib/pod_builder/command/install_sources.rb +21 -14
  17. data/lib/pod_builder/command/none.rb +2 -2
  18. data/lib/pod_builder/command/restore_all.rb +4 -4
  19. data/lib/pod_builder/command/switch.rb +137 -95
  20. data/lib/pod_builder/command/sync_podfile.rb +5 -3
  21. data/lib/pod_builder/command/update.rb +5 -6
  22. data/lib/pod_builder/command/update_lldbinit.rb +11 -9
  23. data/lib/pod_builder/configuration.rb +88 -13
  24. data/lib/pod_builder/core.rb +93 -12
  25. data/lib/pod_builder/info.rb +32 -98
  26. data/lib/pod_builder/install.rb +255 -195
  27. data/lib/pod_builder/licenses.rb +4 -4
  28. data/lib/pod_builder/podfile.rb +283 -73
  29. data/lib/pod_builder/podfile/post_actions.rb +9 -15
  30. data/lib/pod_builder/podfile_cp.rb +93 -0
  31. data/lib/pod_builder/podfile_item.rb +181 -82
  32. data/lib/pod_builder/podspec.rb +144 -135
  33. data/lib/pod_builder/rome/post_install.rb +240 -0
  34. data/lib/pod_builder/rome/pre_install.rb +6 -0
  35. data/lib/pod_builder/templates/build_podfile.template +3 -3
  36. data/lib/pod_builder/version.rb +1 -1
  37. data/pod-builder.gemspec +6 -6
  38. metadata +27 -80
  39. data/Example/Frameworks/PodBuilder.json +0 -32
  40. data/Example/PodBuilderExample.xcodeproj/project.pbxproj +0 -416
  41. data/Example/PodBuilderExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  42. data/Example/PodBuilderExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  43. data/Example/PodBuilderExample.xcodeproj/project.xcworkspace/xcuserdata/tomas.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  44. data/Example/PodBuilderExample.xcodeproj/xcuserdata/tomas.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  45. data/Example/PodBuilderExample.xcworkspace/contents.xcworkspacedata +0 -10
  46. data/Example/PodBuilderExample/AppDelegate.swift +0 -47
  47. data/Example/PodBuilderExample/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  48. data/Example/PodBuilderExample/Assets.xcassets/Contents.json +0 -6
  49. data/Example/PodBuilderExample/Base.lproj/LaunchScreen.storyboard +0 -25
  50. data/Example/PodBuilderExample/Base.lproj/Main.storyboard +0 -24
  51. data/Example/PodBuilderExample/Info.plist +0 -45
  52. data/Example/PodBuilderExample/ViewController.swift +0 -25
  53. data/Example/Podfile +0 -8
  54. data/Example/Podfile.lock +0 -16
  55. data/Example/Pods/Alamofire/LICENSE +0 -19
  56. data/Example/Pods/Alamofire/README.md +0 -242
  57. data/Example/Pods/Alamofire/Source/AFError.swift +0 -460
  58. data/Example/Pods/Alamofire/Source/Alamofire.swift +0 -465
  59. data/Example/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift +0 -37
  60. data/Example/Pods/Alamofire/Source/MultipartFormData.swift +0 -580
  61. data/Example/Pods/Alamofire/Source/NetworkReachabilityManager.swift +0 -233
  62. data/Example/Pods/Alamofire/Source/Notifications.swift +0 -55
  63. data/Example/Pods/Alamofire/Source/ParameterEncoding.swift +0 -483
  64. data/Example/Pods/Alamofire/Source/Request.swift +0 -654
  65. data/Example/Pods/Alamofire/Source/Response.swift +0 -567
  66. data/Example/Pods/Alamofire/Source/ResponseSerialization.swift +0 -715
  67. data/Example/Pods/Alamofire/Source/Result.swift +0 -300
  68. data/Example/Pods/Alamofire/Source/ServerTrustPolicy.swift +0 -307
  69. data/Example/Pods/Alamofire/Source/SessionDelegate.swift +0 -725
  70. data/Example/Pods/Alamofire/Source/SessionManager.swift +0 -896
  71. data/Example/Pods/Alamofire/Source/TaskDelegate.swift +0 -466
  72. data/Example/Pods/Alamofire/Source/Timeline.swift +0 -136
  73. data/Example/Pods/Alamofire/Source/Validation.swift +0 -315
  74. data/Example/Pods/Manifest.lock +0 -16
  75. data/Example/Pods/Pods.xcodeproj/project.pbxproj +0 -673
  76. data/Example/Pods/Pods.xcodeproj/xcuserdata/tomas.xcuserdatad/xcschemes/Alamofire.xcscheme +0 -60
  77. data/Example/Pods/Pods.xcodeproj/xcuserdata/tomas.xcuserdatad/xcschemes/Pods-PodBuilderExample.xcscheme +0 -60
  78. data/Example/Pods/Pods.xcodeproj/xcuserdata/tomas.xcuserdatad/xcschemes/xcschememanagement.plist +0 -21
  79. data/Example/Pods/Target Support Files/Alamofire/Alamofire-dummy.m +0 -5
  80. data/Example/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch +0 -12
  81. data/Example/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h +0 -16
  82. data/Example/Pods/Target Support Files/Alamofire/Alamofire.modulemap +0 -6
  83. data/Example/Pods/Target Support Files/Alamofire/Alamofire.xcconfig +0 -9
  84. data/Example/Pods/Target Support Files/Alamofire/Info.plist +0 -26
  85. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Info.plist +0 -26
  86. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample-acknowledgements.markdown +0 -26
  87. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample-acknowledgements.plist +0 -58
  88. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample-dummy.m +0 -5
  89. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample-frameworks.sh +0 -153
  90. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample-resources.sh +0 -118
  91. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample-umbrella.h +0 -16
  92. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample.debug.xcconfig +0 -11
  93. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample.modulemap +0 -6
  94. data/Example/Pods/Target Support Files/Pods-PodBuilderExample/Pods-PodBuilderExample.release.xcconfig +0 -11
  95. data/lib/pod_builder/cocoapods/specification.rb +0 -27
@@ -12,19 +12,19 @@
12
12
 
13
13
  if current_licenses.count > 0
14
14
  licenses_header = current_licenses.shift
15
- raise "Unexpected license found in header" if licenses_header.has_key?("License")
15
+ raise "\n\nUnexpected license found in header".red if licenses_header.has_key?("License")
16
16
  end
17
17
  if current_licenses.count > 0
18
18
  license_footer = current_licenses.pop
19
- raise "Unexpected license found in footer" if license_footer.has_key?("License")
19
+ raise "\n\nUnexpected license found in footer".red if license_footer.has_key?("License")
20
20
  end
21
21
  end
22
22
 
23
23
  if licenses.count > 0
24
24
  licenses_header = licenses.shift
25
- raise "Unexpected license found in header" if licenses_header.has_key?("License")
25
+ raise "\n\nUnexpected license found in header".red if licenses_header.has_key?("License")
26
26
  license_footer = licenses.pop
27
- raise "Unexpected license found in footer" if license_footer.has_key?("License")
27
+ raise "\n\nUnexpected license found in footer".red if license_footer.has_key?("License")
28
28
 
29
29
  lincenses_titles = licenses.map { |x| x["Title"] }
30
30
  current_licenses.select! { |x| !lincenses_titles.include?(x["Title"]) }
@@ -1,13 +1,14 @@
1
+ require 'json'
1
2
  module PodBuilder
2
3
  class Podfile
3
4
  PODBUILDER_LOCK_ACTION = ["raise \"\\n🚨 Do not launch 'pod install' manually, use `pod_builder` instead!\\n\" if !File.exist?('pod_builder.lock')"].freeze
4
- POST_INSTALL_ACTIONS = ["require 'pod_builder/podfile/post_actions'", "PodBuilder::Podfile::remove_target_support_duplicate_entries", "PodBuilder::Podfile::check_target_support_resource_collisions"].freeze
5
+ POST_INSTALL_ACTIONS = ["require 'pod_builder/podfile/post_actions'", "PodBuilder::Podfile::pod_builder_post_process"].freeze
5
6
 
6
7
  PRE_INSTALL_ACTIONS = ["Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_duplicate_framework_and_library_names) {}"].freeze
7
8
  private_constant :PRE_INSTALL_ACTIONS
8
9
 
9
- def self.from_podfile_items(items, analyzer)
10
- raise "no items" unless items.count > 0
10
+ def self.from_podfile_items(items, analyzer, build_configuration)
11
+ raise "\n\nno items".red unless items.count > 0
11
12
 
12
13
  sources = analyzer.sources
13
14
 
@@ -15,14 +16,16 @@ module PodBuilder
15
16
  podfile = File.read("#{cwd}/templates/build_podfile.template")
16
17
 
17
18
  platform = analyzer.instance_variable_get("@result").targets.first.platform
19
+
20
+ install_using_frameworks = analyzer.podfile.root_target_definitions.map(&:uses_frameworks?).uniq.first
21
+ podfile.sub!("%%%use_frameworks%%%", install_using_frameworks ? "use_frameworks!" : "")
22
+
18
23
  podfile.sub!("%%%platform_name%%%", platform.name.to_s)
19
24
  podfile.sub!("%%%deployment_version%%%", platform.deployment_target.version)
20
25
 
21
26
  podfile.sub!("%%%sources%%%", sources.map { |x| "source '#{x.url}'" }.join("\n"))
22
27
 
23
- build_configurations = items.map(&:build_configuration).uniq
24
- raise "Found different build configurations in #{items}" if build_configurations.count != 1
25
- podfile.sub!("%%%build_configuration%%%", build_configurations.first.capitalize)
28
+ podfile.sub!("%%%build_configuration%%%", build_configuration.capitalize)
26
29
 
27
30
  podfile_build_settings = ""
28
31
 
@@ -36,11 +39,24 @@ module PodBuilder
36
39
  # These settings need to be set as is to properly build frameworks
37
40
  build_settings['SWIFT_COMPILATION_MODE'] = 'wholemodule'
38
41
  build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
39
- build_settings['CLANG_ENABLE_MODULE_DEBUGGING'] = "NO" # no drawbacks, see: https://stackoverflow.com/a/36367933/574449
40
42
  build_settings['DEBUG_INFORMATION_FORMAT'] = "dwarf-with-dsym"
41
43
 
44
+ build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = platform.deployment_target.version # Fix compilation warnings on Xcode 12
45
+
46
+ # Don't store .pcm info in binary, see https://forums.swift.org/t/swift-behavior-of-gmodules-and-dsyms/23211/3
47
+ build_settings['CLANG_ENABLE_MODULE_DEBUGGING'] = 'NO'
48
+ build_settings['OTHER_SWIFT_FLAGS'] = "-Xfrontend -no-clang-module-breadcrumbs"
49
+
50
+ # Improve compile speed
51
+ build_settings['COMPILER_INDEX_STORE_ENABLE'] = 'NO'
52
+ build_settings['SWIFT_INDEX_STORE_ENABLE'] = 'NO'
53
+ build_settings['MTL_ENABLE_INDEX_STORE'] = 'NO'
54
+
42
55
  if Configuration.build_system == "Legacy"
43
56
  build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = "NO"
57
+ raise "\n\nCan't enable library evolution support with legacy build system!".red if Configuration.library_evolution_support
58
+ elsif Configuration.library_evolution_support
59
+ build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = "YES"
44
60
  end
45
61
 
46
62
  build_settings['SWIFT_VERSION'] = item_build_settings["SWIFT_VERSION"] || item.swift_version || project_swift_version(analyzer)
@@ -55,7 +71,7 @@ module PodBuilder
55
71
  if x.split("/").first == item.root_name
56
72
  next nil # remove dependency to parent spec
57
73
  end
58
- if overridded_module_name = Configuration.spec_overrides.fetch(x, {})["module_name"]
74
+ if overridded_module_name = Configuration.spec_overrides.fetch(x, {})["module_name"] # this might no longer be needed after
59
75
  next overridded_module_name
60
76
  end
61
77
  }.compact
@@ -104,9 +120,6 @@ module PodBuilder
104
120
  }
105
121
  end
106
122
 
107
- multiple_buildable_items = podfile_items.uniq { |t| t.root_name }
108
- buildable_items = podfile_items.reject { |t| multiple_buildable_items.map(&:root_name).include?(t.root_name) && t.is_external == false }
109
-
110
123
  result_targets = analyzer.instance_variable_get("@result").targets.map(&:name)
111
124
  podfile_content = ["# Autogenerated by PodBuilder (https://github.com/Subito-it/PodBuilder)", "# Please don't modify this file", "\n"]
112
125
  podfile_content += analyzer.podfile.sources.map { |x| "source '#{x}'" }
@@ -132,7 +145,7 @@ module PodBuilder
132
145
 
133
146
  specifications.each do |spec|
134
147
  item = podfile_items.detect { |x| x.name == spec.name }
135
- if buildable_items.map(&:name).include?(spec.name)
148
+ if podfile_items.map(&:name).include?(spec.name)
136
149
  podfile_content.push("\t#{item.entry}")
137
150
  end
138
151
  end
@@ -143,9 +156,16 @@ module PodBuilder
143
156
  File.write(podfile_restore_path, podfile_content.join("\n"))
144
157
  end
145
158
 
146
- def self.write_prebuilt(all_buildable_items, analyzer)
159
+ def self.write_prebuilt(all_buildable_items, analyzer)
160
+ if Configuration.react_native_project
161
+ return write_prebuilt_react_native(all_buildable_items, analyzer)
162
+ end
163
+
147
164
  puts "Updating Application Podfile".yellow
148
165
 
166
+ explicit_deps = analyzer.explicit_pods()
167
+ explicit_deps.map! { |t| all_buildable_items.detect { |x| x.name == t.name } }
168
+ explicit_deps.uniq!
149
169
  podbuilder_podfile_path = PodBuilder::basepath("Podfile")
150
170
  rel_path = Pathname.new(podbuilder_podfile_path).relative_path_from(Pathname.new(PodBuilder::project_path)).to_s
151
171
 
@@ -160,22 +180,33 @@ module PodBuilder
160
180
  next
161
181
  end
162
182
 
163
- if pod_name = pod_definition_in(line, true)
183
+ if pod_name = pod_definition_in(line, true)
164
184
  if podfile_item = all_buildable_items.detect { |x| x.name == pod_name }
165
- if Podspec.include?(podfile_item.name)
166
- if podfile_item.vendored_framework_path.nil?
167
- marker = podfile_item.prebuilt_marker()
168
-
169
- podfile_item_dependency_items = all_buildable_items.select { |x| podfile_item.dependency_names.include?(x.name) && x.vendored_framework_path.nil? == false }
170
- if podfile_item_dependency_items.count > 0
171
- prebuilt_lines += podfile_item_dependency_items.map { |x| "#{line.detect_indentation}#{x.prebuilt_entry(include_pb_entry = false)}#{marker}\n" }.uniq
172
- else
173
- prebuilt_lines.push(line)
174
- end
175
- else
176
- prebuilt_lines.push("#{line.detect_indentation}#{podfile_item.prebuilt_entry}\n")
185
+ marker = podfile_item.prebuilt_marker()
186
+
187
+ non_explicit_dependencies = podfile_item.recursive_dependencies(all_buildable_items) - explicit_deps
188
+ non_explicit_dependencies_root_names = non_explicit_dependencies.map(&:root_name).uniq.filter { |t| t != podfile_item.root_name }
189
+ non_explicit_dependencies = non_explicit_dependencies_root_names.map { |x|
190
+ if item = all_buildable_items.detect { |t| x == t.name }
191
+ item
192
+ else
193
+ item = all_buildable_items.detect { |t| x == t.root_name }
194
+ end
195
+ }.compact
196
+
197
+ non_explicit_dependencies.each do |dep|
198
+ dep_item = all_buildable_items.detect { |x| x.name == dep.name }
199
+
200
+ if File.exist?(dep_item.prebuilt_podspec_path) && !dep_item.is_prebuilt
201
+ pod_name = dep_item.prebuilt_entry(false)
202
+ prebuilt_lines.push("#{line.detect_indentation}#{pod_name}#{marker}\n")
177
203
  end
178
204
 
205
+ explicit_deps.push(dep)
206
+ end
207
+
208
+ if File.exist?(podfile_item.prebuilt_podspec_path) && !podfile_item.is_prebuilt
209
+ prebuilt_lines.push("#{line.detect_indentation}#{podfile_item.prebuilt_entry}\n")
179
210
  next
180
211
  end
181
212
  end
@@ -184,20 +215,45 @@ module PodBuilder
184
215
  prebuilt_lines.push(line)
185
216
  end
186
217
 
218
+ podfile_content = prebuilt_lines.join
219
+
220
+ podfile_content = Podfile.update_path_entries(podfile_content, Podfile.method(:podfile_path_transform))
221
+ podfile_content = Podfile.update_project_entries(podfile_content, Podfile.method(:podfile_path_transform))
222
+ podfile_content = Podfile.update_require_entries(podfile_content, Podfile.method(:podfile_path_transform))
223
+
224
+ podfile_content = add_pre_install_actions(podfile_content)
225
+ podfile_content = add_post_install_checks(podfile_content)
226
+
187
227
  project_podfile_path = PodBuilder::project_path("Podfile")
188
- File.write(project_podfile_path, prebuilt_lines.join)
189
- Podfile.update_path_entires(project_podfile_path, false)
190
- Podfile.update_project_entries(project_podfile_path, false)
228
+ File.write(project_podfile_path, podfile_content)
229
+ end
191
230
 
192
- add_pre_install_actions(project_podfile_path)
193
- add_post_install_checks(project_podfile_path)
231
+ def self.write_prebuilt_react_native(all_buildable_items, analyzer)
232
+ puts "Updating Application Podfile".yellow
233
+
234
+ podbuilder_podfile_path = PodBuilder::basepath("Podfile")
235
+ rel_path = Pathname.new(podbuilder_podfile_path).relative_path_from(Pathname.new(PodBuilder::project_path)).to_s
236
+
237
+ podfile_content = ["# Autogenerated by PodBuilder (https://github.com/Subito-it/PodBuilder)\n", "# Any change to this file should be done on #{rel_path}\n", "\n"].join
238
+ podfile_content += analyzer.podfile.pb_to_s(all_buildable_items)
239
+
240
+ podfile_content = Podfile.update_path_entries(podfile_content, PodfileCP.method(:podfile_path_transform))
241
+ podfile_content = Podfile.update_project_entries(podfile_content, Podfile.method(:podfile_path_transform))
242
+ podfile_content = Podfile.update_require_entries(podfile_content, Podfile.method(:podfile_path_transform))
243
+
244
+ podfile_content = add_pre_install_actions(podfile_content)
245
+ podfile_content = add_post_install_checks(podfile_content)
246
+
247
+ project_podfile_path = PodBuilder::project_path("Podfile")
248
+ File.write(project_podfile_path, podfile_content)
194
249
  end
195
250
 
196
251
  def self.install
197
252
  puts "Running pod install".yellow
198
253
 
199
254
  Dir.chdir(PodBuilder::project_path) do
200
- system("pod install;")
255
+ bundler_prefix = Configuration.use_bundler ? "bundle exec " : ""
256
+ system("#{bundler_prefix}pod install;")
201
257
  end
202
258
  end
203
259
 
@@ -206,10 +262,6 @@ module PodBuilder
206
262
  return stripped_line.gsub("\"", "'").gsub(" ", "").gsub("\t", "").gsub("\n", "")
207
263
  end
208
264
 
209
- def self.add_install_block(podfile_path)
210
- add(PODBUILDER_LOCK_ACTION, "pre_install", podfile_path)
211
- end
212
-
213
265
  def self.pod_definition_in(line, include_commented)
214
266
  stripped_line = strip_line(line)
215
267
  matches = stripped_line.match(/(^pod')(.*?)(')/)
@@ -253,6 +305,8 @@ module PodBuilder
253
305
  return nil
254
306
  end
255
307
 
308
+ puts "Checking Podfile.restore".yellow
309
+
256
310
  podfile_restore_path = PodBuilder::basepath("Podfile.restore")
257
311
  unless File.exist?(podfile_restore_path)
258
312
  return
@@ -293,16 +347,62 @@ module PodBuilder
293
347
 
294
348
  if stripped_line.match(/(pod')(.*?)(')/) != nil
295
349
  starting_def_found = stripped_line.start_with?("def") && (line.match("\s*def\s") != nil)
296
- raise "Unsupported single line def/pod. `def` and `pod` shouldn't be on the same line, please modify the following line:\n#{line}" if starting_def_found
350
+ raise "\n\nUnsupported single line def/pod. `def` and `pod` shouldn't be on the same line, please modify the following line:\n#{line}".red if starting_def_found
351
+ end
352
+ end
353
+ end
354
+
355
+ def self.resolve_pod_names(names, all_buildable_items)
356
+ resolved_names = []
357
+
358
+ names.each do |name|
359
+ if item = all_buildable_items.detect { |t| t.root_name.downcase == name.downcase }
360
+ resolved_names.push(item.root_name)
361
+ end
362
+ end
363
+
364
+ return resolved_names.uniq
365
+ end
366
+
367
+ def self.resolve_pod_names_from_podfile(names)
368
+ resolved_names = []
369
+
370
+ # resolve potentially wrong pod name case
371
+ podfile_path = PodBuilder::basepath("Podfile")
372
+ content = File.read(podfile_path)
373
+
374
+ current_section = ""
375
+ content.each_line do |line|
376
+ matches = line.gsub("\"", "'").match(/pod '(.*?)'/)
377
+ if matches&.size == 2
378
+ if resolved_name = names.detect { |t| matches[1].split("/").first.downcase == t.downcase }
379
+ resolved_names.push(matches[1].split("/").first)
380
+ end
297
381
  end
298
382
  end
383
+
384
+ resolved_names.uniq
299
385
  end
300
386
 
301
387
  private
302
388
 
303
- def self.indentation_from_file(path)
304
- content = File.read(path)
389
+ def self.podfile_path_transform(path)
390
+ use_absolute_paths = false
391
+ podfile_path = PodBuilder::project_path("Podfile")
392
+ original_basepath = PodBuilder::basepath
393
+
394
+ podfile_base_path = Pathname.new(File.dirname(podfile_path))
305
395
 
396
+ original_path = Pathname.new(File.join(original_basepath, path))
397
+ replace_path = original_path.relative_path_from(podfile_base_path)
398
+ if use_absolute_paths
399
+ replace_path = replace_path.expand_path(podfile_base_path)
400
+ end
401
+
402
+ return replace_path
403
+ end
404
+
405
+ def self.indentation_from_string(content)
306
406
  lines = content.split("\n").select { |x| !x.empty? }
307
407
 
308
408
  if lines.count > 2
@@ -323,13 +423,13 @@ module PodBuilder
323
423
  def self.project_swift_version(analyzer)
324
424
  swift_versions = analyzer.instance_variable_get("@result").targets.map { |x| x.target_definition.swift_version }.compact.uniq
325
425
 
326
- raise "Found different Swift versions in targets. Expecting one, got `#{swift_versions}`" if swift_versions.count > 1
426
+ raise "\n\nFound different Swift versions in targets. Expecting one, got `#{swift_versions}`".red if swift_versions.count > 1
327
427
 
328
428
  return swift_versions.first || PodBuilder::system_swift_version
329
429
  end
330
430
 
331
431
  def self.podfile_items_at(podfile_path, include_prebuilt = false)
332
- raise "Expecting basepath folder!" if !File.exist?(PodBuilder::basepath("Podfile"))
432
+ raise "\n\nExpecting basepath folder!".red if !File.exist?(PodBuilder::basepath("Podfile"))
333
433
 
334
434
  if File.basename(podfile_path) != "Podfile"
335
435
  File.rename(PodBuilder::basepath("Podfile"), PodBuilder::basepath("Podfile.tmp"))
@@ -358,18 +458,20 @@ module PodBuilder
358
458
  return buildable_items
359
459
  end
360
460
 
361
- def self.add_pre_install_actions(podfile_path)
362
- add(PRE_INSTALL_ACTIONS + [" "], "pre_install", podfile_path)
461
+ def self.add_install_block(podfile_content)
462
+ return add(PODBUILDER_LOCK_ACTION, "pre_install", podfile_content)
363
463
  end
364
464
 
365
- def self.add_post_install_checks(podfile_path)
366
- add(POST_INSTALL_ACTIONS + [" "], "post_install", podfile_path)
465
+ def self.add_pre_install_actions(podfile_content)
466
+ return add(PRE_INSTALL_ACTIONS + [" "], "pre_install", podfile_content)
367
467
  end
368
468
 
369
- def self.add(entries, marker, podfile_path)
370
- podfile_content = File.read(podfile_path)
469
+ def self.add_post_install_checks(podfile_content)
470
+ return add(POST_INSTALL_ACTIONS + [" "], "post_install", podfile_content)
471
+ end
371
472
 
372
- file_indentation = indentation_from_file(podfile_path)
473
+ def self.add(entries, marker, podfile_content)
474
+ file_indentation = indentation_from_string(podfile_content)
373
475
 
374
476
  entries = entries.map { |x| "#{file_indentation}#{x}\n"}
375
477
 
@@ -386,55 +488,48 @@ module PodBuilder
386
488
  end
387
489
 
388
490
  if !marker_found
491
+ if podfile_lines.last.strip.length > 0
492
+ podfile_lines.push("\n")
493
+ end
389
494
  podfile_lines.push("\n#{marker} do |installer|\n")
390
495
  podfile_lines.push(entries)
391
496
  podfile_lines.push("end\n")
392
497
  end
393
498
 
394
- File.write(podfile_path, podfile_lines.join)
499
+ return podfile_lines.join
395
500
  end
396
501
 
397
- def self.update_path_entires(podfile_path, use_absolute_paths = false, path_base = PodBuilder::basepath(""))
398
- podfile_content = File.read(podfile_path)
399
-
400
- base_path = Pathname.new(File.dirname(podfile_path))
401
- regex = "(\s*pod\s*['|\"])(.*?)(['|\"])(.*?)(:path\s*=>\s*['|\"])(.*?)(['|\"])"
502
+ def self.update_path_entries(podfile_content, path_transform)
503
+ regex = "(\s*pod\s*['|\"])(.*?)(['|\"])(.*?):(path|podspec)(\s*=>\s*['|\"])(.*?)(['|\"])"
402
504
 
403
505
  podfile_lines = []
404
506
  podfile_content.each_line do |line|
405
507
  stripped_line = strip_line(line)
406
508
  matches = line.match(/#{regex}/)
407
509
 
408
- if matches&.size == 8 && !stripped_line.start_with?("#")
510
+ if matches&.size == 9 && !stripped_line.start_with?("#")
409
511
  pod_name = matches[2]
410
- path = matches[6]
512
+ path = matches[7]
411
513
 
412
514
  is_absolute = ["~", "/"].include?(path[0])
413
- unless !pod_name.start_with?("PodBuilder/") && !is_absolute
515
+ unless !PodBuilder::prebuiltpath.end_with?(path) && !is_absolute
414
516
  podfile_lines.push(line)
415
517
  next
416
518
  end
417
519
 
418
- original_path = Pathname.new(File.join(path_base, path))
419
- replace_path = original_path.relative_path_from(base_path)
420
- if use_absolute_paths
421
- replace_path = replace_path.expand_path(base_path)
422
- end
520
+ replace_path = path_transform.call(path)
423
521
 
424
- updated_path_line = line.gsub(/#{regex}/, '\1\2\3\4\5' + replace_path.to_s + '\7\8')
522
+ updated_path_line = line.gsub(/#{regex}/, '\1\2\3\4:\5\6' + replace_path.to_s + '\8\9')
425
523
  podfile_lines.push(updated_path_line)
426
524
  else
427
525
  podfile_lines.push(line)
428
526
  end
429
527
  end
430
528
 
431
- File.write(podfile_path, podfile_lines.join)
529
+ return podfile_lines.join
432
530
  end
433
531
 
434
- def self.update_project_entries(podfile_path, use_absolute_paths = false, path_base = PodBuilder::basepath(""))
435
- podfile_content = File.read(podfile_path)
436
-
437
- base_path = Pathname.new(File.dirname(podfile_path))
532
+ def self.update_project_entries(podfile_content, path_transform)
438
533
  regex = "(\s*project\s*['|\"])(.*?)(['|\"])"
439
534
 
440
535
  podfile_lines = []
@@ -451,11 +546,36 @@ module PodBuilder
451
546
  next
452
547
  end
453
548
 
454
- original_path = Pathname.new(File.join(path_base, path))
455
- replace_path = original_path.relative_path_from(base_path)
456
- if use_absolute_paths
457
- replace_path = replace_path.expand_path(base_path)
549
+ replace_path = path_transform.call(path)
550
+
551
+ updated_path_line = line.gsub(/#{regex}/, '\1' + replace_path.to_s + '\3\4')
552
+ podfile_lines.push(updated_path_line)
553
+ else
554
+ podfile_lines.push(line)
555
+ end
556
+ end
557
+
558
+ return podfile_lines.join
559
+ end
560
+
561
+ def self.update_require_entries(podfile_content, path_transform)
562
+ regex = "(\s*require_relative\s*['|\"])(.*?)(['|\"])"
563
+
564
+ podfile_lines = []
565
+ podfile_content.each_line do |line|
566
+ stripped_line = strip_line(line)
567
+ matches = line.match(/#{regex}/)
568
+
569
+ if matches&.size == 4 && !stripped_line.start_with?("#")
570
+ path = matches[2]
571
+
572
+ is_absolute = ["~", "/"].include?(path[0])
573
+ unless !is_absolute
574
+ podfile_lines.push(line)
575
+ next
458
576
  end
577
+
578
+ replace_path = path_transform.call(path)
459
579
 
460
580
  updated_path_line = line.gsub(/#{regex}/, '\1' + replace_path.to_s + '\3\4')
461
581
  podfile_lines.push(updated_path_line)
@@ -464,7 +584,97 @@ module PodBuilder
464
584
  end
465
585
  end
466
586
 
467
- File.write(podfile_path, podfile_lines.join)
587
+ return podfile_lines.join
588
+ end
589
+
590
+ def self.prepare_for_react_native_write_pb_configuration(podfile_content)
591
+ base = File.expand_path(File.join(PodBuilder::project_path, ".."))
592
+ bin_js = Dir.glob("#{base}/node_modules/@react-native-community/cli/build/bin.js")
593
+
594
+ raise "\n\nReact native cli bin_js not found!".red unless bin_js.count == 1
595
+ bin_js = bin_js.first
596
+
597
+ config_dest_path = PodBuilder::basepath("rn_config.json")
598
+
599
+ raise "\n\nFailed generating react native configuration file".red unless system("node '#{bin_js}' config > #{config_dest_path}")
600
+
601
+ content = File.read(config_dest_path)
602
+
603
+ content.gsub!(PodBuilder::project_path, "..")
604
+ content.gsub!(File.expand_path(PodBuilder::project_path("..")), "../..")
605
+
606
+ json = JSON.parse(content)
607
+ begin
608
+ json["project"]["ios"]["sourceDir"] = "./"
609
+ json["project"]["ios"]["podfile"] = "./"
610
+ rescue => exception
611
+ raise "\n\nFailed updating react native configuration json".red
612
+ end
613
+
614
+ File.write(config_dest_path, JSON.pretty_generate(json))
615
+
616
+ return "rn_config = JSON.load(File.read(\"rn_config.json\")) # pb added\n\n" + podfile_content
617
+ end
618
+
619
+ def self.prepare_for_react_native_rn_pods_file(podfile_content)
620
+ lines = []
621
+ podfile_content.each_line do |line|
622
+ if line.include?("use_react_native!")
623
+ matches = line.match(/(\s*)/)
624
+ unless matches&.size == 2
625
+ return podfile_content
626
+ end
627
+
628
+ indentation = matches[1]
629
+ lines.push("#{indentation}use_react_native!(:path => rn_config[\"reactNativePath\"]) # pb added\n")
630
+ lines.push("#{indentation}# #{line.strip} # pb removed\n")
631
+ else
632
+ lines.push(line)
633
+ end
634
+ end
635
+
636
+ return lines.join
637
+ end
638
+
639
+ def self.prepare_for_react_native_native_modules_file(podfile_content)
640
+ lines = []
641
+ podfile_content.each_line do |line|
642
+ if line.include?("use_native_modules!")
643
+ matches = line.match(/(\s*)/)
644
+ unless matches&.size == 2
645
+ return podfile_content
646
+ end
647
+
648
+ indentation = matches[1]
649
+ lines.push("#{indentation}use_native_modules!(rn_config) # pb added\n")
650
+ lines.push("#{indentation}# #{line.strip} # pb removed\n")
651
+ else
652
+ lines.push(line)
653
+ end
654
+ end
655
+
656
+ return lines.join
657
+ end
658
+
659
+ def self.prepare_for_react_native(podfile_content)
660
+ original_podfile_content = podfile_content.dup
661
+
662
+ podfile_content = prepare_for_react_native_write_pb_configuration(podfile_content)
663
+ content = prepare_for_react_native_rn_pods_file(podfile_content)
664
+ if content == podfile_content
665
+ return original_podfile_content
666
+ end
667
+ podfile_content = content
668
+ content = prepare_for_react_native_native_modules_file(podfile_content)
669
+ if content == podfile_content
670
+ return original_podfile_content
671
+ end
672
+ podfile_content = content
673
+
674
+ Configuration.build_using_repo_paths = true
675
+ Configuration.react_native_project = true
676
+
677
+ return podfile_content
468
678
  end
469
679
  end
470
680
  end