Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 31 additions & 4 deletions Sources/XcodeProj/Objects/BuildPhase/PBXCopyFilesBuildPhase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import Foundation

/// This is the element for the copy file build phase.
public final class PBXCopyFilesBuildPhase: PBXBuildPhase {
public enum SubFolder: UInt, Decodable {

@available(*, deprecated, renamed: "SubFolder", message: "May become obsolete in the future in favor of dstSubfolder")
public enum SubFolderSpec: UInt, Decodable {
case absolutePath = 0
case productsDirectory = 16
case wrapper = 1
Expand All @@ -15,14 +17,32 @@ public final class PBXCopyFilesBuildPhase: PBXBuildPhase {
case plugins = 13
case other
}

public enum SubFolder: String, Decodable {
case absolutePath = "AbsolutePath"
case productsDirectory = "ProductsDirectory"
case wrapper = "Wrapper"
case executables = "Executables"
case resources = "Resources"
case javaResources = "JavaResources"
case frameworks = "Frameworks"
case sharedFrameworks = "SharedFrameworks"
case sharedSupport = "SharedSupport"
case plugins = "PlugIns"
case other = "Other"
case product = "Product"
case none = "None"
}

// MARK: - Attributes

/// Element destination path
public var dstPath: String?

/// Element destination subfolder spec
public var dstSubfolderSpec: SubFolder?
public var dstSubfolderSpec: SubFolderSpec?

public var dstSubfolder: SubFolder?

/// Copy files build phase name
public var name: String?
Expand All @@ -42,13 +62,15 @@ public final class PBXCopyFilesBuildPhase: PBXBuildPhase {
/// - files: Build files to copy.
/// - runOnlyForDeploymentPostprocessing: Run only for deployment post processing.
public init(dstPath: String? = nil,
dstSubfolderSpec: SubFolder? = nil,
dstSubfolderSpec: SubFolderSpec? = nil,
dstSubfolder: SubFolder? = nil,
name: String? = nil,
buildActionMask: UInt = defaultBuildActionMask,
files: [PBXBuildFile] = [],
runOnlyForDeploymentPostprocessing: Bool = false) {
self.dstPath = dstPath
self.dstSubfolderSpec = dstSubfolderSpec
self.dstSubfolder = dstSubfolder
self.name = name
super.init(files: files,
buildActionMask: buildActionMask,
Expand All @@ -61,13 +83,15 @@ public final class PBXCopyFilesBuildPhase: PBXBuildPhase {
fileprivate enum CodingKeys: String, CodingKey {
case dstPath
case dstSubfolderSpec
case dstSubfolder
case name
}

public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
dstPath = try container.decodeIfPresent(.dstPath)
dstSubfolderSpec = try container.decodeIntIfPresent(.dstSubfolderSpec).flatMap(SubFolder.init)
dstSubfolderSpec = try container.decodeIntIfPresent(.dstSubfolderSpec).flatMap(SubFolderSpec.init)
dstSubfolder = try container.decodeIfPresent(.dstSubfolder)
name = try container.decodeIfPresent(.name)
try super.init(from: decoder)
}
Expand All @@ -93,6 +117,9 @@ extension PBXCopyFilesBuildPhase: PlistSerializable {
if let dstSubfolderSpec {
dictionary["dstSubfolderSpec"] = .string(CommentedString("\(dstSubfolderSpec.rawValue)"))
}
if let dstSubfolder {
dictionary["dstSubfolder"] = .string(CommentedString("\(dstSubfolder.rawValue)"))
}
return (key: CommentedString(reference, comment: name ?? "CopyFiles"), value: .dictionary(dictionary))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,43 @@ import XCTest

final class PBXCopyFilesBuildPhaseTests: XCTestCase {
func test_subFolder_Path_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.absolutePath.rawValue, 0)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.absolutePath.rawValue, 0)
}

func test_subFolder_producsDirectory_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.productsDirectory.rawValue, 16)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.productsDirectory.rawValue, 16)
}

func test_subFolder_wrapper_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.wrapper.rawValue, 1)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.wrapper.rawValue, 1)
}

func test_subFolder_executables_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.executables.rawValue, 6)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.executables.rawValue, 6)
}

func test_subFolder_resources_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.resources.rawValue, 7)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.resources.rawValue, 7)
}

func test_subFolder_javaResources_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.javaResources.rawValue, 15)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.javaResources.rawValue, 15)
}

func test_subFolder_frameworks_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.frameworks.rawValue, 10)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.frameworks.rawValue, 10)
}

func test_subFolder_sharedFrameworks_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.sharedFrameworks.rawValue, 11)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.sharedFrameworks.rawValue, 11)
}

func test_subFolder_sharedSupport_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.sharedSupport.rawValue, 12)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.sharedSupport.rawValue, 12)
}

func test_subFolder_plugins_hasTheCorrectValue() {
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolder.plugins.rawValue, 13)
XCTAssertEqual(PBXCopyFilesBuildPhase.SubFolderSpec.plugins.rawValue, 13)
}

func test_init_fails_whenDstPathIsMissing() {
Expand Down