mirror of
https://github.com/realm/SwiftLint.git
synced 2026-06-06 20:18:40 +00:00
be341f90b9
`fatalError` prints the full path of the file, which leaks filesystem information from the machine that built the binary. Now that we release via CocoaPods, this is more critical.
72 lines
2.4 KiB
Swift
72 lines
2.4 KiB
Swift
//
|
|
// Configuration+Cache.swift
|
|
// SwiftLint
|
|
//
|
|
// Created by JP Simard on 5/22/17.
|
|
// Copyright © 2017 Realm. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import SourceKittenFramework
|
|
|
|
extension Configuration {
|
|
|
|
// MARK: Caching Configurations By Path (In-Memory)
|
|
|
|
private static var cachedConfigurationsByPath = [String: Configuration]()
|
|
private static var cachedConfigurationsByPathLock = NSLock()
|
|
|
|
internal func setCached(atPath path: String) {
|
|
Configuration.cachedConfigurationsByPathLock.lock()
|
|
Configuration.cachedConfigurationsByPath[path] = self
|
|
Configuration.cachedConfigurationsByPathLock.unlock()
|
|
}
|
|
|
|
internal static func getCached(atPath path: String) -> Configuration? {
|
|
cachedConfigurationsByPathLock.lock()
|
|
defer { cachedConfigurationsByPathLock.unlock() }
|
|
return cachedConfigurationsByPath[path]
|
|
}
|
|
|
|
// MARK: SwiftLint Cache (On-Disk)
|
|
|
|
internal var cacheDescription: String {
|
|
let cacheRulesDescriptions: [String: Any] = rules.reduce([:]) { accu, element in
|
|
var accu = accu
|
|
accu[type(of: element).description.identifier] = element.cacheDescription
|
|
return accu
|
|
}
|
|
let dict: [String: Any] = [
|
|
"root": rootPath ?? FileManager.default.currentDirectoryPath,
|
|
"rules": cacheRulesDescriptions
|
|
]
|
|
if let jsonData = try? JSONSerialization.data(withJSONObject: dict),
|
|
let jsonString = String(data: jsonData, encoding: .utf8) {
|
|
return jsonString
|
|
}
|
|
queuedFatalError("Could not serialize configuration for cache")
|
|
}
|
|
|
|
internal var cacheURL: URL {
|
|
let baseURL: URL
|
|
if let path = cachePath {
|
|
baseURL = URL(fileURLWithPath: path)
|
|
} else {
|
|
#if os(Linux)
|
|
baseURL = URL(fileURLWithPath: "/var/tmp/")
|
|
#else
|
|
baseURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
|
|
#endif
|
|
}
|
|
let folder = baseURL.appendingPathComponent("SwiftLint/\(Version.current.value)")
|
|
|
|
do {
|
|
try FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil)
|
|
} catch {
|
|
queuedPrintError("Error while creating cache: " + error.localizedDescription)
|
|
}
|
|
|
|
return folder.appendingPathComponent("cache.json")
|
|
}
|
|
}
|