From bbc2ff6e314dd0014264363f8e0d5e0dbca7b9fa Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 12 Jan 2019 20:48:47 +0000 Subject: [PATCH 01/15] Create class to manager SPMDanger --- Sources/RunnerLib/SPMDanger.swift | 25 +++++++++ Tests/RunnerLibTests/MockedExecutor.swift | 11 ++++ Tests/RunnerLibTests/SPMDangerTests.swift | 66 +++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 Sources/RunnerLib/SPMDanger.swift create mode 100644 Tests/RunnerLibTests/MockedExecutor.swift create mode 100644 Tests/RunnerLibTests/SPMDangerTests.swift diff --git a/Sources/RunnerLib/SPMDanger.swift b/Sources/RunnerLib/SPMDanger.swift new file mode 100644 index 00000000..a51d72e6 --- /dev/null +++ b/Sources/RunnerLib/SPMDanger.swift @@ -0,0 +1,25 @@ +import Foundation + +public enum SPMDanger { + private static let depsLibName = "DangerDeps" + + public static func isSPMDanger(packagePath: String = "Package.swift") -> Bool { + guard let packageContent = try? String(contentsOfFile: packagePath) else { + return false + } + + return packageContent.contains(".library(name: \"\(depsLibName)\"") + } + + public static func buildDepsIfNeeded(executor: ShellOutExecuting = ShellOutExecutor(), + fileManager: FileManager = .default) { + if !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).dylib") && // OSX + !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).so") { // Linux + _ = try? executor.shellOut(command: "swift build --product \(depsLibName)") + } + } + + public static var libImport: String { + return "-l\(depsLibName)" + } +} diff --git a/Tests/RunnerLibTests/MockedExecutor.swift b/Tests/RunnerLibTests/MockedExecutor.swift new file mode 100644 index 00000000..030ab367 --- /dev/null +++ b/Tests/RunnerLibTests/MockedExecutor.swift @@ -0,0 +1,11 @@ +import RunnerLib + +final class MockedExecutor: ShellOutExecuting { + var receivedCommand: String! + var result = "" + + func shellOut(command: String) throws -> String { + receivedCommand = command + return result + } +} diff --git a/Tests/RunnerLibTests/SPMDangerTests.swift b/Tests/RunnerLibTests/SPMDangerTests.swift new file mode 100644 index 00000000..f0618ead --- /dev/null +++ b/Tests/RunnerLibTests/SPMDangerTests.swift @@ -0,0 +1,66 @@ +import XCTest +@testable import RunnerLib + +final class SPMDangerTests: XCTestCase { + let testPackage = "testPackage.swift" + + override func setUp() { + super.setUp() + } + + override func tearDown() { + super.tearDown() + } + + func testItReturnsTrueWhenThePackageHasTheDangerLib() { + try! ".library(name: \"DangerDeps\"".write(toFile: testPackage, atomically: false, encoding: .utf8) + + XCTAssertTrue(SPMDanger.isSPMDanger(packagePath: testPackage)) + + try? FileManager.default.removeItem(atPath: testPackage) + } + + func testItReturnsFalseWhenThePackageHasNotTheDangerLib() { + try! "".write(toFile: testPackage, atomically: false, encoding: .utf8) + + XCTAssertFalse(SPMDanger.isSPMDanger(packagePath: testPackage)) + + try? FileManager.default.removeItem(atPath: testPackage) + } + + func testItReturnsFalseWhenThereIsNoPackage() { + XCTAssertFalse(SPMDanger.isSPMDanger(packagePath: testPackage)) + } + + func testItBuildsTheDependenciesIfTheDepsLibIsNotPresent() { + let executor = MockedExecutor() + let fileManager = StubbedFileManager() + fileManager.stubbedFileExists = false + + SPMDanger.buildDepsIfNeeded(executor: executor, fileManager: fileManager) + + XCTAssertTrue(executor.receivedCommand == "swift build --product DangerDeps") + } + + func testItDoesntBuildTheDependenciesIfTheDepsLibIsPresent() { + let executor = MockedExecutor() + let fileManager = StubbedFileManager() + fileManager.stubbedFileExists = true + + SPMDanger.buildDepsIfNeeded(executor: executor, fileManager: fileManager) + + XCTAssertTrue(executor.receivedCommand == nil) + } + + func testItReturnsTheCorrectDepsImport() { + XCTAssertEqual(SPMDanger.libImport, "-lDangerDeps") + } +} + +private class StubbedFileManager: FileManager { + fileprivate var stubbedFileExists: Bool = true + + override func fileExists(atPath path: String) -> Bool { + return stubbedFileExists + } +} From 79d0a3cbcf2157d4dec38e4adda2ae2103f5a3d6 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 12 Jan 2019 20:52:25 +0000 Subject: [PATCH 02/15] Setup a target for Danger dependencies on the Package.swift --- Package.swift | 3 +++ Sources/Danger-Swift/Fake.swift | 1 + 2 files changed, 4 insertions(+) create mode 100644 Sources/Danger-Swift/Fake.swift diff --git a/Package.swift b/Package.swift index b451797f..3e8cc16d 100644 --- a/Package.swift +++ b/Package.swift @@ -9,6 +9,7 @@ let package = Package( products: [ .library(name: "Danger", type: .dynamic, targets: ["Danger"]), .library(name: "DangerFixtures", type: .dynamic, targets: ["DangerFixtures"]), + .library(name: "DangerDeps", type: .dynamic, targets: ["Danger-Swift"]), // dev .executable(name: "danger-swift", targets: ["Runner"]), ], dependencies: [ @@ -23,8 +24,10 @@ let package = Package( .package(url: "https://github.com/nicklockwood/SwiftFormat", from: "0.35.8"), // dev .package(url: "https://github.com/Realm/SwiftLint", from: "0.28.1"), // dev .package(url: "https://github.com/f-meloni/Rocket", from: "0.4.0"), // dev + .package(url: "https://github.com/jpsim/Yams.git", from: "1.0.0"), // dev ], targets: [ + .target(name: "Danger-Swift", dependencies: ["Danger", "Yams"], path: "Sources/Danger-Swift", sources: ["Fake.swift"]), // dev .target(name: "Danger", dependencies: ["ShellOut", "OctoKit", "Logger"]), .target(name: "RunnerLib", dependencies: ["Logger", "ShellOut"]), .target(name: "Runner", dependencies: ["RunnerLib", "MarathonCore", "Logger"]), diff --git a/Sources/Danger-Swift/Fake.swift b/Sources/Danger-Swift/Fake.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Sources/Danger-Swift/Fake.swift @@ -0,0 +1 @@ + From ca7ea39853e3dc8f43ebf56f77dfc9981b1d8c85 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 12 Jan 2019 20:53:50 +0000 Subject: [PATCH 03/15] Support also swift from SPM --- Dangerfile.swift | 5 ++ Sources/Runner/Commands/Runner.swift | 82 ++++++++++--------- Sources/RunnerLib/DangerJSVersionFinder.swift | 3 + Sources/RunnerLib/SPMDanger.swift | 10 +-- .../DangerJSVersionFinderTests.swift | 10 --- Tests/RunnerLibTests/MockedExecutor.swift | 2 +- Tests/RunnerLibTests/SPMDangerTests.swift | 40 ++++----- Tests/RunnerLibTests/XCTestManifests.swift | 12 +++ 8 files changed, 91 insertions(+), 73 deletions(-) diff --git a/Dangerfile.swift b/Dangerfile.swift index d39efce7..bfae2300 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -1,8 +1,13 @@ import Danger import Foundation +import Yams // package: https://github.com/jpsim/Yams let danger = Danger() +let travisYaml = try! String(contentsOfFile: ".travis.yml") +let travis = try! Yams.load(yaml: travisYaml) as! [String: Any] +message(travis.description) + // fileImport: DangerfileExtensions/ChangelogCheck.swift checkChangelog() diff --git a/Sources/Runner/Commands/Runner.swift b/Sources/Runner/Commands/Runner.swift index d4ca4225..588a6b16 100644 --- a/Sources/Runner/Commands/Runner.swift +++ b/Sources/Runner/Commands/Runner.swift @@ -48,45 +48,56 @@ func runDanger(logger: Logger) throws { } logger.debug("Running Dangerfile at: \(dangerfilePath)") - guard let libDangerPath = Runtime.getLibDangerPath() else { - let potentialFolders = Runtime.potentialLibraryFolders - logger.logError("Could not find a libDanger to link against at any of: \(potentialFolders)", - "Or via Homebrew, or Marathon", - separator: "\n") - exit(1) - } - var libArgs: [String] = [] - libArgs += ["-L", libDangerPath] // Link to libDanger inside this folder - libArgs += ["-I", libDangerPath] // Find libDanger inside this folder // Set up plugin infra let importsOnly = try File(path: dangerfilePath).readAsString() - let importExternalDeps = importsOnly.components(separatedBy: .newlines).filter { $0.hasPrefix("import") && $0.contains("package: ") } // swiftlint:disable:this line_length - - if importExternalDeps.count > 0 { - logger.logInfo("Cloning and building inline dependencies:", - "\(importExternalDeps.joined(separator: ", ")),", - "this might take some time.") - - try Folder(path: ".").createFileIfNeeded(withName: "_dangerfile_imports.swift") - let tempDangerfile = try File(path: "_dangerfile_imports.swift") - try tempDangerfile.write(string: importExternalDeps.joined(separator: "\n")) - defer { try? tempDangerfile.delete() } - - let scriptManager = try getScriptManager(logger) - let script = try scriptManager.script(atPath: tempDangerfile.path, allowRemote: true) - - try script.build() - let marathonPath = script.folder.path - let artifactPaths = [".build/debug", ".build/release"] - - let marathonLibPath = artifactPaths.first(where: { fileManager.fileExists(atPath: marathonPath + $0) }) - if marathonLibPath != nil { - libArgs += ["-L", marathonPath + marathonLibPath!] - libArgs += ["-I", marathonPath + marathonLibPath!] - libArgs += ["-lMarathonDependencies"] + + if SPMDanger.isSPMDanger() { + SPMDanger.buildDepsIfNeeded() + libArgs += ["-L", ".build/debug"] // Link to libDanger inside this folder + libArgs += ["-I", ".build/debug"] // Find libDanger inside this folder + libArgs += [SPMDanger.libImport] + } else { + guard let libDangerPath = Runtime.getLibDangerPath() else { + let potentialFolders = Runtime.potentialLibraryFolders + logger.logError("Could not find a libDanger to link against at any of: \(potentialFolders)", + "Or via Homebrew, or Marathon", + separator: "\n") + exit(1) + } + + libArgs += ["-L", libDangerPath] // Link to libDanger inside this folder + libArgs += ["-I", libDangerPath] // Find libDanger inside this folder + + let importExternalDeps = importsOnly.components(separatedBy: .newlines).filter { $0.hasPrefix("import") && $0.contains("package: ") } // swiftlint:disable:this line_length + + if importExternalDeps.count > 0 { + logger.logInfo("Cloning and building inline dependencies:", + "\(importExternalDeps.joined(separator: ", ")),", + "this might take some time.") + + try Folder(path: ".").createFileIfNeeded(withName: "_dangerfile_imports.swift") + let tempDangerfile = try File(path: "_dangerfile_imports.swift") + try tempDangerfile.write(string: importExternalDeps.joined(separator: "\n")) + defer { try? tempDangerfile.delete() } + + let scriptManager = try getScriptManager(logger) + let script = try scriptManager.script(atPath: tempDangerfile.path, allowRemote: true) + + try script.build() + let marathonPath = script.folder.path + let artifactPaths = [".build/debug", ".build/release"] + + let marathonLibPath = artifactPaths.first(where: { fileManager.fileExists(atPath: marathonPath + $0) }) + if marathonLibPath != nil { + libArgs += ["-L", marathonPath + marathonLibPath!] + libArgs += ["-I", marathonPath + marathonLibPath!] + libArgs += ["-lMarathonDependencies"] + } } + + libArgs += ["-lDanger"] // Eval the code with the Target Danger added } logger.debug("Preparing to compile") @@ -112,9 +123,6 @@ func runDanger(logger: Logger) throws { var args = [String]() args += ["--driver-mode=swift"] // Eval in swift mode, I think? - args += ["-L", libDangerPath] // Find libs inside this folder - args += ["-I", libDangerPath] // Find libs inside this folder - args += ["-lDanger"] // Eval the code with the Target Danger added args += libArgs args += [tempDangerfilePath] // The Dangerfile args += Array(CommandLine.arguments.dropFirst()) // Arguments sent to Danger diff --git a/Sources/RunnerLib/DangerJSVersionFinder.swift b/Sources/RunnerLib/DangerJSVersionFinder.swift index 1436883a..5d3966da 100644 --- a/Sources/RunnerLib/DangerJSVersionFinder.swift +++ b/Sources/RunnerLib/DangerJSVersionFinder.swift @@ -14,10 +14,13 @@ public final class DangerJSVersionFinder { } public protocol ShellOutExecuting { + @discardableResult func shellOut(command: String) throws -> String } public struct ShellOutExecutor: ShellOutExecuting { + public init() {} + public func shellOut(command: String) throws -> String { return try ShellOut.shellOut(to: command) } diff --git a/Sources/RunnerLib/SPMDanger.swift b/Sources/RunnerLib/SPMDanger.swift index a51d72e6..e3f12d41 100644 --- a/Sources/RunnerLib/SPMDanger.swift +++ b/Sources/RunnerLib/SPMDanger.swift @@ -2,23 +2,23 @@ import Foundation public enum SPMDanger { private static let depsLibName = "DangerDeps" - + public static func isSPMDanger(packagePath: String = "Package.swift") -> Bool { guard let packageContent = try? String(contentsOfFile: packagePath) else { return false } - + return packageContent.contains(".library(name: \"\(depsLibName)\"") } - + public static func buildDepsIfNeeded(executor: ShellOutExecuting = ShellOutExecutor(), fileManager: FileManager = .default) { - if !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).dylib") && // OSX + if !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).dylib"), // OSX !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).so") { // Linux _ = try? executor.shellOut(command: "swift build --product \(depsLibName)") } } - + public static var libImport: String { return "-l\(depsLibName)" } diff --git a/Tests/RunnerLibTests/DangerJSVersionFinderTests.swift b/Tests/RunnerLibTests/DangerJSVersionFinderTests.swift index 1bb63b2c..1c385853 100644 --- a/Tests/RunnerLibTests/DangerJSVersionFinderTests.swift +++ b/Tests/RunnerLibTests/DangerJSVersionFinderTests.swift @@ -14,13 +14,3 @@ final class DangerJSVersionFinderTests: XCTestCase { XCTAssertEqual(version, executor.result) } } - -private final class MockedExecutor: ShellOutExecuting { - var receivedCommand: String! - var result = "" - - func shellOut(command: String) throws -> String { - receivedCommand = command - return result - } -} diff --git a/Tests/RunnerLibTests/MockedExecutor.swift b/Tests/RunnerLibTests/MockedExecutor.swift index 030ab367..e63ea801 100644 --- a/Tests/RunnerLibTests/MockedExecutor.swift +++ b/Tests/RunnerLibTests/MockedExecutor.swift @@ -3,7 +3,7 @@ import RunnerLib final class MockedExecutor: ShellOutExecuting { var receivedCommand: String! var result = "" - + func shellOut(command: String) throws -> String { receivedCommand = command return result diff --git a/Tests/RunnerLibTests/SPMDangerTests.swift b/Tests/RunnerLibTests/SPMDangerTests.swift index f0618ead..df7f3e2c 100644 --- a/Tests/RunnerLibTests/SPMDangerTests.swift +++ b/Tests/RunnerLibTests/SPMDangerTests.swift @@ -1,57 +1,57 @@ -import XCTest @testable import RunnerLib +import XCTest final class SPMDangerTests: XCTestCase { let testPackage = "testPackage.swift" - + override func setUp() { - super.setUp() + super.setUp() } override func tearDown() { - super.tearDown() + super.tearDown() } - + func testItReturnsTrueWhenThePackageHasTheDangerLib() { try! ".library(name: \"DangerDeps\"".write(toFile: testPackage, atomically: false, encoding: .utf8) - + XCTAssertTrue(SPMDanger.isSPMDanger(packagePath: testPackage)) - + try? FileManager.default.removeItem(atPath: testPackage) } - + func testItReturnsFalseWhenThePackageHasNotTheDangerLib() { try! "".write(toFile: testPackage, atomically: false, encoding: .utf8) - + XCTAssertFalse(SPMDanger.isSPMDanger(packagePath: testPackage)) - + try? FileManager.default.removeItem(atPath: testPackage) } - + func testItReturnsFalseWhenThereIsNoPackage() { XCTAssertFalse(SPMDanger.isSPMDanger(packagePath: testPackage)) } - + func testItBuildsTheDependenciesIfTheDepsLibIsNotPresent() { let executor = MockedExecutor() let fileManager = StubbedFileManager() fileManager.stubbedFileExists = false - + SPMDanger.buildDepsIfNeeded(executor: executor, fileManager: fileManager) - + XCTAssertTrue(executor.receivedCommand == "swift build --product DangerDeps") } - + func testItDoesntBuildTheDependenciesIfTheDepsLibIsPresent() { let executor = MockedExecutor() let fileManager = StubbedFileManager() fileManager.stubbedFileExists = true - + SPMDanger.buildDepsIfNeeded(executor: executor, fileManager: fileManager) - + XCTAssertTrue(executor.receivedCommand == nil) } - + func testItReturnsTheCorrectDepsImport() { XCTAssertEqual(SPMDanger.libImport, "-lDangerDeps") } @@ -59,8 +59,8 @@ final class SPMDangerTests: XCTestCase { private class StubbedFileManager: FileManager { fileprivate var stubbedFileExists: Bool = true - - override func fileExists(atPath path: String) -> Bool { + + override func fileExists(atPath _: String) -> Bool { return stubbedFileExists } } diff --git a/Tests/RunnerLibTests/XCTestManifests.swift b/Tests/RunnerLibTests/XCTestManifests.swift index 67445470..c5c29139 100644 --- a/Tests/RunnerLibTests/XCTestManifests.swift +++ b/Tests/RunnerLibTests/XCTestManifests.swift @@ -42,6 +42,17 @@ extension ImportsFinderTests { ] } +extension SPMDangerTests { + static let __allTests = [ + ("testItBuildsTheDependenciesIfTheDepsLibIsNotPresent", testItBuildsTheDependenciesIfTheDepsLibIsNotPresent), + ("testItDoesntBuildTheDependenciesIfTheDepsLibIsPresent", testItDoesntBuildTheDependenciesIfTheDepsLibIsPresent), + ("testItReturnsFalseWhenThePackageHasNotTheDangerLib", testItReturnsFalseWhenThePackageHasNotTheDangerLib), + ("testItReturnsFalseWhenThereIsNoPackage", testItReturnsFalseWhenThereIsNoPackage), + ("testItReturnsTheCorrectDepsImport", testItReturnsTheCorrectDepsImport), + ("testItReturnsTrueWhenThePackageHasTheDangerLib", testItReturnsTrueWhenThePackageHasTheDangerLib), + ] +} + #if !os(macOS) public func __allTests() -> [XCTestCaseEntry] { return [ @@ -51,6 +62,7 @@ extension ImportsFinderTests { testCase(DangerJSVersionFinderTests.__allTests), testCase(HelpMessagePresenterTests.__allTests), testCase(ImportsFinderTests.__allTests), + testCase(SPMDangerTests.__allTests), ] } #endif From 7654d2411125078255687e73d8230e784ee810e6 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 12 Jan 2019 20:56:54 +0000 Subject: [PATCH 04/15] Update travis.yml --- .travis.yml | 22 ++++++++++++++++++++++ Sources/Danger-Swift/Fake.swift | 1 - 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0f24d0de..af857ab0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,3 +46,25 @@ matrix: - sudo chmod -R a+rwx /usr/local/ - make install - DEBUG="*" danger-swift ci + + - os: osx + name: Danger with SPM + osx_image: xcode10 + install: + - node -v + - npm install -g danger + script: + - swift run danger-swift + + - os: linux + name: Danger with SPM + language: generic + sudo: required + dist: trusty + install: + - node -v + - npm install -g danger + - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" + - swiftenv global 4.2 + script: + - swift run danger-swift diff --git a/Sources/Danger-Swift/Fake.swift b/Sources/Danger-Swift/Fake.swift index 8b137891..e69de29b 100644 --- a/Sources/Danger-Swift/Fake.swift +++ b/Sources/Danger-Swift/Fake.swift @@ -1 +0,0 @@ - From 31e1538de3d08d3721f8fd4554ba47d8cfc2b110 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 12 Jan 2019 21:04:37 +0000 Subject: [PATCH 05/15] Use correct danger swift command --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index af857ab0..e5795169 100644 --- a/.travis.yml +++ b/.travis.yml @@ -54,7 +54,7 @@ matrix: - node -v - npm install -g danger script: - - swift run danger-swift + - swift run danger-swift ci - os: linux name: Danger with SPM @@ -67,4 +67,4 @@ matrix: - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" - swiftenv global 4.2 script: - - swift run danger-swift + - swift run danger-swift ci From d75043b37646029c6e1fb98335b06f04fc95327a Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 12 Jan 2019 23:42:36 +0000 Subject: [PATCH 06/15] Make danger edit work also with SPM danger --- Dangerfile.swift | 2 +- Sources/Danger-Swift/Fake.swift | 1 + Sources/Runner/Commands/Edit.swift | 32 +++++++++++++++++++++--------- Sources/Runner/EditXcodeProj.swift | 8 ++++---- Sources/Runner/main.swift | 9 +++++---- Sources/RunnerLib/SPMDanger.swift | 7 ++++--- 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Dangerfile.swift b/Dangerfile.swift index bfae2300..77e91286 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -1,6 +1,6 @@ import Danger import Foundation -import Yams // package: https://github.com/jpsim/Yams +import Yams // package: https://github.com/jpsim/Yams.git let danger = Danger() diff --git a/Sources/Danger-Swift/Fake.swift b/Sources/Danger-Swift/Fake.swift index e69de29b..8b137891 100644 --- a/Sources/Danger-Swift/Fake.swift +++ b/Sources/Danger-Swift/Fake.swift @@ -0,0 +1 @@ + diff --git a/Sources/Runner/Commands/Edit.swift b/Sources/Runner/Commands/Edit.swift index 0c10cce9..dd9f7bac 100644 --- a/Sources/Runner/Commands/Edit.swift +++ b/Sources/Runner/Commands/Edit.swift @@ -20,12 +20,24 @@ func editDanger(logger: Logger) throws { // If dangerfile was not found, attempt to create one at Dangerfile.swift let dangerfilePath = Runtime.getDangerfile() ?? createDangerfile() - guard let libPath = Runtime.getLibDangerPath() else { - let potentialFolders = Runtime.potentialLibraryFolders - logger.logError("Could not find a libDanger to link against at any of: \(potentialFolders)", - "Or via Homebrew, or Marathon", - separator: "\n") - exit(1) + let absoluteLibPath: String + let libName: String + + if SPMDanger.isSPMDanger() { + SPMDanger.buildDepsIfNeeded() + absoluteLibPath = FileManager.default.currentDirectoryPath + "/" + SPMDanger.buildFolder + libName = SPMDanger.depsLibName + } else { + guard let libPath = Runtime.getLibDangerPath() else { + let potentialFolders = Runtime.potentialLibraryFolders + logger.logError("Could not find a libDanger to link against at any of: \(potentialFolders)", + "Or via Homebrew, or Marathon", + separator: "\n") + exit(1) + } + + absoluteLibPath = try Folder(path: libPath).path + libName = "Danger" } guard let dangerfileContent = try? File(path: dangerfilePath).readAsString() else { @@ -36,18 +48,20 @@ func editDanger(logger: Logger) throws { let importsFinder = ImportsFinder() let importedFiles = importsFinder.findImports(inString: dangerfileContent) - let absoluteLibPath = try Folder(path: libPath).path - let arguments = CommandLine.arguments + logger.logInfo("Script manager") let scriptManager = try getScriptManager(logger) + logger.logInfo("Create script") let script = try scriptManager.script(atPath: dangerfilePath, allowRemote: true) let path = NSTemporaryDirectory() let configPath = path + "config.xcconfig" - try createConfig(atPath: configPath, lib: absoluteLibPath) + try createConfig(atPath: configPath, libPath: absoluteLibPath, libName: libName) + logger.logInfo("Config created at \(configPath)") try script.setupForEdit(arguments: arguments, importedFiles: importedFiles, configPath: configPath) + logger.logInfo("Edit") try script.watch(arguments: arguments, importedFiles: importedFiles) } diff --git a/Sources/Runner/EditXcodeProj.swift b/Sources/Runner/EditXcodeProj.swift index 0edf4092..60b808e8 100644 --- a/Sources/Runner/EditXcodeProj.swift +++ b/Sources/Runner/EditXcodeProj.swift @@ -2,11 +2,11 @@ import Files import Foundation // Creates an xcconfig file that can be used to correctly link danger library to the xcodeproj -func createConfig(atPath configPath: String, lib: String) throws { +func createConfig(atPath configPath: String, libPath: String, libName: String) throws { let config = """ - LIBRARY_SEARCH_PATHS = \(lib) - OTHER_SWIFT_FLAGS = -DXcode -I \(lib) -L \(lib) - OTHER_LDFLAGS = -l danger + LIBRARY_SEARCH_PATHS = \(libPath) + OTHER_SWIFT_FLAGS = -DXcode -I \(libPath) -L \(libPath) + OTHER_LDFLAGS = -l \(libName) """ try config.write(toFile: configPath, atomically: false, encoding: .utf8) diff --git a/Sources/Runner/main.swift b/Sources/Runner/main.swift index 01612d3f..d16e8b55 100644 --- a/Sources/Runner/main.swift +++ b/Sources/Runner/main.swift @@ -19,11 +19,11 @@ private func runCommand(_ command: DangerCommand, logger: Logger) throws { } let cliLength = ProcessInfo.processInfo.arguments.count -do { - let isVerbose = CommandLine.arguments.contains("--verbose") || (ProcessInfo.processInfo.environment["DEBUG"] != nil) - let isSilent = CommandLine.arguments.contains("--silent") - let logger = Logger(isVerbose: isVerbose, isSilent: isSilent) +let isVerbose = CommandLine.arguments.contains("--verbose") || (ProcessInfo.processInfo.environment["DEBUG"] != nil) +let isSilent = CommandLine.arguments.contains("--silent") +let logger = Logger(isVerbose: isVerbose, isSilent: isSilent) +do { if cliLength > 1 { logger.debug("Launching Danger Swift \(CommandLine.arguments[1]) (v\(DangerVersion))") @@ -43,5 +43,6 @@ do { try runDanger(logger: logger) } } catch { + logger.logError(error) exit(1) } diff --git a/Sources/RunnerLib/SPMDanger.swift b/Sources/RunnerLib/SPMDanger.swift index e3f12d41..dbf6e2a5 100644 --- a/Sources/RunnerLib/SPMDanger.swift +++ b/Sources/RunnerLib/SPMDanger.swift @@ -1,7 +1,8 @@ import Foundation public enum SPMDanger { - private static let depsLibName = "DangerDeps" + public static let depsLibName = "DangerDeps" + public static let buildFolder = ".build/debug" public static func isSPMDanger(packagePath: String = "Package.swift") -> Bool { guard let packageContent = try? String(contentsOfFile: packagePath) else { @@ -13,8 +14,8 @@ public enum SPMDanger { public static func buildDepsIfNeeded(executor: ShellOutExecuting = ShellOutExecutor(), fileManager: FileManager = .default) { - if !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).dylib"), // OSX - !fileManager.fileExists(atPath: ".build/debug/lib\(depsLibName).so") { // Linux + if !fileManager.fileExists(atPath: "\(buildFolder)/lib\(depsLibName).dylib"), // OSX + !fileManager.fileExists(atPath: "\(buildFolder)/lib\(depsLibName).so") { // Linux _ = try? executor.shellOut(command: "swift build --product \(depsLibName)") } } From ea9e88f83fc2945407105cda213863be3e17d6ca Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sun, 13 Jan 2019 17:33:55 +0000 Subject: [PATCH 07/15] Swiftlint the code --- Sources/Danger-Swift/Fake.swift | 1 - Sources/Runner/Commands/Edit.swift | 7 +------ Sources/Runner/main.swift | 4 ++-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Sources/Danger-Swift/Fake.swift b/Sources/Danger-Swift/Fake.swift index 8b137891..e69de29b 100644 --- a/Sources/Danger-Swift/Fake.swift +++ b/Sources/Danger-Swift/Fake.swift @@ -1 +0,0 @@ - diff --git a/Sources/Runner/Commands/Edit.swift b/Sources/Runner/Commands/Edit.swift index dd9f7bac..a149e6a8 100644 --- a/Sources/Runner/Commands/Edit.swift +++ b/Sources/Runner/Commands/Edit.swift @@ -49,19 +49,14 @@ func editDanger(logger: Logger) throws { let importedFiles = importsFinder.findImports(inString: dangerfileContent) let arguments = CommandLine.arguments - logger.logInfo("Script manager") let scriptManager = try getScriptManager(logger) - logger.logInfo("Create script") let script = try scriptManager.script(atPath: dangerfilePath, allowRemote: true) - let path = NSTemporaryDirectory() - let configPath = path + "config.xcconfig" + let configPath = NSTemporaryDirectory() + "config.xcconfig" try createConfig(atPath: configPath, libPath: absoluteLibPath, libName: libName) - logger.logInfo("Config created at \(configPath)") try script.setupForEdit(arguments: arguments, importedFiles: importedFiles, configPath: configPath) - logger.logInfo("Edit") try script.watch(arguments: arguments, importedFiles: importedFiles) } diff --git a/Sources/Runner/main.swift b/Sources/Runner/main.swift index d16e8b55..d8ae0c41 100644 --- a/Sources/Runner/main.swift +++ b/Sources/Runner/main.swift @@ -3,8 +3,8 @@ import Logger import RunnerLib /// Version for showing in verbose mode -let DangerVersion = "1.1.0" -let MinimumDangerJSVersion = "6.1.6" +let DangerVersion = "1.1.0" // swiftlint:disable:this identifier_name +let MinimumDangerJSVersion = "6.1.6" // swiftlint:disable:this identifier_name private func runCommand(_ command: DangerCommand, logger: Logger) throws { switch command { From 8eb7ce7db5219b873ce466d7cb6c4ebc8e27563a Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Tue, 15 Jan 2019 20:59:16 +0000 Subject: [PATCH 08/15] Removed not needed parameters from Package.swift --- Package.swift | 2 +- Sources/Danger-Swift/Fake.swift | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 3e8cc16d..b3c0cbca 100644 --- a/Package.swift +++ b/Package.swift @@ -27,7 +27,7 @@ let package = Package( .package(url: "https://github.com/jpsim/Yams.git", from: "1.0.0"), // dev ], targets: [ - .target(name: "Danger-Swift", dependencies: ["Danger", "Yams"], path: "Sources/Danger-Swift", sources: ["Fake.swift"]), // dev + .target(name: "Danger-Swift", dependencies: ["Danger", "Yams"]), // dev .target(name: "Danger", dependencies: ["ShellOut", "OctoKit", "Logger"]), .target(name: "RunnerLib", dependencies: ["Logger", "ShellOut"]), .target(name: "Runner", dependencies: ["RunnerLib", "MarathonCore", "Logger"]), diff --git a/Sources/Danger-Swift/Fake.swift b/Sources/Danger-Swift/Fake.swift index e69de29b..8b137891 100644 --- a/Sources/Danger-Swift/Fake.swift +++ b/Sources/Danger-Swift/Fake.swift @@ -0,0 +1 @@ + From bfbba5fba6ae40eb11ac1c4aaa76cd0b4643f1f5 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Sat, 19 Jan 2019 20:26:52 +0000 Subject: [PATCH 09/15] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b8fe246..98dc465b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ ## Master +- Support a full Danger SPM usage [#174](https://github.com/danger/danger-swift/pull/174) by [@f-meloni][] + ## 1.1.0 - Make globalResults private by [@f-meloni][] From 7a48ebe792c3f9c1a5cdc14dce40e8fa828a5376 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Wed, 23 Jan 2019 19:00:24 +0000 Subject: [PATCH 10/15] Use SPMDanger.buildFolder --- Sources/Runner/Commands/Runner.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Runner/Commands/Runner.swift b/Sources/Runner/Commands/Runner.swift index 588a6b16..4206f091 100644 --- a/Sources/Runner/Commands/Runner.swift +++ b/Sources/Runner/Commands/Runner.swift @@ -55,8 +55,8 @@ func runDanger(logger: Logger) throws { if SPMDanger.isSPMDanger() { SPMDanger.buildDepsIfNeeded() - libArgs += ["-L", ".build/debug"] // Link to libDanger inside this folder - libArgs += ["-I", ".build/debug"] // Find libDanger inside this folder + libArgs += ["-L", SPMDanger.buildFolder] // Link to libDanger inside this folder + libArgs += ["-I", SPMDanger.buildFolder] // Find libDanger inside this folder libArgs += [SPMDanger.libImport] } else { guard let libDangerPath = Runtime.getLibDangerPath() else { From 2136ff20c9c10ab8a9ddf5b3a848063b06a2e263 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Wed, 23 Jan 2019 19:02:32 +0000 Subject: [PATCH 11/15] Remove comments --- Sources/Runner/Commands/Runner.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Runner/Commands/Runner.swift b/Sources/Runner/Commands/Runner.swift index 4206f091..39a892c3 100644 --- a/Sources/Runner/Commands/Runner.swift +++ b/Sources/Runner/Commands/Runner.swift @@ -55,8 +55,8 @@ func runDanger(logger: Logger) throws { if SPMDanger.isSPMDanger() { SPMDanger.buildDepsIfNeeded() - libArgs += ["-L", SPMDanger.buildFolder] // Link to libDanger inside this folder - libArgs += ["-I", SPMDanger.buildFolder] // Find libDanger inside this folder + libArgs += ["-L", SPMDanger.buildFolder] + libArgs += ["-I", SPMDanger.buildFolder] libArgs += [SPMDanger.libImport] } else { guard let libDangerPath = Runtime.getLibDangerPath() else { From 0b92025a101671a14752fc4a4cfbc2bc21425764 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Thu, 24 Jan 2019 22:18:48 +0000 Subject: [PATCH 12/15] Accept as SPM danger library anything that starts with DangerDeps --- Sources/Danger-Swift/Fake.swift | 1 - Sources/RunnerLib/SPMDanger.swift | 2 +- Tests/RunnerLibTests/SPMDangerTests.swift | 8 ++++++++ Tests/RunnerLibTests/XCTestManifests.swift | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Sources/Danger-Swift/Fake.swift b/Sources/Danger-Swift/Fake.swift index 8b137891..e69de29b 100644 --- a/Sources/Danger-Swift/Fake.swift +++ b/Sources/Danger-Swift/Fake.swift @@ -1 +0,0 @@ - diff --git a/Sources/RunnerLib/SPMDanger.swift b/Sources/RunnerLib/SPMDanger.swift index dbf6e2a5..fed6dd0b 100644 --- a/Sources/RunnerLib/SPMDanger.swift +++ b/Sources/RunnerLib/SPMDanger.swift @@ -9,7 +9,7 @@ public enum SPMDanger { return false } - return packageContent.contains(".library(name: \"\(depsLibName)\"") + return packageContent.contains(".library(name: \"\(depsLibName)") } public static func buildDepsIfNeeded(executor: ShellOutExecuting = ShellOutExecutor(), diff --git a/Tests/RunnerLibTests/SPMDangerTests.swift b/Tests/RunnerLibTests/SPMDangerTests.swift index df7f3e2c..f0a6182e 100644 --- a/Tests/RunnerLibTests/SPMDangerTests.swift +++ b/Tests/RunnerLibTests/SPMDangerTests.swift @@ -20,6 +20,14 @@ final class SPMDangerTests: XCTestCase { try? FileManager.default.removeItem(atPath: testPackage) } + func testItAcceptsAnythingStartsWithDangerDeps() { + try! ".library(name: \"DangerDepsEigen\"".write(toFile: testPackage, atomically: false, encoding: .utf8) + + XCTAssertTrue(SPMDanger.isSPMDanger(packagePath: testPackage)) + + try? FileManager.default.removeItem(atPath: testPackage) + } + func testItReturnsFalseWhenThePackageHasNotTheDangerLib() { try! "".write(toFile: testPackage, atomically: false, encoding: .utf8) diff --git a/Tests/RunnerLibTests/XCTestManifests.swift b/Tests/RunnerLibTests/XCTestManifests.swift index c5c29139..afde8067 100644 --- a/Tests/RunnerLibTests/XCTestManifests.swift +++ b/Tests/RunnerLibTests/XCTestManifests.swift @@ -44,6 +44,7 @@ extension ImportsFinderTests { extension SPMDangerTests { static let __allTests = [ + ("testItAcceptsAnythingStartsWithDangerDeps", testItAcceptsAnythingStartsWithDangerDeps), ("testItBuildsTheDependenciesIfTheDepsLibIsNotPresent", testItBuildsTheDependenciesIfTheDepsLibIsNotPresent), ("testItDoesntBuildTheDependenciesIfTheDepsLibIsPresent", testItDoesntBuildTheDependenciesIfTheDepsLibIsPresent), ("testItReturnsFalseWhenThePackageHasNotTheDangerLib", testItReturnsFalseWhenThePackageHasNotTheDangerLib), From f0c89f64dcde5a8b6d7a79567e8a5815e5c3e216 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Fri, 25 Jan 2019 22:37:29 +0000 Subject: [PATCH 13/15] Fix SPM Danger to actually work with any library that starts with DangerDeps --- Sources/Runner/Commands/Edit.swift | 6 ++--- Sources/Runner/Commands/Runner.swift | 6 ++--- Sources/RunnerLib/SPMDanger.swift | 31 ++++++++++++++--------- Tests/RunnerLibTests/SPMDangerTests.swift | 29 +++++++++------------ 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Sources/Runner/Commands/Edit.swift b/Sources/Runner/Commands/Edit.swift index a149e6a8..c34f5174 100644 --- a/Sources/Runner/Commands/Edit.swift +++ b/Sources/Runner/Commands/Edit.swift @@ -23,10 +23,10 @@ func editDanger(logger: Logger) throws { let absoluteLibPath: String let libName: String - if SPMDanger.isSPMDanger() { - SPMDanger.buildDepsIfNeeded() + if let spmDanger = SPMDanger() { + spmDanger.buildDepsIfNeeded() absoluteLibPath = FileManager.default.currentDirectoryPath + "/" + SPMDanger.buildFolder - libName = SPMDanger.depsLibName + libName = spmDanger.depsLibName } else { guard let libPath = Runtime.getLibDangerPath() else { let potentialFolders = Runtime.potentialLibraryFolders diff --git a/Sources/Runner/Commands/Runner.swift b/Sources/Runner/Commands/Runner.swift index 39a892c3..501bf8a6 100644 --- a/Sources/Runner/Commands/Runner.swift +++ b/Sources/Runner/Commands/Runner.swift @@ -53,11 +53,11 @@ func runDanger(logger: Logger) throws { // Set up plugin infra let importsOnly = try File(path: dangerfilePath).readAsString() - if SPMDanger.isSPMDanger() { - SPMDanger.buildDepsIfNeeded() + if let spmDanger = SPMDanger() { + spmDanger.buildDepsIfNeeded() libArgs += ["-L", SPMDanger.buildFolder] libArgs += ["-I", SPMDanger.buildFolder] - libArgs += [SPMDanger.libImport] + libArgs += [spmDanger.libImport] } else { guard let libDangerPath = Runtime.getLibDangerPath() else { let potentialFolders = Runtime.potentialLibraryFolders diff --git a/Sources/RunnerLib/SPMDanger.swift b/Sources/RunnerLib/SPMDanger.swift index fed6dd0b..3ef8a0e1 100644 --- a/Sources/RunnerLib/SPMDanger.swift +++ b/Sources/RunnerLib/SPMDanger.swift @@ -1,26 +1,33 @@ import Foundation -public enum SPMDanger { - public static let depsLibName = "DangerDeps" +public struct SPMDanger { + private static let dangerDepsPrefix = "DangerDeps" public static let buildFolder = ".build/debug" + public let depsLibName: String - public static func isSPMDanger(packagePath: String = "Package.swift") -> Bool { - guard let packageContent = try? String(contentsOfFile: packagePath) else { - return false - } + public init?(packagePath: String = "Package.swift") { + let packageContent = (try? String(contentsOfFile: packagePath)) ?? "" + + let regex = try? NSRegularExpression(pattern: "\\.library\\(name:[\\ ]?\"(\(SPMDanger.dangerDepsPrefix)[A-Za-z]*)", options: .allowCommentsAndWhitespace) + let firstMatch = regex?.firstMatch(in: packageContent, options: .withTransparentBounds, range: NSRange(location: 0, length: packageContent.count)) - return packageContent.contains(".library(name: \"\(depsLibName)") + if let depsLibNameRange = firstMatch?.range(at: 1), + let range = Range(depsLibNameRange, in: packageContent) { + depsLibName = String(packageContent[range]) + } else { + return nil + } } - public static func buildDepsIfNeeded(executor: ShellOutExecuting = ShellOutExecutor(), - fileManager: FileManager = .default) { - if !fileManager.fileExists(atPath: "\(buildFolder)/lib\(depsLibName).dylib"), // OSX - !fileManager.fileExists(atPath: "\(buildFolder)/lib\(depsLibName).so") { // Linux + public func buildDepsIfNeeded(executor: ShellOutExecuting = ShellOutExecutor(), + fileManager: FileManager = .default) { + if !fileManager.fileExists(atPath: "\(SPMDanger.buildFolder)/lib\(depsLibName).dylib"), // OSX + !fileManager.fileExists(atPath: "\(SPMDanger.buildFolder)/lib\(depsLibName).so") { // Linux _ = try? executor.shellOut(command: "swift build --product \(depsLibName)") } } - public static var libImport: String { + public var libImport: String { return "-l\(depsLibName)" } } diff --git a/Tests/RunnerLibTests/SPMDangerTests.swift b/Tests/RunnerLibTests/SPMDangerTests.swift index f0a6182e..67fdf734 100644 --- a/Tests/RunnerLibTests/SPMDangerTests.swift +++ b/Tests/RunnerLibTests/SPMDangerTests.swift @@ -4,40 +4,33 @@ import XCTest final class SPMDangerTests: XCTestCase { let testPackage = "testPackage.swift" - override func setUp() { - super.setUp() - } - override func tearDown() { super.tearDown() + try? FileManager.default.removeItem(atPath: testPackage) } func testItReturnsTrueWhenThePackageHasTheDangerLib() { try! ".library(name: \"DangerDeps\"".write(toFile: testPackage, atomically: false, encoding: .utf8) - XCTAssertTrue(SPMDanger.isSPMDanger(packagePath: testPackage)) - - try? FileManager.default.removeItem(atPath: testPackage) + let spmDanger = SPMDanger(packagePath: testPackage) + XCTAssertEqual(spmDanger?.depsLibName, "DangerDeps") } func testItAcceptsAnythingStartsWithDangerDeps() { try! ".library(name: \"DangerDepsEigen\"".write(toFile: testPackage, atomically: false, encoding: .utf8) - XCTAssertTrue(SPMDanger.isSPMDanger(packagePath: testPackage)) - - try? FileManager.default.removeItem(atPath: testPackage) + let spmDanger = SPMDanger(packagePath: testPackage) + XCTAssertEqual(spmDanger?.depsLibName, "DangerDepsEigen") } func testItReturnsFalseWhenThePackageHasNotTheDangerLib() { try! "".write(toFile: testPackage, atomically: false, encoding: .utf8) - XCTAssertFalse(SPMDanger.isSPMDanger(packagePath: testPackage)) - - try? FileManager.default.removeItem(atPath: testPackage) + XCTAssertNil(SPMDanger(packagePath: testPackage)) } func testItReturnsFalseWhenThereIsNoPackage() { - XCTAssertFalse(SPMDanger.isSPMDanger(packagePath: testPackage)) + XCTAssertNil(SPMDanger(packagePath: testPackage)) } func testItBuildsTheDependenciesIfTheDepsLibIsNotPresent() { @@ -45,7 +38,8 @@ final class SPMDangerTests: XCTestCase { let fileManager = StubbedFileManager() fileManager.stubbedFileExists = false - SPMDanger.buildDepsIfNeeded(executor: executor, fileManager: fileManager) + try! ".library(name: \"DangerDeps\"".write(toFile: testPackage, atomically: false, encoding: .utf8) + SPMDanger(packagePath: testPackage)?.buildDepsIfNeeded(executor: executor, fileManager: fileManager) XCTAssertTrue(executor.receivedCommand == "swift build --product DangerDeps") } @@ -55,13 +49,14 @@ final class SPMDangerTests: XCTestCase { let fileManager = StubbedFileManager() fileManager.stubbedFileExists = true - SPMDanger.buildDepsIfNeeded(executor: executor, fileManager: fileManager) + SPMDanger(packagePath: testPackage)?.buildDepsIfNeeded(executor: executor, fileManager: fileManager) XCTAssertTrue(executor.receivedCommand == nil) } func testItReturnsTheCorrectDepsImport() { - XCTAssertEqual(SPMDanger.libImport, "-lDangerDeps") + try! ".library(name: \"DangerDepsEigen\"".write(toFile: testPackage, atomically: false, encoding: .utf8) + XCTAssertEqual(SPMDanger(packagePath: testPackage)?.libImport, "-lDangerDepsEigen") } } From 08e2d1091fb37ef11076f59489cb55bedca155bd Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Fri, 25 Jan 2019 22:40:03 +0000 Subject: [PATCH 14/15] Remove Yams test import --- Dangerfile.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Dangerfile.swift b/Dangerfile.swift index 77e91286..d39efce7 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -1,13 +1,8 @@ import Danger import Foundation -import Yams // package: https://github.com/jpsim/Yams.git let danger = Danger() -let travisYaml = try! String(contentsOfFile: ".travis.yml") -let travis = try! Yams.load(yaml: travisYaml) as! [String: Any] -message(travis.description) - // fileImport: DangerfileExtensions/ChangelogCheck.swift checkChangelog() From fd6679e538fd3c9131c25911c6e88a732124602c Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Fri, 25 Jan 2019 23:01:54 +0000 Subject: [PATCH 15/15] Swiftlint fix --- Sources/RunnerLib/SPMDanger.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Sources/RunnerLib/SPMDanger.swift b/Sources/RunnerLib/SPMDanger.swift index 3ef8a0e1..214a4b2a 100644 --- a/Sources/RunnerLib/SPMDanger.swift +++ b/Sources/RunnerLib/SPMDanger.swift @@ -8,8 +8,11 @@ public struct SPMDanger { public init?(packagePath: String = "Package.swift") { let packageContent = (try? String(contentsOfFile: packagePath)) ?? "" - let regex = try? NSRegularExpression(pattern: "\\.library\\(name:[\\ ]?\"(\(SPMDanger.dangerDepsPrefix)[A-Za-z]*)", options: .allowCommentsAndWhitespace) - let firstMatch = regex?.firstMatch(in: packageContent, options: .withTransparentBounds, range: NSRange(location: 0, length: packageContent.count)) + let regex = try? NSRegularExpression(pattern: "\\.library\\(name:[\\ ]?\"(\(SPMDanger.dangerDepsPrefix)[A-Za-z]*)", + options: .allowCommentsAndWhitespace) + let firstMatch = regex?.firstMatch(in: packageContent, + options: .withTransparentBounds, + range: NSRange(location: 0, length: packageContent.count)) if let depsLibNameRange = firstMatch?.range(at: 1), let range = Range(depsLibNameRange, in: packageContent) {