2017-09-24 20:42:14 +03:00
|
|
|
import Foundation
|
|
|
|
import PathKit
|
|
|
|
|
|
|
|
extension ProjectSpec {
|
|
|
|
|
2017-10-29 22:32:23 +03:00
|
|
|
public func validate() throws {
|
2017-09-24 20:42:14 +03:00
|
|
|
|
2017-10-29 22:32:23 +03:00
|
|
|
var errors: [SpecValidationError.ValidationError] = []
|
2017-09-24 20:42:14 +03:00
|
|
|
|
2017-10-29 22:32:23 +03:00
|
|
|
func validateSettings(_ settings: Settings) -> [SpecValidationError.ValidationError] {
|
|
|
|
var errors: [SpecValidationError.ValidationError] = []
|
2017-09-25 19:25:40 +03:00
|
|
|
for group in settings.groups {
|
|
|
|
if let settings = settingGroups[group] {
|
2017-09-24 20:42:14 +03:00
|
|
|
errors += validateSettings(settings)
|
|
|
|
} else {
|
2017-09-25 19:25:40 +03:00
|
|
|
errors.append(.invalidSettingsGroup(group))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
}
|
2017-10-26 20:40:46 +03:00
|
|
|
for config in settings.configSettings.keys {
|
2017-10-30 00:27:05 +03:00
|
|
|
if !configs.contains(where: { $0.name.lowercased().contains(config.lowercased()) }) {
|
2017-10-29 22:32:23 +03:00
|
|
|
errors.append(.invalidBuildSettingConfig(config))
|
2017-10-26 20:40:46 +03:00
|
|
|
}
|
|
|
|
}
|
2017-09-24 20:42:14 +03:00
|
|
|
return errors
|
|
|
|
}
|
|
|
|
|
2017-10-29 22:32:23 +03:00
|
|
|
errors += validateSettings(settings)
|
|
|
|
|
2017-09-24 20:48:42 +03:00
|
|
|
for fileGroup in fileGroups {
|
2017-10-24 22:30:06 +03:00
|
|
|
if !(basePath + fileGroup).exists {
|
2017-09-24 20:48:42 +03:00
|
|
|
errors.append(.invalidFileGroup(fileGroup))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (config, configFile) in configFiles {
|
2017-10-24 22:30:06 +03:00
|
|
|
if !(basePath + configFile).exists {
|
2017-09-24 20:48:42 +03:00
|
|
|
errors.append(.invalidConfigFile(configFile: configFile, config: config))
|
|
|
|
}
|
2017-10-29 22:32:23 +03:00
|
|
|
if getConfig(config) == nil {
|
|
|
|
errors.append(.invalidConfigFileConfig(config))
|
|
|
|
}
|
2017-09-24 20:48:42 +03:00
|
|
|
}
|
|
|
|
|
2017-09-24 20:42:14 +03:00
|
|
|
for settings in settingGroups.values {
|
|
|
|
errors += validateSettings(settings)
|
|
|
|
}
|
|
|
|
|
|
|
|
for target in targets {
|
|
|
|
for dependency in target.dependencies {
|
|
|
|
if dependency.type == .target, getTarget(dependency.reference) == nil {
|
|
|
|
errors.append(.invalidTargetDependency(target: target.name, dependency: dependency.reference))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (config, configFile) in target.configFiles {
|
2017-10-24 22:30:06 +03:00
|
|
|
if !(basePath + configFile).exists {
|
2017-10-29 22:32:23 +03:00
|
|
|
errors.append(.invalidTargetConfigFile(target: target.name, configFile: configFile, config: config))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
if getConfig(config) == nil {
|
2017-10-29 22:32:23 +03:00
|
|
|
errors.append(.invalidConfigFileConfig(config))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for source in target.sources {
|
2017-10-31 17:46:47 +03:00
|
|
|
let sourcePath = basePath + source.path
|
2017-12-21 11:40:41 +03:00
|
|
|
if !source.optional && !sourcePath.exists {
|
2017-10-30 00:15:02 +03:00
|
|
|
errors.append(.invalidTargetSource(target: target.name, source: sourcePath.string))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if let scheme = target.scheme {
|
|
|
|
|
|
|
|
for configVariant in scheme.configVariants {
|
|
|
|
if !configs.contains(where: { $0.name.contains(configVariant) && $0.type == .debug }) {
|
2017-12-26 13:47:18 +03:00
|
|
|
errors.append(.invalidTargetSchemeConfigVariant(
|
|
|
|
target: target.name,
|
|
|
|
configVariant: configVariant,
|
|
|
|
configType: .debug
|
|
|
|
))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
if !configs.contains(where: { $0.name.contains(configVariant) && $0.type == .release }) {
|
2017-12-26 13:47:18 +03:00
|
|
|
errors.append(.invalidTargetSchemeConfigVariant(
|
|
|
|
target: target.name,
|
|
|
|
configVariant: configVariant,
|
|
|
|
configType: .release
|
|
|
|
))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-10-27 00:52:18 +03:00
|
|
|
if scheme.configVariants.isEmpty {
|
|
|
|
if !configs.contains(where: { $0.type == .debug }) {
|
|
|
|
errors.append(.missingConfigTypeForGeneratedTargetScheme(target: target.name, configType: .debug))
|
|
|
|
}
|
|
|
|
if !configs.contains(where: { $0.type == .release }) {
|
|
|
|
errors.append(.missingConfigTypeForGeneratedTargetScheme(target: target.name, configType: .release))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-24 20:42:14 +03:00
|
|
|
for testTarget in scheme.testTargets {
|
|
|
|
if getTarget(testTarget) == nil {
|
|
|
|
errors.append(.invalidTargetSchemeTest(target: target.name, testTarget: testTarget))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let scripts = target.prebuildScripts + target.postbuildScripts
|
|
|
|
for script in scripts {
|
|
|
|
if case let .path(pathString) = script.script {
|
2017-10-24 22:30:06 +03:00
|
|
|
let scriptPath = basePath + pathString
|
2017-09-24 20:42:14 +03:00
|
|
|
if !scriptPath.exists {
|
2017-10-29 22:32:23 +03:00
|
|
|
errors.append(.invalidBuildScriptPath(target: target.name, name: script.name, path: pathString))
|
2017-09-24 20:42:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
errors += validateSettings(target.settings)
|
|
|
|
}
|
|
|
|
|
|
|
|
for scheme in schemes {
|
|
|
|
for buildTarget in scheme.build.targets {
|
|
|
|
if getTarget(buildTarget.target) == nil {
|
|
|
|
errors.append(.invalidSchemeTarget(scheme: scheme.name, target: buildTarget.target))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if let buildAction = scheme.run, getConfig(buildAction.config) == nil {
|
|
|
|
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: buildAction.config))
|
|
|
|
}
|
|
|
|
if let buildAction = scheme.test, getConfig(buildAction.config) == nil {
|
|
|
|
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: buildAction.config))
|
|
|
|
}
|
|
|
|
if let buildAction = scheme.profile, getConfig(buildAction.config) == nil {
|
|
|
|
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: buildAction.config))
|
|
|
|
}
|
|
|
|
if let buildAction = scheme.analyze, getConfig(buildAction.config) == nil {
|
|
|
|
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: buildAction.config))
|
|
|
|
}
|
|
|
|
if let buildAction = scheme.archive, getConfig(buildAction.config) == nil {
|
|
|
|
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: buildAction.config))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !errors.isEmpty {
|
|
|
|
throw SpecValidationError(errors: errors)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|