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

Edit Dangerfile as a Swift Package on danger-swift edit instead of xcodeproj #566

Merged
merged 15 commits into from
Apr 23, 2023
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
- Gitlab Error in merge request with estimate or spent time [@oscarcv][] - [#548](https://github.com/danger/swift/pull/548)
- Fix a decode error with BitBucket server [@pepix][] - [#553](https://github.com/danger/swift/pull/553)
- Resolve `// fileImport: ~` path to an absolute path on running `danger-swift edit` [@417-72KI][] - [#565](https://github.com/danger/swift/pull/565)
- Edit Dangerfile as a Swift Package on `danger-swift edit` instead of xcodeproj [@417-72KI][] - [#566](https://github.com/danger/swift/pull/566)
- Add ability to change meta information [@Nikoloutsos][] - [#567](https://github.com/danger/swift/pull/567)
- Add deactivated user status for GitLab [@antigp][] - [#572](https://github.com/danger/swift/pull/572)
- Add `squash` attribute for GitLab merge request [@aserdobintsev][] - [#576](https://github.com/danger/swift/pull/576)
Expand Down
45 changes: 27 additions & 18 deletions Package.resolved
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
{
"object": {
"pins": [
{
"package": "CollectionConcurrencyKit",
"repositoryURL": "https://github.com/JohnSundell/CollectionConcurrencyKit.git",
"state": {
"branch": null,
"revision": "b4f23e24b5a1bff301efc5e70871083ca029ff95",
"version": "0.2.0"
}
},
{
"package": "Komondor",
"repositoryURL": "https://github.com/shibapm/Komondor",
Expand Down Expand Up @@ -51,8 +60,8 @@
"repositoryURL": "https://github.com/shibapm/Rocket",
"state": {
"branch": null,
"revision": "9880a5beb7fcb9e61ddd5764edc1700b8c418deb",
"version": "1.2.1"
"revision": "32af356776108ee7289884874a0eb63ceacb9e5d",
"version": "1.3.0"
}
},
{
Expand All @@ -69,17 +78,17 @@
"repositoryURL": "https://github.com/jpsim/SourceKitten.git",
"state": {
"branch": null,
"revision": "817dfa6f2e09b0476f3a6c9dbc035991f02f0241",
"version": "0.32.0"
"revision": "b6dc09ee51dfb0c66e042d2328c017483a1a5d56",
"version": "0.34.1"
}
},
{
"package": "swift-argument-parser",
"repositoryURL": "https://github.com/apple/swift-argument-parser.git",
"state": {
"branch": null,
"revision": "e394bf350e38cb100b6bc4172834770ede1b7232",
"version": "1.0.3"
"revision": "fee6933f37fde9a5e12a1e4aeaa93fe60116ff2a",
"version": "1.2.2"
}
},
{
Expand All @@ -96,35 +105,35 @@
"repositoryURL": "https://github.com/apple/swift-syntax.git",
"state": {
"branch": null,
"revision": "0b6c22b97f8e9320bca62e82cdbee601cf37ad3f",
"version": "0.50600.1"
"revision": "013a48e2312e57b7b355db25bd3ea75282ebf274",
"version": "0.50900.0-swift-DEVELOPMENT-SNAPSHOT-2023-02-06-a"
}
},
{
"package": "SwiftFormat",
"repositoryURL": "https://github.com/nicklockwood/SwiftFormat",
"state": {
"branch": null,
"revision": "ce821205ea1bb4de67817c2dbec99f881d0e50d4",
"version": "0.50.5"
"revision": "7d3682f70f790805ecab81a685b711f6842f4698",
"version": "0.51.1"
}
},
{
"package": "SwiftLint",
"repositoryURL": "https://github.com/Realm/SwiftLint",
"state": {
"branch": null,
"revision": "22fb9eb9e55b8f5ad9b48fe6f15ea7daabaafae3",
"version": "0.48.0"
"revision": "eb85125a5f293de3d3248af259980c98bc2b1faa",
"version": "0.51.0"
}
},
{
"package": "SwiftShell",
"repositoryURL": "https://github.com/kareman/SwiftShell",
"state": {
"branch": null,
"revision": "a6014fe94c3dbff0ad500e8da4f251a5d336530b",
"version": "5.1.0-beta.1"
"revision": "99680b2efc7c7dbcace1da0b3979d266f02e213c",
"version": "5.1.0"
}
},
{
Expand All @@ -141,8 +150,8 @@
"repositoryURL": "https://github.com/drmohundro/SWXMLHash.git",
"state": {
"branch": null,
"revision": "6469881a3f30417c5bb02404ea4b69207f297592",
"version": "6.0.0"
"revision": "4d0f62f561458cbe1f732171e625f03195151b60",
"version": "7.0.1"
}
},
{
Expand All @@ -159,8 +168,8 @@
"repositoryURL": "https://github.com/jpsim/Yams",
"state": {
"branch": null,
"revision": "9ff1cc9327586db4e0c8f46f064b6a82ec1566fa",
"version": "4.0.6"
"revision": "f47ba4838c30dbd59998a4e4c87ab620ff959e8a",
"version": "5.0.5"
}
}
]
Expand Down
10 changes: 9 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ import PackageDescription
// switch to false when release
let isDevelop = true

let swiftLint: Package.Dependency = {
#if compiler(>=5.7)
return .package(url: "https://github.com/Realm/SwiftLint", from: "0.51.0")
#else
return .package(url: "https://github.com/Realm/SwiftLint", .exact("0.48.0"))
#endif
}()

let devProducts: [Product] = isDevelop
? [
.library(name: "DangerDeps", type: .dynamic, targets: ["Danger-Swift"])
Expand All @@ -15,7 +23,7 @@ let devDependencies: [Package.Dependency] = isDevelop
? [
.package(url: "https://github.com/shibapm/Komondor", from: "1.1.4"),
.package(url: "https://github.com/nicklockwood/SwiftFormat", from: "0.50.5"),
.package(url: "https://github.com/Realm/SwiftLint", from: "0.48.0"),
swiftLint,
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.10.0"),
.package(url: "https://github.com/shibapm/Rocket", from: "1.2.1"),
] : []
Expand Down
28 changes: 24 additions & 4 deletions Sources/DangerDependenciesResolver/InlineDependenciesFinder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ struct InlineDependenciesFinder {
self.config = config
}

func resolveInlineDependencies(fromPath path: String) throws -> [InlineDependency] {
func resolveInlineDependencies(fromPath path: String,
dangerSwiftVersion: String) throws -> [InlineDependency] {
let lines = try fileReader.readText(atPath: path).components(separatedBy: .newlines)

var result = [InlineDependency]()
var result: [InlineDependency] = [.dangerSwift(version: dangerSwiftVersion)]

for line in lines {
if line.hasPrefix("import ") {
Expand Down Expand Up @@ -53,7 +54,26 @@ extension InlineDependenciesFinder {

extension InlineDependenciesFinder {
struct InlineDependency: Equatable {
let url: URL
let major: Int?
var url: URL
var major: Int?
var minor: Int?
var patch: Int?
}
}

extension InlineDependenciesFinder.InlineDependency {
static func dangerSwift(version: String) -> Self {
let components = version.split(separator: ".")
.compactMap { Int($0) }
precondition(components.count == 3)

return .init(url: dangerSwiftRepoURL,
major: components[0],
minor: components[1],
patch: components[2])
}
}

extension InlineDependenciesFinder.InlineDependency {
static let dangerSwiftRepoURL = URL(string: "https://github.com/danger/swift.git")!
}
28 changes: 27 additions & 1 deletion Sources/DangerDependenciesResolver/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,44 @@ public struct Package: Equatable, Codable {
public let name: String
public let url: URL
public var majorVersion: Int
public var minorVersion: Int?
public var patchVersion: Int?
}

extension Package {
func dependencyString(forToolsVersion version: Version) -> String {
if version >= Version(major: 5, minor: 2, patch: 0) {
switch version {
case Version(5, 6, 0)...:
if let minorVersion = minorVersion, let patchVersion = patchVersion {
return #".package(url: "\#(url.absoluteString)", exact: "\#(majorVersion).\#(minorVersion).\#(patchVersion)")"#
} else {
return #".package(url: "\#(url.absoluteString)", from: "\#(majorVersion).0.0")"#
}
case Version(5, 2, 0)...:
if let minorVersion = minorVersion, let patchVersion = patchVersion {
return #".package(name: "\#(name)", url: "\#(url.absoluteString)", .exact("\#(majorVersion).\#(minorVersion).\#(patchVersion)"))"#
} else {
return #".package(name: "\#(name)", url: "\#(url.absoluteString)", from: "\#(majorVersion).0.0")"#
}
default:
if let minorVersion = minorVersion, let patchVersion = patchVersion {
return #".package(url: "\#(url.absoluteString)", .exact("\#(majorVersion).\#(minorVersion).\#(patchVersion)"))"#
} else {
return #".package(url: "\#(url.absoluteString)", from: "\#(majorVersion).0.0")"#
}
}
}

func targetDependencyString(forToolsVersion version: Version) -> String {
switch version {
case Version(5, 6, 0)...:
return #".product(name: "\#(name)", package: "\#(url.lastPathComponent.replacingOccurrences(of: ".git", with: ""))")"#
default:
return "\"\(name)\""
}
}
}

extension Package {
struct Pinned: Decodable, Equatable {
let name: String
Expand Down
7 changes: 7 additions & 0 deletions Sources/DangerDependenciesResolver/PackageDataProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ struct PackageDataProvider: PackageDataProviding {
}

func nameOfPackage(at url: URL, temporaryFolder: String) throws -> String {
if case InlineDependenciesFinder.InlineDependency.dangerSwiftRepoURL = url {
#if swift(>=5.6)
return "Danger"
#else
return "danger-swift"
#endif
}
do {
guard !url.isForRemoteRepository else {
return try nameOfRemotePackage(at: url, temporaryFolder: temporaryFolder)
Expand Down
6 changes: 3 additions & 3 deletions Sources/DangerDependenciesResolver/PackageGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ struct PackageGenerator {
description.append(" targets: [.executableTarget(name: \"\(masterPackageName)\", dependencies: [")

if !packages.isEmpty {
description.append("\"")
description.append(packages.map(\.name).joined(separator: "\", \""))
description.append("\"")
description.append("\n ")
description.append(packages.map { $0.targetDependencyString(forToolsVersion: toolsVersion) }.joined(separator: ",\n "))
description.append("\n ")
}

description.append("])],\n")
Expand Down
23 changes: 5 additions & 18 deletions Sources/DangerDependenciesResolver/PackageManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,33 +71,20 @@ public struct PackageManager {
} else {
latestVersion = try packageDataProvider.latestMajorVersionForPackage(at: package.url)
}
let package = Package(name: name, url: absoluteRepositoryURL(from: package.url), majorVersion: latestVersion)
let package = Package(name: name,
url: absoluteRepositoryURL(from: package.url),
majorVersion: latestVersion,
minorVersion: package.minor,
patchVersion: package.patch)
try save(package: package)

try updatePackages()
try addMissingPackageFiles()
}

private func save(package: Package) throws {
try fileCreator.createFile(atPath: folder.appendingPath(package.name), contents: package.encoded())
}

private func addMissingPackageFiles() throws {
for pinnedPackage in try packageDataProvider.resolvePinnedPackages(generatedFolder: generatedFolder) {
guard !folder.containsItem(named: pinnedPackage.name) else {
continue
}

let package = Package(
name: pinnedPackage.name,
url: pinnedPackage.url,
majorVersion: pinnedPackage.state.version.major
)

try save(package: package)
}
}

private func absoluteRepositoryURL(from url: URL) -> URL {
guard !url.isForRemoteRepository else {
return url
Expand Down
20 changes: 8 additions & 12 deletions Sources/DangerDependenciesResolver/Script.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public struct ScriptManager {
}

private let config = Config()
private let dangerSwiftVersion: String
private let packageManager: PackageManager
private let folder: String
private let cacheFolder: String
Expand All @@ -33,8 +34,10 @@ public struct ScriptManager {
private let inlineDependenciesFinder: InlineDependenciesFinder

public init(folder: String,
dangerSwiftVersion: String,
packageManager: PackageManager,
logger: Logger) throws {
self.dangerSwiftVersion = dangerSwiftVersion
self.folder = folder
self.logger = logger
cacheFolder = try folder.createSubfolderIfNeeded(withName: "Cache")
Expand All @@ -57,7 +60,8 @@ public struct ScriptManager {
let folder = try createFolderIfNeededForScript(withIdentifier: identifier, filePath: path)
let script = Script(name: path.nameExcludingExtension, folder: folder, logger: logger)

let packages = try inlineDependenciesFinder.resolveInlineDependencies(fromPath: path)
let packages = try inlineDependenciesFinder.resolveInlineDependencies(fromPath: path,
dangerSwiftVersion: dangerSwiftVersion)
try packageManager.addPackagesIfNeeded(from: packages)

do {
Expand Down Expand Up @@ -123,27 +127,19 @@ public final class Script {
}

@discardableResult
public func setupForEdit(importedFiles: [String], configPath: String) throws -> String {
public func setupForEdit(importedFiles: [String]) throws -> String {
try importedFiles.forEach {
if !FileManager.default.fileExists(atPath: $0) {
_ = FileManager.default.createFile(atPath: $0, contents: nil, attributes: nil)
}
try FileManager.default.copyItem(atPath: $0, toPath: sourcesImportPath(forImportPath: $0))
}

try generateXCodeProjWithConfig(configPath: configPath)

return editingPath()
}

private func editingPath() -> String {
folder.appendingPath(name + ".xcodeproj")
}

private func generateXCodeProjWithConfig(configPath: String) throws {
try executeSwiftCommand("package generate-xcodeproj --xcconfig-overrides \(configPath)",
onFolder: folder,
executor: ShellExecutor())
folder.appendingPath("Package.swift")
}

private func sourcesImportPath(forImportPath importPath: String) -> String {
Expand All @@ -163,7 +159,7 @@ public final class Script {
do {
let path = editingPath()

try ShellExecutor().spawn("open \"\(path)\"", arguments: [])
try ShellExecutor().spawn("xed \"\(path)\"", arguments: [])
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


logger.logInfo("\nℹ️ Danger will keep running, " +
"in order to commit any changes you make in Xcode back to the original script file")
Expand Down
11 changes: 4 additions & 7 deletions Sources/Runner/Commands/Edit.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Foundation
import Logger
import RunnerLib

func editDanger(logger: Logger) throws {
func editDanger(version dangerSwiftVersion: String, logger: Logger) throws {
let fileManager = FileManager.default
let dangerfilePath: String

Expand Down Expand Up @@ -46,14 +46,11 @@ func editDanger(logger: Logger) throws {
let importedFiles = importsFinder.findImports(inString: dangerfileContent)
.map { importsFinder.resolveImportPath($0, relativeTo: dangerfilePath) }

let scriptManager = try getScriptManager(logger)
let scriptManager = try getScriptManager(forDangerSwiftVersion: dangerSwiftVersion,
logger: logger)
let script = try scriptManager.script(atPath: dangerfilePath)

let configPath = NSTemporaryDirectory() + "config.xcconfig"

try createConfig(atPath: configPath, libPath: absoluteLibPath, libsImport: libsImport)

try script.setupForEdit(importedFiles: importedFiles, configPath: configPath)
Copy link
Member Author

@417-72KI 417-72KI Jan 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No flags can be set on Package.swift, and needs Danger package as a default dependency instead.
https://github.com/danger/swift/pull/566/files?w=1#diff-b040c9d7cf1d8a4d0275190fb078df8712464dcb18a89b281f9a93145610068dR16

This may resolves #464 only on danger-swift edit.

try script.setupForEdit(importedFiles: importedFiles)
try script.watch(importedFiles: importedFiles)
}

Expand Down
Loading