From 2ac5934680a5416343bf91df50f179d2430e4d26 Mon Sep 17 00:00:00 2001 From: Sebastian Shanus Date: Thu, 29 Nov 2018 20:44:15 -0800 Subject: [PATCH] Update call to generate deterministic UUIDs. Instead of calling `predictabilize` on each individual project, we will pass in the list of generated projects such that UUIDs are unique across all projects instead of unique per individual xcode project. --- Gemfile.lock | 2 +- lib/cocoapods/installer.rb | 23 +++---- .../pods_project_writer.rb | 62 ++++++++++++------- spec/cocoapods-integration-specs | 2 +- .../multi_pods_project_generator_spec.rb | 38 +++++------- .../single_pods_project_generator_spec.rb | 4 +- 6 files changed, 68 insertions(+), 63 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index caefb34953..6f24ed0362 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,7 +31,7 @@ GIT GIT remote: https://github.com/CocoaPods/Xcodeproj.git - revision: e0287156d426ba588c9234bb2a4c824149889860 + revision: ac6493bb51448059a2f13fcf7c0fa8708420c7a3 branch: master specs: xcodeproj (1.7.0) diff --git a/lib/cocoapods/installer.rb b/lib/cocoapods/installer.rb index 327503d695..38d8824ed1 100644 --- a/lib/cocoapods/installer.rb +++ b/lib/cocoapods/installer.rb @@ -216,23 +216,18 @@ def generate_pods_project(generator = create_generator(installation_options.gene @pod_target_subprojects = pod_project_generation_result.projects_by_pod_targets.keys projects_by_pod_targets = pod_project_generation_result.projects_by_pod_targets run_podfile_post_install_hooks - pods_project_writer = Xcode::PodsProjectWriter.new(sandbox, pods_project, - target_installation_results.pod_target_installation_results, - installation_options) - pods_project_writer.write! - projects_by_pod_targets.each do |project, pod_targets| - pod_target_project_writer = Xcode::PodsProjectWriter.new(sandbox, project, - target_installation_results.pod_target_installation_results, - installation_options) - pod_target_project_writer.write! + + generated_projects = [pods_project] + pod_target_subprojects + projects_writer = Xcode::PodsProjectWriter.new(sandbox, generated_projects, + target_installation_results.pod_target_installation_results, installation_options) + projects_writer.write! + + pods_project_pod_targets = pod_targets - projects_by_pod_targets.values.flatten + all_projects_by_pod_targets = { pods_project => pods_project_pod_targets }.merge(projects_by_pod_targets) + all_projects_by_pod_targets.each do |project, pod_targets| generator.share_development_pod_schemes(project, development_pod_targets(pod_targets)) end - # Share the remaining pod targets. Generally this will be none for when `generate_multiple_pod_projects` is set to true - # and all pod_targets when set to false. - remaining_development_pods = development_pod_targets(pod_targets - projects_by_pod_targets.values.flatten) - generator.share_development_pod_schemes(pods_project, remaining_development_pods) - write_lockfiles end end diff --git a/lib/cocoapods/installer/xcode/pods_project_generator/pods_project_writer.rb b/lib/cocoapods/installer/xcode/pods_project_generator/pods_project_writer.rb index d8caf99431..eab315ebda 100644 --- a/lib/cocoapods/installer/xcode/pods_project_generator/pods_project_writer.rb +++ b/lib/cocoapods/installer/xcode/pods_project_generator/pods_project_writer.rb @@ -9,10 +9,10 @@ class PodsProjectWriter # attr_reader :sandbox - # @return [Project] project - # The project to save. + # @return [Array] projects + # The list project to write. # - attr_reader :project + attr_reader :projects # @return [Hash] pod_target_installation_results # Hash of pod target name to installation results. @@ -26,39 +26,53 @@ class PodsProjectWriter # Initialize a new instance # # @param [Sandbox] sandbox @see #sandbox - # @param [Project] project @see #project + # @param [Project] projects @see #project # @param [Hash] pod_target_installation_results @see #pod_target_installation_results # @param [InstallationOptions] installation_options @see #installation_options # - def initialize(sandbox, project, pod_target_installation_results, installation_options) + def initialize(sandbox, projects, pod_target_installation_results, installation_options) @sandbox = sandbox - @project = project + @projects = projects @pod_target_installation_results = pod_target_installation_results @installation_options = installation_options end def write! - UI.message "- Writing Xcode project file to #{UI.path project.path}" do + cleanup_projects(projects) + + if installation_options.deterministic_uuids? + UI.message('- Generating deterministic UUIDs') { Xcodeproj::Project.predictabilize_uuids(projects) } + end + + projects.each do |project| + UI.message "- Writing Xcode project file to #{UI.path project.path}" do + library_product_types = [:framework, :dynamic_library, :static_library] + results_by_native_target = Hash[pod_target_installation_results.map do |_, result| + [result.native_target, result] + end] + project.recreate_user_schemes(false) do |scheme, target| + next unless target.respond_to?(:symbol_type) + next unless library_product_types.include? target.symbol_type + installation_result = results_by_native_target[target] + next unless installation_result + installation_result.test_native_targets.each do |test_native_target| + scheme.add_test_target(test_native_target) + end + end + project.save + end + end + end + + private + + # Cleans up projects before writing. + # + def cleanup_projects(projects) + projects.each do |project| [project.pods, project.support_files_group, project.development_pods, project.dependencies_group].each { |group| group.remove_from_project if group.empty? } project.sort(:groups_position => :below) - if installation_options.deterministic_uuids? - UI.message('- Generating deterministic UUIDs') { project.predictabilize_uuids } - end - library_product_types = [:framework, :dynamic_library, :static_library] - results_by_native_target = Hash[pod_target_installation_results.map do |_, result| - [result.native_target, result] - end] - project.recreate_user_schemes(false) do |scheme, target| - next unless target.respond_to?(:symbol_type) - next unless library_product_types.include? target.symbol_type - installation_result = results_by_native_target[target] - next unless installation_result - installation_result.test_native_targets.each do |test_native_target| - scheme.add_test_target(test_native_target) - end - end - project.save end end end diff --git a/spec/cocoapods-integration-specs b/spec/cocoapods-integration-specs index 5d1d722978..bb2cafff8b 160000 --- a/spec/cocoapods-integration-specs +++ b/spec/cocoapods-integration-specs @@ -1 +1 @@ -Subproject commit 5d1d722978018a1f322b8f81dfe3ffdea484a9ce +Subproject commit bb2cafff8b0eb3e4d1af58253a521867bd0c4a34 diff --git a/spec/unit/installer/xcode/multi_pods_project_generator_spec.rb b/spec/unit/installer/xcode/multi_pods_project_generator_spec.rb index f1f771f0f3..40aadadf93 100644 --- a/spec/unit/installer/xcode/multi_pods_project_generator_spec.rb +++ b/spec/unit/installer/xcode/multi_pods_project_generator_spec.rb @@ -558,8 +558,8 @@ class Xcode target.stubs(:user_targets).returns([user_target]) - @generator = SinglePodsProjectGenerator.new(config.sandbox, [target], [], - @analysis_result, @installation_options, config) + @generator = MultiPodsProjectGenerator.new(config.sandbox, [target], [], + @analysis_result, @installation_options, config) pod_generator_result = @generator.generate! pod_generator_result.project.object_version.should == '1' pod_generator_result.projects_by_pod_targets.keys.each do |target_project| @@ -574,38 +574,37 @@ class Xcode pod_generator_result = @generator.generate! pods_project = pod_generator_result.project pods_project.main_group.expects(:sort) - Xcodeproj::Project.any_instance.stubs(:recreate_user_schemes) - Xcode::PodsProjectWriter.new(@generator.sandbox, pods_project, - pod_generator_result.target_installation_results.pod_target_installation_results, - @generator.installation_options).write! pod_generator_result.projects_by_pod_targets.keys.each do |target_project| target_project.main_group.expects(:sort) - Xcode::PodsProjectWriter.new(@generator.sandbox, target_project, - pod_generator_result.target_installation_results.pod_target_installation_results, - @generator.installation_options).write! end + Xcodeproj::Project.any_instance.stubs(:recreate_user_schemes) + generated_projects = [pods_project] + pod_generator_result.projects_by_pod_targets.keys + Xcode::PodsProjectWriter.new(@generator.sandbox, generated_projects, + pod_generator_result.target_installation_results.pod_target_installation_results, + @generator.installation_options).write! end it 'saves the project' do pod_generator_result = @generator.generate! Xcodeproj::Project.any_instance.stubs(:recreate_user_schemes) - pod_generator_result.project.expects(:save) - Xcode::PodsProjectWriter.new(@generator.sandbox, pod_generator_result.project, - pod_generator_result.target_installation_results.pod_target_installation_results, - @generator.installation_options).write! - pod_generator_result.projects_by_pod_targets.keys.each do |target_project| + pods_project = pod_generator_result.project + projects_by_pod_targets = pod_generator_result.projects_by_pod_targets + pods_project.expects(:save) + projects_by_pod_targets.keys.each do |target_project| target_project.expects(:sort) - Xcode::PodsProjectWriter.new(@generator.sandbox, target_project, - pod_generator_result.target_installation_results.pod_target_installation_results, - @generator.installation_options).write! end + generated_projects = [pods_project] + projects_by_pod_targets.keys + Xcode::PodsProjectWriter.new(@generator.sandbox, generated_projects, + pod_generator_result.target_installation_results.pod_target_installation_results, + @generator.installation_options).write! end it 'project cleans up empty groups' do pod_generator_result = @generator.generate! pods_project = pod_generator_result.project projects_by_pod_targets = pod_generator_result.projects_by_pod_targets - Xcode::PodsProjectWriter.new(@generator.sandbox, pods_project, + generated_projects = [pods_project] + projects_by_pod_targets.keys + Xcode::PodsProjectWriter.new(@generator.sandbox, generated_projects, pod_generator_result.target_installation_results.pod_target_installation_results, @generator.installation_options).write! pods_project.main_group['Pods'].should.be.nil @@ -613,9 +612,6 @@ class Xcode pods_project.main_group['Dependencies'].should.not.be.nil projects_by_pod_targets.keys.each do |project| - Xcode::PodsProjectWriter.new(@generator.sandbox, project, - pod_generator_result.target_installation_results.pod_target_installation_results, - @generator.installation_options).write! project.main_group['Pods'].should.be.nil project.main_group['Development Pods'].should.be.nil end diff --git a/spec/unit/installer/xcode/single_pods_project_generator_spec.rb b/spec/unit/installer/xcode/single_pods_project_generator_spec.rb index 591e57716c..5e8af574c3 100644 --- a/spec/unit/installer/xcode/single_pods_project_generator_spec.rb +++ b/spec/unit/installer/xcode/single_pods_project_generator_spec.rb @@ -401,7 +401,7 @@ class Xcode pod_generator_result = @generator.generate! pod_generator_result.project.main_group.expects(:sort) Xcodeproj::Project.any_instance.stubs(:recreate_user_schemes) - Xcode::PodsProjectWriter.new(@generator.sandbox, pod_generator_result.project, + Xcode::PodsProjectWriter.new(@generator.sandbox, [pod_generator_result.project], pod_generator_result.target_installation_results.pod_target_installation_results, @generator.installation_options).write! end @@ -410,7 +410,7 @@ class Xcode pod_generator_result = @generator.generate! Xcodeproj::Project.any_instance.stubs(:recreate_user_schemes) pod_generator_result.project.expects(:save) - Xcode::PodsProjectWriter.new(@generator.sandbox, pod_generator_result.project, + Xcode::PodsProjectWriter.new(@generator.sandbox, [pod_generator_result.project], pod_generator_result.target_installation_results.pod_target_installation_results, @generator.installation_options).write! end