XcodeGen/Sources/ProjectSpec/SpecValidation.swift

164 lines
6.7 KiB
Swift
Raw Normal View History

import Foundation
import PathKit
extension Project {
public func validate() throws {
2017-10-29 22:32:23 +03:00
var errors: [SpecValidationError.ValidationError] = []
func validateSettings(_ settings: Settings) -> [SpecValidationError.ValidationError] {
var errors: [SpecValidationError.ValidationError] = []
for group in settings.groups {
if let settings = settingGroups[group] {
errors += validateSettings(settings)
} else {
errors.append(.invalidSettingsGroup(group))
}
}
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()) }) {
if !options.disabledValidations.contains(.missingConfigs) {
errors.append(.invalidBuildSettingConfig(config))
}
2017-10-26 20:40:46 +03:00
}
}
return errors
}
2017-10-29 22:32:23 +03:00
errors += validateSettings(settings)
for fileGroup in fileGroups {
2017-10-24 22:30:06 +03:00
if !(basePath + fileGroup).exists {
errors.append(.invalidFileGroup(fileGroup))
}
}
for (config, configFile) in configFiles {
2017-10-24 22:30:06 +03:00
if !(basePath + configFile).exists {
errors.append(.invalidConfigFile(configFile: configFile, config: config))
}
if !options.disabledValidations.contains(.missingConfigs) && getConfig(config) == nil {
2017-10-29 22:32:23 +03:00
errors.append(.invalidConfigFileConfig(config))
}
}
2018-03-20 01:18:46 +03:00
if let configName = options.defaultConfig {
if !configs.contains(where: { $0.name == configName }) {
2018-03-20 01:18:46 +03:00
errors.append(.missingDefaultConfig(configName: configName))
}
}
for settings in settingGroups.values {
errors += validateSettings(settings)
}
2018-07-22 10:37:16 +03:00
for target in projectTargets {
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))
}
if !options.disabledValidations.contains(.missingConfigs) && getConfig(config) == nil {
2017-10-29 22:32:23 +03:00
errors.append(.invalidConfigFileConfig(config))
}
}
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
2018-07-22 13:27:58 +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
2018-07-22 13:27:58 +03:00
))
}
}
if scheme.configVariants.isEmpty {
if !configs.contains(where: { $0.type == .debug }) {
2017-12-26 17:46:36 +03:00
errors.append(.missingConfigForTargetScheme(target: target.name, configType: .debug))
}
if !configs.contains(where: { $0.type == .release }) {
2017-12-26 17:46:36 +03:00
errors.append(.missingConfigForTargetScheme(target: target.name, configType: .release))
}
}
for testTarget in scheme.testTargets {
if getTarget(testTarget) == nil {
errors.append(.invalidTargetSchemeTest(target: target.name, testTarget: testTarget))
}
}
}
2018-07-22 10:37:16 +03:00
for script in target.buildScripts {
if case let .path(pathString) = script.script {
2017-10-24 22:30:06 +03:00
let scriptPath = basePath + pathString
if !scriptPath.exists {
2017-10-29 22:32:23 +03:00
errors.append(.invalidBuildScriptPath(target: target.name, name: script.name, path: pathString))
}
}
}
errors += validateSettings(target.settings)
}
2018-07-22 10:37:16 +03:00
for target in aggregateTargets {
for dependency in target.targets {
if getProjectTarget(dependency) == nil {
2018-07-22 10:37:16 +03:00
errors.append(.invalidTargetDependency(target: target.name, dependency: dependency))
}
}
}
for target in targets {
for dependency in target.dependencies {
if dependency.type == .target, getProjectTarget(dependency.reference) == nil {
2018-07-22 10:37:16 +03:00
errors.append(.invalidTargetDependency(target: target.name, dependency: dependency.reference))
}
}
for source in target.sources {
let sourcePath = basePath + source.path
if !source.optional && !sourcePath.exists {
errors.append(.invalidTargetSource(target: target.name, source: sourcePath.string))
}
}
}
for scheme in schemes {
for buildTarget in scheme.build.targets {
if getProjectTarget(buildTarget.target) == nil {
errors.append(.invalidSchemeTarget(scheme: scheme.name, target: buildTarget.target))
}
}
2018-02-02 23:59:05 +03:00
if let action = scheme.run, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
2018-02-02 23:59:05 +03:00
if let action = scheme.test, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
2018-02-02 23:59:05 +03:00
if let action = scheme.profile, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
2018-02-02 23:59:05 +03:00
if let action = scheme.analyze, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
2018-02-02 23:59:05 +03:00
if let action = scheme.archive, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
}
if !errors.isEmpty {
throw SpecValidationError(errors: errors)
}
}
}