From 98c95a21435567b267598a8ef0865513a6003442 Mon Sep 17 00:00:00 2001 From: Yuya Tanaka Date: Wed, 6 Apr 2016 19:32:37 +0900 Subject: [PATCH] Set working directory to workspace root directory --- SwiftLintXcode.xcodeproj/project.pbxproj | 6 +++++ SwiftLintXcode/Formatter.swift | 19 +++++++++++----- .../SwiftLintXcode-Bridging-Header.h | 1 + SwiftLintXcode/SwiftLintXcodeIDEHelper.h | 15 +++++++++++++ SwiftLintXcode/SwiftLintXcodeIDEHelper.m | 22 +++++++++++++++++++ 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 SwiftLintXcode/SwiftLintXcodeIDEHelper.h create mode 100644 SwiftLintXcode/SwiftLintXcodeIDEHelper.m diff --git a/SwiftLintXcode.xcodeproj/project.pbxproj b/SwiftLintXcode.xcodeproj/project.pbxproj index 21c503f..805fa73 100644 --- a/SwiftLintXcode.xcodeproj/project.pbxproj +++ b/SwiftLintXcode.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 0498717F1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498717E1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.m */; }; 049871811CB28EBF00C5F7B5 /* Formatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049871801CB28EBF00C5F7B5 /* Formatter.swift */; }; + 04DFAD471CB508D1007998DF /* SwiftLintXcodeIDEHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 04DFAD461CB508D1007998DF /* SwiftLintXcodeIDEHelper.m */; }; 04DFAD491CB50BC8007998DF /* errorHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DFAD481CB50BC8007998DF /* errorHelper.swift */; }; 04E4BF341CB25D3200BC7305 /* SwiftLintXcode.xcscheme in Resources */ = {isa = PBXBuildFile; fileRef = 04E4BF331CB25D3200BC7305 /* SwiftLintXcode.xcscheme */; }; 04E4BF361CB25D3200BC7305 /* SwiftLintXcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E4BF351CB25D3200BC7305 /* SwiftLintXcode.swift */; }; @@ -21,6 +22,8 @@ 0498717D1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwiftLintXcodeTRVSXcode.h; sourceTree = ""; }; 0498717E1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwiftLintXcodeTRVSXcode.m; sourceTree = ""; }; 049871801CB28EBF00C5F7B5 /* Formatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Formatter.swift; sourceTree = ""; }; + 04DFAD451CB508D1007998DF /* SwiftLintXcodeIDEHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwiftLintXcodeIDEHelper.h; sourceTree = ""; }; + 04DFAD461CB508D1007998DF /* SwiftLintXcodeIDEHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwiftLintXcodeIDEHelper.m; sourceTree = ""; }; 04DFAD481CB50BC8007998DF /* errorHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = errorHelper.swift; sourceTree = ""; }; 04E4BF2F1CB25D3100BC7305 /* SwiftLintXcode.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftLintXcode.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 04E4BF331CB25D3200BC7305 /* SwiftLintXcode.xcscheme */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = SwiftLintXcode.xcscheme; path = SwiftLintXcode.xcodeproj/xcshareddata/xcschemes/SwiftLintXcode.xcscheme; sourceTree = SOURCE_ROOT; }; @@ -52,6 +55,8 @@ children = ( 0498717D1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.h */, 0498717E1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.m */, + 04DFAD451CB508D1007998DF /* SwiftLintXcodeIDEHelper.h */, + 04DFAD461CB508D1007998DF /* SwiftLintXcodeIDEHelper.m */, 04E4BF351CB25D3200BC7305 /* SwiftLintXcode.swift */, 04E4BF371CB25D3200BC7305 /* NSObject_Extension.swift */, 04E4BF401CB273A700BC7305 /* SaveHook.swift */, @@ -142,6 +147,7 @@ 0498717F1CB27F8900C5F7B5 /* SwiftLintXcodeTRVSXcode.m in Sources */, 04E4BF361CB25D3200BC7305 /* SwiftLintXcode.swift in Sources */, 049871811CB28EBF00C5F7B5 /* Formatter.swift in Sources */, + 04DFAD471CB508D1007998DF /* SwiftLintXcodeIDEHelper.m in Sources */, 04DFAD491CB50BC8007998DF /* errorHelper.swift in Sources */, 04E4BF411CB273A700BC7305 /* SaveHook.swift in Sources */, 04E4BF381CB25D3200BC7305 /* NSObject_Extension.swift in Sources */, diff --git a/SwiftLintXcode/Formatter.swift b/SwiftLintXcode/Formatter.swift index c8033be..a6079fe 100644 --- a/SwiftLintXcode/Formatter.swift +++ b/SwiftLintXcode/Formatter.swift @@ -11,8 +11,8 @@ import Cocoa final class Formatter { static var sharedInstance = Formatter() - private static let pathExtension = "SwiftLintXcode" + private static let pathExtension = "SwiftLintXcode" private let fileManager = NSFileManager.defaultManager() private struct CursorPosition { @@ -71,12 +71,18 @@ final class Formatter { } private func formatString(string: String) throws -> String { + guard let workspaceRootDirectory = SwiftLintXcodeIDEHelper.currentWorkspaceURL()?.URLByDeletingLastPathComponent?.path else { + throw errorWithMessage("Cannot determine project directory.") + } + return try withTempporaryFile { (filePath) in try string.writeToFile(filePath, atomically: false, encoding: NSUTF8StringEncoding) - let swiftlintPath = try self.getExecutableOnPath("swiftlint") - let task = NSTask.launchedTaskWithLaunchPath(swiftlintPath, arguments: [ - "autocorrect", "--path", filePath - ]) + let swiftlintPath = try self.getExecutableOnPath(name: "swiftlint", workingDirectory: workspaceRootDirectory) + let task = NSTask() + task.launchPath = swiftlintPath + task.arguments = ["autocorrect", "--path", filePath] + task.currentDirectoryPath = workspaceRootDirectory + task.launch() task.waitUntilExit() if task.terminationStatus != 0 { throw errorWithMessage("Executing swiftlint exited with non-zero status.") @@ -85,13 +91,14 @@ final class Formatter { } } - private func getExecutableOnPath(name: String) throws -> String { + private func getExecutableOnPath(name name: String, workingDirectory: String) throws -> String { let pipe = NSPipe() let task = NSTask() task.launchPath = "/bin/bash" task.arguments = [ "-l", "-c", "which \(name)" ] + task.currentDirectoryPath = workingDirectory task.standardOutput = pipe task.launch() task.waitUntilExit() diff --git a/SwiftLintXcode/SwiftLintXcode-Bridging-Header.h b/SwiftLintXcode/SwiftLintXcode-Bridging-Header.h index 23c4122..9f26a3b 100644 --- a/SwiftLintXcode/SwiftLintXcode-Bridging-Header.h +++ b/SwiftLintXcode/SwiftLintXcode-Bridging-Header.h @@ -3,3 +3,4 @@ // #import "SwiftLintXcodeTRVSXcode.h" +#import "SwiftLintXcodeIDEHelper.h" diff --git a/SwiftLintXcode/SwiftLintXcodeIDEHelper.h b/SwiftLintXcode/SwiftLintXcodeIDEHelper.h new file mode 100644 index 0000000..9cc7b03 --- /dev/null +++ b/SwiftLintXcode/SwiftLintXcodeIDEHelper.h @@ -0,0 +1,15 @@ +// +// SwiftLintXcodeIDEHelper.h +// SwiftLintXcode +// +// Created by yuya.tanaka on 2016/04/06. +// Copyright © 2016年 Yuya Tanaka. All rights reserved. +// + +#import + +@interface SwiftLintXcodeIDEHelper : NSObject + ++ (nullable NSURL *)currentWorkspaceURL; + +@end diff --git a/SwiftLintXcode/SwiftLintXcodeIDEHelper.m b/SwiftLintXcode/SwiftLintXcodeIDEHelper.m new file mode 100644 index 0000000..66af1df --- /dev/null +++ b/SwiftLintXcode/SwiftLintXcodeIDEHelper.m @@ -0,0 +1,22 @@ +// +// SwiftLintXcodeIDEHelper.m +// SwiftLintXcode +// +// Created by yuya.tanaka on 2016/04/06. +// Copyright © 2016年 Yuya Tanaka. All rights reserved. +// + +#import "SwiftLintXcodeIDEHelper.h" +#import "SwiftLintXcodeTRVSXcode.h" +@import Cocoa; + +@implementation SwiftLintXcodeIDEHelper + ++ (nullable NSURL *)currentWorkspaceURL +{ + IDEWorkspaceWindowController *workspaceWindowController = (IDEWorkspaceWindowController *)[[NSApp keyWindow] windowController]; + IDEWorkspace *workspace = [workspaceWindowController valueForKey:@"_workspace"]; + return workspace.representingFilePath.fileURL; +} + +@end