Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

apply_change_to_project: Support SPM dependencies. #50

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 37 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,48 @@ 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 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