pod-builder 5.1.1 → 5.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
- require 'digest'
2
- require 'colored'
3
- require 'highline/import'
4
- require 'pod_builder/core'
1
+ require "digest"
2
+ require "colored"
3
+ require "highline/import"
4
+ require "pod_builder/core"
5
5
 
6
6
  module PodBuilder
7
7
  class InstallResult
@@ -18,7 +18,7 @@ module PodBuilder
18
18
  @prebuilt_info = prebuilt_info
19
19
  end
20
20
 
21
- def +(obj)
21
+ def +(obj)
22
22
  merged_licenses = @licenses.dup + obj.licenses
23
23
  merged_prebuilt_info = @prebuilt_info.dup
24
24
 
@@ -32,7 +32,7 @@ module PodBuilder
32
32
 
33
33
  merged_prebuilt_info = obj.prebuilt_info.merge(merged_prebuilt_info)
34
34
 
35
- return InstallResult.new(merged_licenses, merged_prebuilt_info)
35
+ return InstallResult.new(merged_licenses, merged_prebuilt_info)
36
36
  end
37
37
 
38
38
  def write_prebuilt_info_files
@@ -45,10 +45,10 @@ module PodBuilder
45
45
  class Install
46
46
  # This method will generate prebuilt data by building from "/tmp/pod_builder/Podfile"
47
47
  def self.podfile(podfile_content, podfile_items, argument_pods, build_configuration)
48
- puts "Preparing build Podfile".yellow
49
-
48
+ puts "Preparing build Podfile".yellow
49
+
50
50
  podfile_content = copy_development_pods_source_code(podfile_content, podfile_items)
51
-
51
+
52
52
  podfile_content = Podfile.update_path_entries(podfile_content, Install.method(:podfile_path_transform))
53
53
  podfile_content = Podfile.update_project_entries(podfile_content, Install.method(:podfile_path_transform))
54
54
  podfile_content = Podfile.update_require_entries(podfile_content, Install.method(:podfile_path_transform))
@@ -56,79 +56,79 @@ module PodBuilder
56
56
  if Configuration.react_native_project
57
57
  podfile_content = Podfile.prepare_react_native_compilation_workarounds(podfile_content)
58
58
  end
59
-
59
+
60
60
  podfile_path = File.join(Configuration.build_path, "Podfile")
61
61
  File.write(podfile_path, podfile_content)
62
-
63
- begin
62
+
63
+ begin
64
64
  lock_file = "#{Configuration.build_path}/pod_builder.lock"
65
65
  FileUtils.touch(lock_file)
66
-
66
+
67
67
  prebuilt_entries = use_prebuilt_entries_for_unchanged_pods(podfile_path, podfile_items, argument_pods)
68
-
68
+
69
69
  install
70
-
71
- copy_prebuilt_items(podfile_items - prebuilt_entries)
70
+
71
+ copy_prebuilt_items(podfile_items - prebuilt_entries)
72
72
 
73
73
  prebuilt_info = prebuilt_info(podfile_items)
74
74
  licenses = license_specifiers()
75
-
75
+
76
76
  if !OPTIONS.has_key?(:debug)
77
77
  PodBuilder::safe_rm_rf(Configuration.build_path)
78
- end
79
-
78
+ end
79
+
80
80
  return InstallResult.new(licenses, prebuilt_info)
81
81
  rescue Exception => e
82
82
  if File.directory?("#{Configuration.build_path}/Pods/Pods.xcodeproj")
83
83
  activate_pod_scheme()
84
84
 
85
85
  if ENV["DEBUGGING"]
86
- system("xed #{Configuration.build_path}/Pods")
86
+ system("xed #{Configuration.build_path}/Pods")
87
87
  elsif !OPTIONS.has_key?(:no_stdin_available)
88
88
  confirm = ask("\n\nOh no! Something went wrong during prebuild phase! Do you want to open the prebuild project to debug the error, you will need to add and run the Pods-Dummy scheme? [Y/N] ".red) { |yn| yn.limit = 1, yn.validate = /[yn]/i }
89
89
 
90
- if confirm.downcase == 'y'
91
- system("xed #{Configuration.build_path}/Pods")
90
+ if confirm.downcase == "y"
91
+ system("xed #{Configuration.build_path}/Pods")
92
92
  end
93
93
  end
94
94
  end
95
-
95
+
96
96
  raise e
97
- ensure
97
+ ensure
98
98
  FileUtils.rm(lock_file) if File.exist?(lock_file)
99
99
  end
100
100
  end
101
101
 
102
102
  def self.prebuilt_info(podfile_items)
103
103
  gitignored_files = PodBuilder::gitignoredfiles
104
-
104
+
105
105
  swift_version = PodBuilder::system_swift_version
106
-
106
+
107
107
  ret = Hash.new
108
108
  root_names = podfile_items.reject(&:is_prebuilt).map(&:root_name).uniq
109
- root_names.each do |prebuilt_name|
109
+ root_names.each do |prebuilt_name|
110
110
  path = PodBuilder::prebuiltpath(prebuilt_name)
111
-
111
+
112
112
  unless File.directory?(path)
113
113
  puts "Prebuilt items for #{prebuilt_name} not found".blue
114
114
  next
115
115
  end
116
-
116
+
117
117
  unless podfile_item = podfile_items.detect { |t| t.name == prebuilt_name } || podfile_items.detect { |t| t.root_name == prebuilt_name }
118
118
  puts "Prebuilt items for #{prebuilt_name} not found #2".blue
119
119
  next
120
120
  end
121
-
121
+
122
122
  podbuilder_file = File.join(path, Configuration.prebuilt_info_filename)
123
123
  entry = podfile_item.entry(true, false)
124
-
124
+
125
125
  data = {}
126
126
  data["entry"] = entry
127
- data["is_prebuilt"] = podfile_item.is_prebuilt
127
+ data["is_prebuilt"] = podfile_item.is_prebuilt
128
128
  if Dir.glob(File.join(path, "#{podfile_item.prebuilt_rel_path}/Headers/*-Swift.h")).count > 0
129
129
  data["swift_version"] = swift_version
130
130
  end
131
-
131
+
132
132
  specs = podfile_items.select { |x| x.root_name == podfile_item.root_name }
133
133
  subspecs_deps = specs.map(&:dependency_names).flatten
134
134
  subspec_self_deps = subspecs_deps.select { |x| x.start_with?("#{prebuilt_name}/") }
@@ -138,54 +138,54 @@ module PodBuilder
138
138
  if hash = build_folder_hash(podfile_item, gitignored_files)
139
139
  data["build_folder_hash"] = hash
140
140
  end
141
-
141
+
142
142
  ret.merge!({ podbuilder_file => data })
143
143
  end
144
144
 
145
145
  return ret
146
146
  end
147
-
148
- private
149
-
147
+
148
+ private
149
+
150
150
  def self.license_specifiers
151
151
  acknowledge_file = "#{Configuration.build_path}/Pods/Target Support Files/Pods-DummyTarget/Pods-DummyTarget-acknowledgements.plist"
152
152
  unless File.exist?(acknowledge_file)
153
153
  raise "\n\nLicense file not found\n".red
154
154
  end
155
-
155
+
156
156
  plist = CFPropertyList::List.new(:file => acknowledge_file)
157
157
  data = CFPropertyList.native_types(plist.value)
158
-
158
+
159
159
  return data["PreferenceSpecifiers"] || []
160
160
  end
161
-
162
- def self.copy_development_pods_source_code(podfile_content, podfile_items)
161
+
162
+ def self.copy_development_pods_source_code(podfile_content, podfile_items)
163
163
  # Development pods are normally built/integrated without moving files from their original paths.
164
- # It is important that CocoaPods compiles the files under Configuration.build_path in order that
165
- # DWARF debug info reference to this constant path. Doing otherwise breaks the assumptions that
164
+ # It is important that CocoaPods compiles the files under Configuration.build_path in order that
165
+ # DWARF debug info reference to this constant path. Doing otherwise breaks the assumptions that
166
166
  # makes the `generate_lldbinit` command work.
167
- development_pods = podfile_items.select { |x| x.is_development_pod }
167
+ development_pods = podfile_items.select { |x| x.is_development_pod }
168
168
  development_pods.each do |podfile_item|
169
169
  destination_path = "#{Configuration.build_path}/Pods/#{podfile_item.name}"
170
170
  FileUtils.mkdir_p(destination_path)
171
-
171
+
172
172
  if Pathname.new(podfile_item.path).absolute?
173
173
  FileUtils.cp_r("#{podfile_item.path}/.", destination_path)
174
- else
174
+ else
175
175
  FileUtils.cp_r("#{PodBuilder::basepath(podfile_item.path)}/.", destination_path)
176
176
  end
177
-
177
+
178
178
  unless Configuration.build_using_repo_paths
179
179
  podfile_content.gsub!("'#{podfile_item.path}'", "'#{destination_path}'")
180
180
  end
181
181
  end
182
-
182
+
183
183
  return podfile_content
184
184
  end
185
-
185
+
186
186
  def self.use_prebuilt_entries_for_unchanged_pods(podfile_path, podfile_items, argument_pods)
187
187
  podfile_content = File.read(podfile_path)
188
-
188
+
189
189
  replaced_items = []
190
190
 
191
191
  download # Copy files under #{Configuration.build_path}/Pods so that we can determine build folder hashes
@@ -216,14 +216,14 @@ module PodBuilder
216
216
 
217
217
  items -= rebuild_pods
218
218
  end
219
-
219
+
220
220
  items.each do |item|
221
221
  podspec_path = item.prebuilt_podspec_path
222
222
  unless last_build_folder_hash = build_folder_hash_in_prebuilt_info_file(item)
223
223
  prebuild_log.call(item, "(folder hash missing)")
224
224
  next
225
225
  end
226
-
226
+
227
227
  if last_build_folder_hash == build_folder_hash(item, gitignored_files)
228
228
  puts "#{item.root_name} reuse PodBuilder cache"
229
229
 
@@ -248,35 +248,35 @@ module PodBuilder
248
248
 
249
249
  return replaced_items
250
250
  end
251
-
251
+
252
252
  def self.install
253
253
  puts "Preparing build".yellow
254
-
254
+
255
255
  CLAide::Command::PluginManager.load_plugins("cocoapods")
256
-
256
+
257
257
  Dir.chdir(Configuration.build_path) do
258
258
  config = Pod::Config.new()
259
259
  installer = Pod::Installer.new(config.sandbox, config.podfile, config.lockfile)
260
260
  installer.repo_update = false
261
261
  installer.update = false
262
-
262
+
263
263
  install_start_time = Time.now
264
264
 
265
- installer.install!
265
+ installer.install!
266
266
  install_time = Time.now - install_start_time
267
-
267
+
268
268
  puts "Build completed in #{install_time.to_i} seconds".blue
269
269
  end
270
270
  end
271
-
271
+
272
272
  def self.download
273
273
  puts "Downloading Pods source code".yellow
274
-
274
+
275
275
  CLAide::Command::PluginManager.load_plugins("cocoapods")
276
-
276
+
277
277
  Dir.chdir(Configuration.build_path) do
278
278
  Pod::UserInterface::config.silent = true
279
-
279
+
280
280
  config = Pod::Config.new()
281
281
  installer = Pod::Installer.new(config.sandbox, config.podfile, config.lockfile)
282
282
  installer.repo_update = false
@@ -284,11 +284,11 @@ module PodBuilder
284
284
  installer.prepare
285
285
  installer.resolve_dependencies
286
286
  installer.download_dependencies
287
-
287
+
288
288
  Pod::UserInterface::config.silent = false
289
289
  end
290
290
  end
291
-
291
+
292
292
  def self.copy_prebuilt_items(podfile_items)
293
293
  FileUtils.mkdir_p(PodBuilder::prebuiltpath)
294
294
 
@@ -297,9 +297,9 @@ module PodBuilder
297
297
  non_prebuilt_items.reject! { |item|
298
298
  [item.module_name, item.root_name]
299
299
  .map { |t| PodBuilder::buildpath_prebuiltpath(t) }
300
- .select { |t| File.directory?(t) }
300
+ .select { |t| File.directory?(t) }
301
301
  .all? { |t| Dir.empty?(t) } # When using prebuilt items we end up with empty folders
302
- }
302
+ }
303
303
 
304
304
  non_prebuilt_items.each do |item|
305
305
  # Remove existing files
@@ -316,16 +316,18 @@ module PodBuilder
316
316
  next
317
317
  end
318
318
 
319
- if podfile_item = podfile_items.detect { |t| t.root_name == item.root_name }
320
- if Dir.glob("#{source_path}/**/Modules/**/*.swiftmodule/*.swiftinterface").count > 0
321
- # We can safely remove .swiftmodule if .swiftinterface exists
322
- swiftmodule_files = Dir.glob("#{source_path}/**/Modules/**/*.swiftmodule/*.swiftmodule")
323
- swiftmodule_files.each { |t| PodBuilder::safe_rm_rf(t) }
319
+ unless Configuration.keep_swiftmodules
320
+ if podfile_item = podfile_items.detect { |t| t.root_name == item.root_name }
321
+ if Dir.glob("#{source_path}/**/Modules/**/*.swiftmodule/*.swiftinterface").count > 0
322
+ # We can safely remove .swiftmodule if .swiftinterface exists
323
+ swiftmodule_files = Dir.glob("#{source_path}/**/Modules/**/*.swiftmodule/*.swiftmodule")
324
+ swiftmodule_files.each { |t| PodBuilder::safe_rm_rf(t) }
325
+ end
324
326
  end
325
327
  end
326
328
 
327
329
  # Cleanup unneeded files (see https://github.com/bazelbuild/rules_apple/pull/1113)
328
- ignore_files = Dir.glob(["#{source_path}/**/Modules/**/*.swiftmodule/*.swiftdoc", "#{source_path}/**/Modules/**/*.swiftmodule/**/*.swiftsourceinfo"])
330
+ ignore_files = Dir.glob("#{source_path}/**/Modules/**/*.swiftmodule/*.{swiftdoc,swiftsourceinfo,private.swiftinterface}")
329
331
  ignore_files.each { |t| PodBuilder::safe_rm_rf(t) }
330
332
 
331
333
  project_folder = Dir.glob("#{source_path}/**/Modules/**/*.swiftmodule/Project")
@@ -334,36 +336,36 @@ module PodBuilder
334
336
  unless Dir.glob("#{source_path}/**/*").select { |t| File.file?(t) }.empty?
335
337
  destination_folder = PodBuilder::prebuiltpath(item.root_name)
336
338
  FileUtils.mkdir_p(destination_folder)
337
- FileUtils.cp_r("#{source_path}/.", destination_folder)
339
+ FileUtils.cp_r("#{source_path}/.", destination_folder)
338
340
  end
339
341
  end
340
-
342
+
341
343
  # Folder won't exist if no dSYM were generated (all static libs)
342
344
  if File.directory?(PodBuilder::buildpath_dsympath)
343
345
  FileUtils.mkdir_p(PodBuilder::dsympath)
344
346
  FileUtils.cp_r(PodBuilder::buildpath_dsympath, PodBuilder::basepath)
345
347
  end
346
348
  end
347
-
349
+
348
350
  def self.build_folder_hash_in_prebuilt_info_file(podfile_item)
349
351
  prebuilt_info_path = PodBuilder::prebuiltpath(File.join(podfile_item.root_name, Configuration.prebuilt_info_filename))
350
-
352
+
351
353
  if File.exist?(prebuilt_info_path)
352
354
  data = JSON.parse(File.read(prebuilt_info_path))
353
- return data['build_folder_hash']
355
+ return data["build_folder_hash"]
354
356
  else
355
357
  return nil
356
358
  end
357
359
  end
358
-
360
+
359
361
  def self.build_folder_hash(podfile_item, exclude_files)
360
362
  if podfile_item.is_development_pod
361
363
  if Pathname.new(podfile_item.path).absolute?
362
364
  item_path = podfile_item.path
363
- else
365
+ else
364
366
  item_path = PodBuilder::basepath(podfile_item.path)
365
367
  end
366
-
368
+
367
369
  rootpath = PodBuilder::git_rootpath
368
370
  file_hashes = []
369
371
  Dir.glob("#{item_path}/**/*", File::FNM_DOTMATCH) do |path|
@@ -378,7 +380,7 @@ module PodBuilder
378
380
  file_hashes.push(Digest::MD5.hexdigest(File.read(path)))
379
381
  end
380
382
  end
381
-
383
+
382
384
  return Digest::MD5.hexdigest(file_hashes.sort.join)
383
385
  else
384
386
  # Pod folder might be under .gitignore
@@ -390,7 +392,7 @@ module PodBuilder
390
392
  end
391
393
  end
392
394
  end
393
-
395
+
394
396
  def self.podfile_path_transform(path)
395
397
  if Configuration.build_using_repo_paths
396
398
  return File.expand_path(PodBuilder::basepath(path))
@@ -398,18 +400,18 @@ module PodBuilder
398
400
  use_absolute_paths = true
399
401
  podfile_path = File.join(Configuration.build_path, "Podfile")
400
402
  original_basepath = PodBuilder::basepath
401
-
403
+
402
404
  podfile_base_path = Pathname.new(File.dirname(podfile_path))
403
-
405
+
404
406
  original_path = Pathname.new(File.join(original_basepath, path))
405
407
  replace_path = original_path.relative_path_from(podfile_base_path)
406
408
  if use_absolute_paths
407
409
  replace_path = replace_path.expand_path(podfile_base_path)
408
410
  end
409
-
411
+
410
412
  return replace_path
411
413
  end
412
- end
414
+ end
413
415
 
414
416
  def self.activate_pod_scheme
415
417
  if scheme_file = Dir.glob("#{Configuration.build_path}/Pods/**/xcschememanagement.plist").first
@@ -421,18 +423,18 @@ module PodBuilder
421
423
  end
422
424
 
423
425
  plist.value = CFPropertyList.guess(data)
424
- plist.save(scheme_file, CFPropertyList::List::FORMAT_BINARY)
426
+ plist.save(scheme_file, CFPropertyList::List::FORMAT_BINARY)
425
427
  end
426
428
  end
427
429
  end
428
430
  end
429
431
 
430
432
  # CocoaPods seems to hard code the development language to english
431
- # By monkey patching the project save we make sure that the to manually rewrite the
433
+ # By monkey patching the project save we make sure that the to manually rewrite the
432
434
  # development language if it has been manually specified in PodBuilder's configuration
433
435
  class Xcodeproj::Project
434
436
  alias_method :swz_save, :save
435
-
437
+
436
438
  def save(save_path = nil)
437
439
  if development_language = PodBuilder::Configuration.development_language
438
440
  root_object.development_region = development_language
@@ -440,4 +442,4 @@ class Xcodeproj::Project
440
442
 
441
443
  swz_save(save_path)
442
444
  end
443
- end
445
+ end