Skip to content

Commit

Permalink
CachedFramework, add bundle extension
Browse files Browse the repository at this point in the history
  • Loading branch information
Oleg Geier committed Mar 21, 2020
1 parent c6859af commit c10dd64
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 30 deletions.
62 changes: 33 additions & 29 deletions Source/CarthageKit/VersionFile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ import XCDBLD
public struct CachedFramework: Codable {
enum CodingKeys: String, CodingKey {
case name = "name"
case `extension` = "extension"
case hash = "hash"
case linking = "linking"
case swiftToolchainVersion = "swiftToolchainVersion"
}

/// Name of the framework
public let name: String
/// Extension of the framework. Defaults to `framework`
public let `extension`: String?
/// Hash of the framework
public let hash: String
/// The linking type of the framework. One of `dynamic` or `static`. Defaults to `dynamic`
Expand All @@ -28,11 +31,12 @@ public struct CachedFramework: Codable {

/// The framework's expected location within a platform directory.
var relativePath: String {
let ext = `extension` ?? "framework"
switch linking {
case .some(.static):
return "\(FrameworkType.staticFolderName)/\(name).framework"
return "\(FrameworkType.staticFolderName)/\(name).\(ext)"
default:
return "\(name).framework"
return "\(name).\(ext)"
}
}
}
Expand Down Expand Up @@ -126,12 +130,11 @@ public struct VersionFile: Codable {
for cachedFramework: CachedFramework,
platform: Platform,
binariesDirectoryURL: URL
) -> SignalProducer<URL, CarthageError> {
return enumerateSupportedFrameworks(target: cachedFramework.name,
inDirectory: binariesDirectoryURL,
isBuildDirectory: true,
allowedPlatforms: [platform])
.filterMap { $0.path.appendingPathComponent($0.name, isDirectory: true) }
) -> URL {
return binariesDirectoryURL
.appendingPathComponent(platform.rawValue, isDirectory: true)
.resolvingSymlinksInPath()
.appendingPathComponent(cachedFramework.relativePath, isDirectory: true)
}

/// Calculates the path of the binary inside the framework corresponding with a version file
Expand All @@ -143,11 +146,13 @@ public struct VersionFile: Codable {
for cachedFramework: CachedFramework,
platform: Platform,
binariesDirectoryURL: URL
) -> SignalProducer<URL, CarthageError> {
return frameworkURL(for: cachedFramework,
platform: platform,
binariesDirectoryURL: binariesDirectoryURL)
.filterMap { binaryURL($0).value }
) -> URL {
let fmwkURL = frameworkURL(
for: cachedFramework,
platform: platform,
binariesDirectoryURL: binariesDirectoryURL
)
return binaryURL(fmwkURL).value ?? fmwkURL.appendingPathComponent("\(cachedFramework.name)", isDirectory: false)
}

/// Sends the hashes of the provided cached framework's binaries in the
Expand All @@ -158,14 +163,13 @@ public struct VersionFile: Codable {
binariesDirectoryURL: URL
) -> SignalProducer<String?, CarthageError> {
return SignalProducer<CachedFramework, CarthageError>(cachedFrameworks)
.flatMap(.concat) { cachedFramework -> SignalProducer<URL, CarthageError> in
self.frameworkBinaryURL(
.flatMap(.concat) { cachedFramework -> SignalProducer<String?, CarthageError> in
let frameworkBinaryURL = self.frameworkBinaryURL(
for: cachedFramework,
platform: platform,
binariesDirectoryURL: binariesDirectoryURL
)
}
.flatMap(.concat) { frameworkBinaryURL -> SignalProducer<String?, CarthageError> in

return hashForFileAtURL(frameworkBinaryURL)
.map { hash -> String? in
return hash
Expand All @@ -189,14 +193,13 @@ public struct VersionFile: Codable {
localSwiftVersion: String
) -> SignalProducer<Bool, CarthageError> {
return SignalProducer<CachedFramework, CarthageError>(cachedFrameworks)
.flatMap(.concat) { cachedFramework -> SignalProducer<URL, CarthageError> in
self.frameworkURL(
.flatMap(.concat) { cachedFramework -> SignalProducer<Bool, CarthageError> in
let frameworkURL = self.frameworkURL(
for: cachedFramework,
platform: platform,
binariesDirectoryURL: binariesDirectoryURL
)
}
.flatMap(.concat) { frameworkURL -> SignalProducer<Bool, CarthageError> in

if !isSwiftFramework(frameworkURL) {
return SignalProducer(value: true)
} else {
Expand Down Expand Up @@ -457,27 +460,26 @@ public func createVersionFileForCommitish(
struct FrameworkDetail {
let platformName: String
let frameworkName: String
let frameworkExt: String
let frameworkSwiftVersion: String?
let frameworkType: FrameworkType
}

if !buildProducts.isEmpty {
return SignalProducer<URL, CarthageError>(buildProducts)
.flatMap(.merge) { url -> SignalProducer<(String, FrameworkDetail), CarthageError> in
let frameworkName: String
let frameworkName = url.deletingPathExtension().lastPathComponent
let frameworkExt = url.pathExtension
let platformName: String
let frameworkType: FrameworkType
switch (
url.deletingLastPathComponent().deletingLastPathComponent().lastPathComponent,
url.deletingLastPathComponent().lastPathComponent,
url.deletingPathExtension().lastPathComponent
url.deletingLastPathComponent().lastPathComponent
) {
case (let platform, FrameworkType.staticFolderName, let name):
frameworkName = name
case (let platform, FrameworkType.staticFolderName):
platformName = platform
frameworkType = .static
case (_, let platform, let name):
frameworkName = name
case (_, let platform):
platformName = platform
frameworkType = .dynamic
}
Expand All @@ -487,6 +489,7 @@ public func createVersionFileForCommitish(
.flatMap(.merge) { frameworkSwiftVersion -> SignalProducer<(String, FrameworkDetail), CarthageError> in
let frameworkDetail: FrameworkDetail = .init(platformName: platformName,
frameworkName: frameworkName,
frameworkExt: frameworkExt,
frameworkSwiftVersion: frameworkSwiftVersion,
frameworkType: frameworkType)
let details = SignalProducer<FrameworkDetail, CarthageError>(value: frameworkDetail)
Expand All @@ -498,10 +501,11 @@ public func createVersionFileForCommitish(
let hash = values.0
let platformName = values.1.platformName
let frameworkName = values.1.frameworkName
let frameworkExt = values.1.frameworkExt
let frameworkSwiftVersion = values.1.frameworkSwiftVersion
let frameworkType = values.1.frameworkType

let cachedFramework = CachedFramework(name: frameworkName, hash: hash, linking: frameworkType, swiftToolchainVersion: frameworkSwiftVersion)
let cachedFramework = CachedFramework(name: frameworkName, extension: frameworkExt, hash: hash, linking: frameworkType, swiftToolchainVersion: frameworkSwiftVersion)
if var frameworks = platformCaches[platformName] {
frameworks.append(cachedFramework)
platformCaches[platformName] = frameworks
Expand Down
6 changes: 6 additions & 0 deletions Tests/CarthageKitTests/Resources/TestVersionFile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
"hash": "ios-framework2-hash",
"linking": "static",
"swiftToolchainVersion": "4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)"
},
{
"name": "TestFramework3",
"hash": "ios-framework3-hash",
"extension": "qlgenerator",
"swiftToolchainVersion": "4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)"
}
],
"Mac": [
Expand Down
8 changes: 7 additions & 1 deletion Tests/CarthageKitTests/VersionFileSpec.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class VersionFileSpec: QuickSpec {
// Check multiple frameworks
let iOSCache = versionFile.iOS
expect(iOSCache).notTo(beNil())
expect(iOSCache!.count) == 2
expect(iOSCache!.count) == 3
expect(iOSCache![0].name) == "TestFramework1"
expect(iOSCache![0].hash) == "ios-framework1-hash"
expect(iOSCache![0].linking) == .dynamic
Expand All @@ -28,6 +28,9 @@ class VersionFileSpec: QuickSpec {
expect(iOSCache![1].hash) == "ios-framework2-hash"
expect(iOSCache![1].linking) == .static
expect(iOSCache![1].swiftToolchainVersion) == "4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)"
expect(iOSCache![2].name) == "TestFramework3"
expect(iOSCache![2].hash) == "ios-framework3-hash"
expect(iOSCache![2].extension) == "qlgenerator"

// Check different number of frameworks for a platform
let macOSCache = versionFile.macOS
Expand All @@ -50,6 +53,7 @@ class VersionFileSpec: QuickSpec {

it("should write and read back a version file correctly") {
let framework = CachedFramework(name: "TestFramework",
extension: "framework",
hash: "TestHASH",
linking: .dynamic,
swiftToolchainVersion: "4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1)")
Expand Down Expand Up @@ -196,12 +200,14 @@ class VersionFileSpec: QuickSpec {
it("should compute the relative paths of static and dynamic frameworks") {
let dynamicFramework = CachedFramework(
name: "TestFramework",
extension: "framework",
hash: "TestHASH",
linking: .dynamic,
swiftToolchainVersion: "4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1)"
)
let staticFramework = CachedFramework(
name: "TestFramework",
extension: "framework",
hash: "TestHASH",
linking: .static,
swiftToolchainVersion: "4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1)"
Expand Down

0 comments on commit c10dd64

Please sign in to comment.