/// <summary>
/// Runs the application.
/// </summary>
/// <param name="args">Arguments.</param>
/// <returns>0 on success.</returns>
public int Run( string[] args )
{
var console = new CakeConsole();
var logger = new SafeCakeLog( console );
var engine = new CakeEngine( logger );
ICakePlatform platform = new CakePlatform();
ICakeRuntime runtime = new CakeRuntime();
IFileSystem fileSystem = new FileSystem();
MutableCakeEnvironment environment = new MutableCakeEnvironment( platform, runtime );
IGlobber globber = new Globber( fileSystem, environment );
environment.Initialize( globber );
IProcessRunner processRunner = new ProcessRunner( environment, logger );
IRegistry windowsRegistry = new WindowsRegistry();
// Parse options.
var argumentParser = new ArgumentParser( logger, fileSystem );
CakeOptions options = argumentParser.Parse( args );
Debug.Assert( options != null );
CakeConfigurationProvider configProvider = new CakeConfigurationProvider( fileSystem, environment );
ICakeConfiguration configuration = configProvider.CreateConfiguration( environment.ApplicationRoot, options.Arguments );
IToolRepository toolRepo = new ToolRepository( environment );
IToolResolutionStrategy toolStrategy = new ToolResolutionStrategy( fileSystem, environment, globber, configuration );
IToolLocator locator = new ToolLocator( environment, toolRepo, toolStrategy );
IToolLocator toolLocator = new ToolLocator( environment, toolRepo, toolStrategy );
logger.SetVerbosity( options.Verbosity );
CodeCakeBuildTypeDescriptor choosenBuild;
if( !AvailableBuilds.TryGetValue( options.Script, out choosenBuild ) )
{
logger.Error( "Build script '{0}' not found.", options.Script );
return -1;
}
ICakeArguments arguments = new CakeArguments(options.Arguments);
var context = new CakeContext( fileSystem, environment, globber, logger, arguments, processRunner, windowsRegistry, locator );
// Copy the arguments from the options.
// Set the working directory: the solution directory.
environment.WorkingDirectory = new DirectoryPath( _solutionDirectory );
// Adds additional paths from chosen build.
foreach( var p in choosenBuild.AdditionnalPatternPaths )
{
environment.AddPath( p );
}
logger.Information( "Path(s) added: " + string.Join( ", ", environment.EnvironmentAddedPaths ) );
logger.Information( "Dynamic pattern path(s) added: " + string.Join( ", ", environment.EnvironmentDynamicPaths ) );
try
{
// Instanciates the script object.
CodeCakeHost._injectedActualHost = new BuildScriptHost( engine, context );
CodeCakeHost c = (CodeCakeHost)Activator.CreateInstance( choosenBuild.Type );
var strategy = new DefaultExecutionStrategy( logger );
var report = engine.RunTarget( context, strategy, context.Arguments.GetArgument( "target" ) ?? "Default" );
if( report != null && !report.IsEmpty )
{
var printerReport = new CakeReportPrinter( console );
printerReport.Write( report );
}
}
catch( CakeTerminateException ex )
{
switch( ex.Option )
{
case CakeTerminationOption.Error:
logger.Error( "Termination with Error: '{0}'.", ex.Message );
return -1;
case CakeTerminationOption.Warning:
logger.Warning( "Termination with Warning: '{0}'.", ex.Message );
break;
default:
Debug.Assert( ex.Option == CakeTerminationOption.Success );
logger.Information( "Termination with Success: '{0}'.", ex.Message );
break;
}
}
catch( TargetInvocationException ex )
{
logger.Error( "Error occurred: '{0}'.", ex.InnerException?.Message ?? ex.Message );
return -1;
}
catch( Exception ex )
{
logger.Error( "Error occurred: '{0}'.", ex.Message );
return -1;
}
return 0;
}