forked from danger/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPackageGenerator.swift
92 lines (76 loc) · 3.4 KB
/
PackageGenerator.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import DangerShellExecutor
import Foundation
import Version
struct PackageGenerator {
let folder: String
let generatedFolder: String
let packageListMaker: PackageListMaking
let fileCreator: FileCreating
private var masterPackageName: String { "PACKAGES" }
init(folder: String,
generatedFolder: String,
packageListMaker: PackageListMaking? = nil,
fileCreator: FileCreating = FileCreator()) {
self.folder = folder
self.generatedFolder = generatedFolder
self.fileCreator = fileCreator
if let packageListMaker = packageListMaker {
self.packageListMaker = packageListMaker
} else {
self.packageListMaker = PackageListMaker(folder: folder, fileManager: .default, dataReader: FileReader())
}
}
func generateMasterPackageDescription(forSwiftToolsVersion toolsVersion: Version,
macOSVersion: Version) throws {
let header = makePackageDescriptionHeader(forSwiftToolsVersion: toolsVersion)
let packages = packageListMaker.makePackageList()
let platform = makeSupportedPlatform(forMacOSVersion: macOSVersion)
var description = "\(header)\n\n" +
"import PackageDescription\n\n" +
"let package = Package(\n" +
" name: \"\(masterPackageName)\",\n" +
(platform.isEmpty ? "" : " platforms: [\(platform)],\n") +
" products: [.executable(name: \"DangerDependencies\", " +
"targets: [\"\(masterPackageName)\"])]," +
"\n" +
" dependencies: [\n"
for (index, package) in packages.enumerated() {
if index > 0 {
description += ",\n"
}
description.append(" \(package.dependencyString(forToolsVersion: toolsVersion))")
}
description.append("\n ],\n")
description.append(" targets: [.executableTarget(name: \"\(masterPackageName)\", dependencies: [")
if !packages.isEmpty {
description.append("\"")
description.append(packages.map(\.name).joined(separator: "\", \""))
description.append("\"")
}
description.append("])],\n")
var versionString = String(toolsVersion.major)
if toolsVersion == Version(major: 4, minor: 2, patch: 0) {
versionString.append(".\(toolsVersion.minor)")
}
description.append(" swiftLanguageVersions: [.version(\"\(versionString)\")]\n)")
fileCreator.createFile(atPath: generatedFolder.appendingPath("Package.swift"),
contents: Data(description.utf8))
}
func makePackageDescriptionHeader(forSwiftToolsVersion toolsVersion: Version) -> String {
let swiftVersion = "\(toolsVersion.major).\(toolsVersion.minor)"
let generationVersion = 3
return "// swift-tools-version:\(swiftVersion)\n" +
"// danger-dependency-generator-version:\(generationVersion)"
}
func makeSupportedPlatform(forMacOSVersion macOSVersion: Version) -> String {
if case .null = macOSVersion { return "" }
switch macOSVersion.major {
case 10 where (10 ... 15).contains(macOSVersion.minor):
return ".macOS(.v10_\(macOSVersion.minor))"
case 11...:
return ".macOS(.v\(macOSVersion.major))"
default:
return ""
}
}
}