public static Config Provide(string workingDirectory, IFileSystem fileSystem, ConfigFileLocator configFileLocator, bool applyDefaults = true, Config overrideConfig = null)
        {
            var readConfig = configFileLocator.ReadConfig(workingDirectory, fileSystem);

            VerifyConfiguration(readConfig);

            if (applyDefaults)
            {
                ApplyDefaultsTo(readConfig);
            }
            if (null != overrideConfig)
            {
                ApplyOverridesTo(readConfig, overrideConfig);
            }
            return(readConfig);
        }
        public static void Init(string workingDirectory, IFileSystem fileSystem, IConsole console, ConfigFileLocator configFileLocator)
        {
            var configFilePath       = configFileLocator.GetConfigFilePath(workingDirectory, fileSystem);
            var currentConfiguration = Provide(workingDirectory, fileSystem, applyDefaults: false, configFileLocator: configFileLocator);
            var config = new ConfigInitWizard(console, fileSystem).Run(currentConfiguration, workingDirectory);

            if (config == null)
            {
                return;
            }

            using (var stream = fileSystem.OpenWrite(configFilePath))
                using (var writer = new StreamWriter(stream))
                {
                    Logger.WriteInfo("Saving config file");
                    ConfigSerialiser.Write(config, writer);
                    stream.Flush();
                }
        }
        public static Config Provide(GitPreparer gitPreparer, IFileSystem fileSystem, ConfigFileLocator configFileLocator, bool applyDefaults = true, Config overrideConfig = null, string configFilePath = null)
        {
            var workingDirectory     = gitPreparer.WorkingDirectory;
            var projectRootDirectory = gitPreparer.GetProjectRootDirectory();

            if (configFileLocator.HasConfigFileAt(workingDirectory, fileSystem))
            {
                return(Provide(workingDirectory, fileSystem, configFileLocator, applyDefaults, overrideConfig));
            }

            return(Provide(projectRootDirectory, fileSystem, configFileLocator, applyDefaults, overrideConfig));
        }
        public static string GetEffectiveConfigAsString(string workingDirectory, IFileSystem fileSystem, ConfigFileLocator configFileLocator)
        {
            var config        = Provide(workingDirectory, fileSystem, configFileLocator);
            var stringBuilder = new StringBuilder();

            using (var stream = new StringWriter(stringBuilder))
            {
                ConfigSerialiser.Write(config, stream);
                stream.Flush();
            }
            return(stringBuilder.ToString());
        }