Skip to content

Commit

Permalink
apply_change_to_project: Support SPM dependencies.
Browse files Browse the repository at this point in the history
  • Loading branch information
byohay committed Mar 3, 2022
1 parent 307a297 commit ca39b3c
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 1 deletion.
39 changes: 38 additions & 1 deletion lib/kintsugi/apply_change_to_project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def subchanges_of_change(change)
end

def attribute_name_from_change_name(change_name)
if change_name == "fileEncoding"
if %w[fileEncoding repositoryURL].include?(change_name)
change_name.to_sym
else
Xcodeproj::Project::Object::CaseConverter.convert_to_ruby(change_name)
Expand Down Expand Up @@ -303,12 +303,49 @@ def add_child_to_component(component, change)
add_variant_group(component, change)
when "PBXReferenceProxy"
add_reference_proxy(component, change)
when "XCSwiftPackageProductDependency"
add_swift_package_product_dependency(component, change)
when "XCRemoteSwiftPackageReference"
add_remote_swift_package_reference(component, change)
else
raise MergeError, "Trying to add unsupported component type #{change["isa"]}. Full " \
"component change is: #{change}"
end
end

def add_remote_swift_package_reference(containing_component, change)
remote_swift_package_reference =
containing_component.project.new(Xcodeproj::Project::XCRemoteSwiftPackageReference)
add_attributes_to_component(remote_swift_package_reference, change)

case containing_component
when Xcodeproj::Project::XCSwiftPackageProductDependency
containing_component.package = remote_swift_package_reference
when Xcodeproj::Project::PBXProject
containing_component.package_references << remote_swift_package_reference
else
raise MergeError, "Trying to add remote swift package reference to an unsupported " \
"component type #{containing_component.isa}. Change is: #{change}"
end
end

def add_swift_package_product_dependency(containing_component, change)
swift_package_product_dependency =
containing_component.project.new(Xcodeproj::Project::XCSwiftPackageProductDependency)

add_attributes_to_component(swift_package_product_dependency, change)

case containing_component
when Xcodeproj::Project::PBXBuildFile
containing_component.product_ref = swift_package_product_dependency
when Xcodeproj::Project::PBXNativeTarget
containing_component.package_product_dependencies << swift_package_product_dependency
else
raise MergeError, "Trying to add swift package product dependency to an unsupported " \
"component type #{containing_component.isa}. Change is: #{change}"
end
end

def add_reference_proxy(containing_component, change)
case containing_component
when Xcodeproj::Project::PBXBuildFile
Expand Down
63 changes: 63 additions & 0 deletions spec/kintsugi_apply_change_to_project_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,20 @@
expect(base_project).to be_equivalent_to_project(theirs_project)
end

it "adds package reference" do
theirs_project = create_copy_of_project(base_project.path, "theirs")

theirs_project.root_object.package_references <<
create_remote_swift_package_reference(theirs_project)

changes_to_apply = get_diff(theirs_project, base_project)

described_class.apply_change_to_project(base_project, changes_to_apply)
base_project.save

expect(base_project).to be_equivalent_to_project(theirs_project)
end

it "adds new subproject" do
theirs_project = create_copy_of_project(base_project.path, "theirs")
add_new_subproject_to_project(theirs_project, "foo", "foo")
Expand Down Expand Up @@ -370,6 +384,19 @@
expect(base_project).to be_equivalent_to_project(theirs_project)
end

it "adds swift package product dependency to target" do
theirs_project = create_copy_of_project(base_project.path, "theirs")
theirs_project.targets[0].package_product_dependencies <<
create_swift_package_product_dependency(theirs_project)

changes_to_apply = get_diff(theirs_project, base_project)

described_class.apply_change_to_project(base_project, changes_to_apply)
base_project.save

expect(base_project).to be_equivalent_to_project(theirs_project)
end

it "changes framework from reference proxy to file reference" do
framework_filename = "baz"

Expand Down Expand Up @@ -466,6 +493,26 @@
expect(base_project).to be_equivalent_to_project(theirs_project, ignore_keys: ["containerPortal"])
end

it "adds product ref to build file" do
base_project.main_group.new_reference("bar")
base_project.save

theirs_project = create_copy_of_project(base_project.path, "theirs")

file_reference = theirs_project.main_group.files.find { |file| file.display_name == "bar" }
build_file =
theirs_project.targets[0].frameworks_build_phase.add_file_reference(file_reference)
build_file.product_ref =
create_swift_package_product_dependency(theirs_project)

changes_to_apply = get_diff(theirs_project, base_project)

described_class.apply_change_to_project(base_project, changes_to_apply)
base_project.save

expect(base_project).to be_equivalent_to_project(theirs_project, ignore_keys: ["containerPortal"])
end

it "adds build file to a file reference that already exist" do
file_reference = base_project.main_group.new_reference("bar")
base_project.targets[0].frameworks_build_phase.add_file_reference(file_reference)
Expand Down Expand Up @@ -987,6 +1034,22 @@ def create_reference_proxy_from_product_reference(project, subproject_reference,
reference_proxy
end

def create_swift_package_product_dependency(project)
product_dependency = project.new(Xcodeproj::Project::XCSwiftPackageProductDependency)
product_dependency.product_name = "foo"
product_dependency.package = create_remote_swift_package_reference(project)

product_dependency
end

def create_remote_swift_package_reference(project)
package_reference = project.new(Xcodeproj::Project::XCRemoteSwiftPackageReference)
package_reference.repositoryURL = "http://foo"
package_reference.requirement = {"foo" => "bar"}

package_reference
end

def make_temp_directory(directory_prefix, directory_extension)
directory_path = Dir.mktmpdir([directory_prefix, directory_extension])
temporary_directories_paths << directory_path
Expand Down

0 comments on commit ca39b3c

Please sign in to comment.