Main entry point to NAnt that is called by the ConsoleStub.
Example #1
0
        /// <summary>
        /// Add the listeners specified in the command line arguments,
        /// along with the default listener, to the specified project.
        /// </summary>
        /// <param name="cmdlineOptions">The command-line options.</param>
        /// <param name="project">The <see cref="Project" /> to add listeners to.</param>
        private static void AddBuildListeners(CommandLineOptions cmdlineOptions, Project project)
        {
            BuildListenerCollection listeners   = new BuildListenerCollection();
            IBuildLogger            buildLogger = null;
            TextWriter outputWriter             = Console.Out;

            if (cmdlineOptions.LogFile != null)
            {
                try {
                    outputWriter = new StreamWriter(new FileStream(cmdlineOptions.LogFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read));
                } catch (Exception ex) {
                    throw new BuildException(string.Format(CultureInfo.InvariantCulture,
                                                           ResourceUtils.GetString("NA1005"), cmdlineOptions.LogFile.FullName),
                                             Location.UnknownLocation, ex);
                }
            }

            if (cmdlineOptions.LoggerType != null)
            {
                try {
                    buildLogger = ConsoleDriver.CreateLogger(cmdlineOptions.LoggerType);
                } catch (Exception ex) {
                    throw new BuildException(string.Format(CultureInfo.InvariantCulture,
                                                           ResourceUtils.GetString("NA1003"), cmdlineOptions.LoggerType),
                                             Location.UnknownLocation, ex);
                }
            }

            // if no logger was specified on the commandline or an error occurred
            // while creating an instance of the specified logger, use the default
            // logger.
            if (buildLogger == null)
            {
                buildLogger = new DefaultLogger();
            }

            // only set OutputWriter if build logger does not derive from
            // DefaultLogger, or if logfile was specified on command-line.
            // Setting the OutputWriter of the DefaultLogger to Console.Out
            // would cause issues with unit tests.
            if (!typeof(DefaultLogger).IsAssignableFrom(buildLogger.GetType()) || outputWriter is StreamWriter)
            {
                buildLogger.OutputWriter = outputWriter;
            }

            // set threshold of build logger equal to threshold of project
            buildLogger.Threshold = project.Threshold;

            // set emacs mode
            buildLogger.EmacsMode = cmdlineOptions.EmacsMode;

            // add build logger to listeners collection
            listeners.Add(buildLogger);

            // add listeners to listener collection
            foreach (string listenerTypeName in cmdlineOptions.Listeners)
            {
                try {
                    IBuildListener listener = ConsoleDriver.CreateListener(listenerTypeName);
                    listeners.Add(listener);
                } catch (Exception ex) {
                    throw new BuildException(string.Format(CultureInfo.InvariantCulture,
                                                           ResourceUtils.GetString("NA1002"), listenerTypeName),
                                             Location.UnknownLocation, ex);
                }
            }

            // attach listeners to project
            project.AttachBuildListeners(listeners);
        }
Example #2
0
        /// <summary>
        /// Starts NAnt. This is the Main entry point.
        /// </summary>
        /// <param name="args">Command Line args, or whatever you want to pass it. They will treated as Command Line args.</param>
        /// <returns>
        /// The exit code.
        /// </returns>
        public static int Main(string[] args)
        {
            CommandLineParser commandLineParser = null;
            Project           project           = null;
            Level             projectThreshold  = Level.Info;

            // create assembly resolver
            AssemblyResolver assemblyResolver = new AssemblyResolver();

            // attach assembly resolver to the current domain
            assemblyResolver.Attach();

            try {
                CommandLineOptions cmdlineOptions = new CommandLineOptions();
                commandLineParser = new CommandLineParser(typeof(CommandLineOptions), true);
                commandLineParser.Parse(args, cmdlineOptions);

                if (!cmdlineOptions.NoLogo)
                {
                    Console.WriteLine(commandLineParser.LogoBanner);
                    // insert empty line
                    Console.WriteLine();
                }

                if (cmdlineOptions.ShowHelp)
                {
                    ConsoleDriver.ShowHelp(commandLineParser);
                    return(0);
                }

                // determine the project message threshold
                if (cmdlineOptions.Debug)
                {
                    projectThreshold = Level.Debug;
                }
                else if (cmdlineOptions.Verbose)
                {
                    projectThreshold = Level.Verbose;
                }
                else if (cmdlineOptions.Quiet)
                {
                    projectThreshold = Level.Warning;
                }

                if (cmdlineOptions.BuildFile != null)
                {
                    if (project != null)
                    {
                        Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Buildfile has already been loaded! Using new value '{0}'; discarding old project file '{1}'", cmdlineOptions.BuildFile, project.BuildFileUri));
                        // insert empty line
                        Console.WriteLine();
                    }

                    project = new Project(cmdlineOptions.BuildFile, projectThreshold, cmdlineOptions.IndentationLevel);
                }

                // get build file name if the project has not been created.
                // If a build file was not specified on the command line.
                if (project == null)
                {
                    project = new Project(GetBuildFileName(Environment.CurrentDirectory, null, cmdlineOptions.FindInParent), projectThreshold, cmdlineOptions.IndentationLevel);
                }

                // load extension asseemblies
                LoadExtensionAssemblies(cmdlineOptions.ExtensionAssemblies, project);

                PropertyDictionary buildOptionProps = new PropertyDictionary(project);

                // add build logger and build listeners to project
                ConsoleDriver.AddBuildListeners(cmdlineOptions, project);

                // copy cmd line targets
                foreach (string target in cmdlineOptions.Targets)
                {
                    project.BuildTargets.Add(target);
                }

                // build collection of valid properties that were specified on
                // the command line.
                foreach (string key in cmdlineOptions.Properties)
                {
                    buildOptionProps.AddReadOnly(key,
                                                 cmdlineOptions.Properties.Get(key));
                }

                // add valid properties to the project.
                foreach (System.Collections.DictionaryEntry de in buildOptionProps)
                {
                    project.Properties.AddReadOnly((string)de.Key, (string)de.Value);
                }

                //add these here and in the project .ctor
                Assembly ass = Assembly.GetExecutingAssembly();

                project.Properties.AddReadOnly(Project.NAntPropertyFileName, ass.Location);
                project.Properties.AddReadOnly(Project.NAntPropertyVersion, ass.GetName().Version.ToString());
                project.Properties.AddReadOnly(Project.NAntPropertyLocation, Path.GetDirectoryName(ass.Location));

                if (cmdlineOptions.TargetFramework != null)
                {
                    FrameworkInfo frameworkInfo = project.Frameworks[cmdlineOptions.TargetFramework];

                    if (frameworkInfo != null)
                    {
                        project.TargetFramework = frameworkInfo;
                    }
                    else
                    {
                        Console.Error.WriteLine("Invalid framework '{0}' specified.",
                                                cmdlineOptions.TargetFramework);

                        // insert empty line
                        Console.Error.WriteLine();

                        if (project.Frameworks.Count == 0)
                        {
                            Console.Error.WriteLine("There are no supported frameworks available on your system.");
                        }
                        else
                        {
                            Console.Error.WriteLine("Possible values include:");
                            // insert empty line
                            Console.Error.WriteLine();

                            foreach (string framework in project.Frameworks.Keys)
                            {
                                Console.Error.WriteLine(" {0} ({1})", framework, project.Frameworks[framework].Description);
                            }
                        }
                        // signal error
                        return(1);
                    }
                }

                if (cmdlineOptions.ShowProjectHelp)
                {
                    Console.WriteLine();
                    ConsoleDriver.ShowProjectHelp(project.Document);
                }
                else
                {
                    if (!project.Run())
                    {
                        return(1);
                    }
                }
                // signal success
                return(0);
            } catch (CommandLineArgumentException ex) {
                // Write logo banner to console if parser was created successfully
                if (commandLineParser != null)
                {
                    Console.WriteLine(commandLineParser.LogoBanner);
                    // insert empty line
                    Console.Error.WriteLine();
                }
                // Write message of exception to console
                Console.Error.WriteLine(ex.Message);
                // get first nested exception
                Exception nestedException = ex.InnerException;
                // set initial indentation level for the nested exceptions
                int exceptionIndentationLevel = 0;
                while (nestedException != null && !StringUtils.IsNullOrEmpty(nestedException.Message))
                {
                    // indent exception message with 4 extra spaces
                    // (for each nesting level)
                    exceptionIndentationLevel += 4;
                    // output exception message
                    Console.Error.WriteLine(new string(' ', exceptionIndentationLevel)
                                            + nestedException.Message);
                    // move on to next inner exception
                    nestedException = nestedException.InnerException;
                }
                // output full stacktrace when NAnt is started in debug mode
                if (Level.Debug >= projectThreshold)
                {
                    // insert empty line
                    Console.Error.WriteLine();
                    // output header
                    Console.Error.WriteLine("Stacktrace:");
                    // insert empty line
                    Console.Error.WriteLine();
                    // output full stacktrace
                    Console.Error.WriteLine(ex.ToString());
                }
                // insert empty line
                Console.WriteLine();
                // instruct users to check the usage instructions
                Console.WriteLine("Try 'nant -help' for more information");
                // signal error
                return(1);
            } catch (ApplicationException ex) {
                // insert empty line
                Console.Error.WriteLine();
                // output build result
                Console.Error.WriteLine("BUILD FAILED");
                // insert empty line
                Console.Error.WriteLine();
                // output message of exception
                Console.Error.WriteLine(ex.Message);
                // get first nested exception
                Exception nestedException = ex.InnerException;
                // set initial indentation level for the nested exceptions
                int exceptionIndentationLevel = 0;
                while (nestedException != null && !StringUtils.IsNullOrEmpty(nestedException.Message))
                {
                    // indent exception message with 4 extra spaces
                    // (for each nesting level)
                    exceptionIndentationLevel += 4;
                    // output exception message
                    Console.Error.WriteLine(new string(' ', exceptionIndentationLevel)
                                            + nestedException.Message);
                    // move on to next inner exception
                    nestedException = nestedException.InnerException;
                }
                // output full stacktrace when NAnt is started in debug mode
                if (Level.Debug >= projectThreshold)
                {
                    // insert empty line
                    Console.Error.WriteLine();
                    // output header
                    Console.Error.WriteLine("Stacktrace:");
                    // insert empty line
                    Console.Error.WriteLine();
                    // output full stacktrace
                    Console.Error.WriteLine(ex.ToString());
                }
                else
                {
                    // insert empty line
                    Console.WriteLine(string.Empty);
                    // output help text
                    Console.WriteLine("For more information regarding the cause of the " +
                                      "build failure, run the build again in debug mode.");
                }
                // insert empty line
                Console.WriteLine();
                // instruct users to check the usage instructions
                Console.WriteLine("Try 'nant -help' for more information");
                // signal error
                return(1);
            } catch (Exception ex) {
                // insert empty line
                Console.Error.WriteLine();
                // all other exceptions should have been caught
                Console.Error.WriteLine("INTERNAL ERROR");
                // insert empty line
                Console.Error.WriteLine();
                // output message of exception
                Console.Error.WriteLine(ex.Message);
                // output full stacktrace when NAnt is started in verbose mode
                if (Level.Verbose >= projectThreshold)
                {
                    // insert empty line
                    Console.Error.WriteLine();
                    // output header
                    Console.Error.WriteLine("Stacktrace:");
                    // insert empty line
                    Console.Error.WriteLine();
                    // output full stacktrace
                    Console.Error.WriteLine(ex.ToString());
                }
                else
                {
                    // insert xempty line
                    Console.WriteLine();
                    // output help text
                    Console.WriteLine("For more information regarding the cause of the " +
                                      "build failure, run the build again in verbose mode.");
                }
                // insert empty line
                Console.WriteLine();
                // instruct users to report this problem
                Console.WriteLine("Please send a bug report (including the version of CI Factory you're using) to [email protected]");
                // signal fatal error
                return(2);
            } finally {
                if (project != null)
                {
                    project.DetachBuildListeners();
                }
                // detach assembly resolver from the current domain
                assemblyResolver.Detach();
            }
        }