Ejemplo n.º 1
0
        static void EnableFileLogging( )
        {
            if (Path.DirectorySeparatorChar != '\\')
            {
                return;
            }

            // On Windows log all output to a log file

            string configPath = PropertyService.ConfigPath;

            if (!Directory.Exists(configPath))
            {
                Directory.CreateDirectory(configPath);
            }

            string file = Path.Combine(configPath, "log.txt");

            try {
                logFile           = new StreamWriter(file);
                logFile.AutoFlush = true;

                LogTextWriter tw = new LogTextWriter();
                tw.ChainWriter(logFile);
                tw.ChainWriter(Console.Out);
                Console.SetOut(tw);

                tw = new LogTextWriter();
                tw.ChainWriter(logFile);
                tw.ChainWriter(Console.Error);
                Console.SetError(tw);
            }
            catch {
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Executes a file and reports events related to the execution to the 'monitor' passed in the parameters.
        /// </summary>
        public static int ExecuteCommand(
            string command,
            string args,
            string baseDirectory,

            IProgressMonitor monitor,
            out string errorOutput,
            out string programOutput)
        {
            errorOutput = string.Empty;
            int exitCode = -1;

            var swError  = new StringWriter();
            var swOutput = new StringWriter();

            var chainedError = new LogTextWriter();

            chainedError.ChainWriter(monitor.Log);
            chainedError.ChainWriter(swError);

            var chainedOutput = new LogTextWriter();

            chainedOutput.ChainWriter(monitor.Log);
            chainedOutput.ChainWriter(swOutput);

            monitor.Log.WriteLine("{0} {1}", command, args);

            var operationMonitor = new AggregatedOperationMonitor(monitor);
            var p = Runtime.ProcessService.StartProcess(command, args, baseDirectory, chainedOutput, chainedError, null);

            operationMonitor.AddOperation(p);              //handles cancellation


            p.WaitForOutput();
            errorOutput   = swError.ToString();
            programOutput = swOutput.ToString();
            exitCode      = p.ExitCode;
            p.Dispose();

            if (monitor.IsCancelRequested)
            {
                monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled"));
                monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null);
                if (exitCode == 0)
                {
                    exitCode = -1;
                }
            }
            {
                chainedError.Close();
                swError.Close();
                operationMonitor.Dispose();
            }

            return(exitCode);
        }
        static void CompileToAssembly(IProgressMonitor monitor, DotNetProjectConfiguration configuration, JavaCompilerParameters compilerparameters, ProjectItemCollection projectItems, TextWriter output, TextWriter error)
        {
            monitor.Log.WriteLine(GettextCatalog.GetString("Generating assembly ..."));

            LogTextWriter chainedError = new LogTextWriter();

            chainedError.ChainWriter(monitor.Log);
            chainedError.ChainWriter(error);

            LogTextWriter chainedOutput = new LogTextWriter();

            chainedOutput.ChainWriter(monitor.Log);
            chainedOutput.ChainWriter(output);

            string outdir   = configuration.OutputDirectory;
            string outclass = Path.Combine(outdir, configuration.OutputAssembly + ".class");
            string asm      = Path.GetFileNameWithoutExtension(outclass);

            StringBuilder args = new StringBuilder("*.class ");

            args.Append("-assembly:"); args.Append(asm);
            args.Append(" -target:"); args.Append(TargetToString(configuration.CompileTarget));
            if (configuration.DebugMode)
            {
                args.Append(" -debug");
            }
            args.Append(" -srcpath:"); args.Append(configuration.ParentItem.BaseDirectory);

            foreach (ProjectReference lib in projectItems.GetAll <ProjectReference> ())
            {
                foreach (string fileName in lib.GetReferencedFileNames(configuration.Selector))
                {
                    args.Append(" -r:"); args.Append(fileName);
                }
            }

            foreach (string fileName in new ProjectReference(ReferenceType.Gac, "mscorlib").GetReferencedFileNames(configuration.Selector))
            {
                args.Append(" -r:"); args.Append(fileName);
            }

            monitor.Log.WriteLine("ikvmc " + args);
            Process process = Runtime.ProcessService.StartProcess("ikvmc", args.ToString(), configuration.OutputDirectory, chainedOutput, chainedError, null);

            process.WaitForExit();
        }
Ejemplo n.º 4
0
 protected void AddSlaveMonitor(ProgressMonitor monitor)
 {
     if (slaveMonitors == null)
     {
         slaveMonitors = new List <ProgressMonitor> ();
     }
     slaveMonitors.Add(monitor);
     logWriter.ChainWriter(monitor.Log);
     errorLogWriter.ChainWriter(monitor.ErrorLog);
 }
Ejemplo n.º 5
0
 protected void AddFollowerMonitor(ProgressMonitor monitor)
 {
     if (followerMonitors == null)
     {
         followerMonitors = new List <ProgressMonitor> ();
     }
     followerMonitors.Add(monitor);
     logWriter.ChainWriter(monitor.Log);
     errorLogWriter.ChainWriter(monitor.ErrorLog);
 }
Ejemplo n.º 6
0
        //copied from MoonlightBuildExtension
        public static int ExecuteCommand(IProgressMonitor monitor, System.Diagnostics.ProcessStartInfo startInfo, out string errorOutput)
        {
            startInfo.UseShellExecute        = false;
            startInfo.RedirectStandardError  = true;
            startInfo.RedirectStandardOutput = true;

            errorOutput = string.Empty;
            int exitCode = -1;

            var swError      = new StringWriter();
            var chainedError = new LogTextWriter();

            chainedError.ChainWriter(monitor.Log);
            chainedError.ChainWriter(swError);

            var operationMonitor = new AggregatedOperationMonitor(monitor);

            try {
                var p = Runtime.ProcessService.StartProcess(startInfo, monitor.Log, chainedError, null);
                operationMonitor.AddOperation(p);                  //handles cancellation

                p.WaitForOutput();
                errorOutput = swError.ToString();
                exitCode    = p.ExitCode;
                p.Dispose();

                if (monitor.IsCancelRequested)
                {
                    monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled"));
                    monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null);
                    if (exitCode == 0)
                    {
                        exitCode = -1;
                    }
                }
            } finally {
                chainedError.Close();
                swError.Close();
                operationMonitor.Dispose();
            }

            return(exitCode);
        }
        static bool Compile(IProgressMonitor monitor, string compiler, string args, DotNetProjectConfiguration configuration, JavaCompilerParameters compilerparameters, TextWriter output, TextWriter error)
        {
            LogTextWriter chainedError = new LogTextWriter();

            chainedError.ChainWriter(monitor.Log);
            chainedError.ChainWriter(error);

            LogTextWriter chainedOutput = new LogTextWriter();

            chainedOutput.ChainWriter(monitor.Log);
            chainedOutput.ChainWriter(output);

            monitor.Log.WriteLine(GettextCatalog.GetString("Compiling Java source code ..."));
            monitor.Log.WriteLine(compiler + " " + args);

            Process process = Runtime.ProcessService.StartProcess(compiler, args, null, chainedOutput, chainedError, null);

            process.WaitForExit();
            return(process.ExitCode == 0);
        }
        protected override Task <TargetEvaluationResult> OnRunTarget(ProgressMonitor monitor, string target, ConfigurationSelector configuration, TargetEvaluationContext context)
        {
            if (target == ProjectService.BuildTarget)
            {
                target = "all";
            }
            else if (target == ProjectService.CleanTarget)
            {
                target = "clean";
            }

            DotNetProjectConfiguration conf = (DotNetProjectConfiguration)Project.GetConfiguration(configuration);

            return(Task <TargetEvaluationResult> .Factory.StartNew(delegate {
                using (var output = new StringWriter()) {
                    using (var tw = new LogTextWriter()) {
                        tw.ChainWriter(output);
                        tw.ChainWriter(monitor.Log);

                        using (ProcessWrapper proc = Runtime.ProcessService.StartProcess("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null))
                            proc.WaitForOutput();

                        tw.UnchainWriter(output);
                        tw.UnchainWriter(monitor.Log);

                        CompilerResults cr = new CompilerResults(null);
                        string[] lines = output.ToString().Split('\n');
                        foreach (string line in lines)
                        {
                            CompilerError err = CreateErrorFromString(line);
                            if (err != null)
                            {
                                cr.Errors.Add(err);
                            }
                        }

                        return new TargetEvaluationResult(new BuildResult(cr, output.ToString()));
                    }
                }
            }));
        }
        public BuildResult RunTarget(MonoDevelop.Core.IProgressMonitor monitor, string target, ConfigurationSelector configuration)
        {
            if (target == ProjectService.BuildTarget)
            {
                target = "all";
            }
            else if (target == ProjectService.CleanTarget)
            {
                target = "clean";
            }

            DotNetProjectConfiguration conf = (DotNetProjectConfiguration)project.GetConfiguration(configuration);

            using (var output = new StringWriter()) {
                using (var tw = new LogTextWriter()) {
                    tw.ChainWriter(output);
                    tw.ChainWriter(monitor.Log);

                    using (ProcessWrapper proc = Runtime.ProcessService.StartProcess("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null))
                        proc.WaitForOutput();

                    tw.UnchainWriter(output);
                    tw.UnchainWriter(monitor.Log);

                    var result = new BuildResult(output.ToString(), 1, 0);

                    string[] lines = result.CompilerOutput.Split('\n');
                    foreach (string line in lines)
                    {
                        var err = CreateErrorFromString(line);
                        if (err != null)
                        {
                            result.Append(err);
                        }
                    }

                    return(result);
                }
            }
        }
Ejemplo n.º 10
0
        public BuildResult RunTarget(MonoDevelop.Core.IProgressMonitor monitor, string target, ConfigurationSelector configuration)
        {
            if (target == ProjectService.BuildTarget)
            {
                target = "all";
            }
            else if (target == ProjectService.CleanTarget)
            {
                target = "clean";
            }

            DotNetProjectConfiguration conf = (DotNetProjectConfiguration)project.GetConfiguration(configuration);

            StringWriter  output = new StringWriter();
            LogTextWriter tw     = new LogTextWriter();

            tw.ChainWriter(output);
            tw.ChainWriter(monitor.Log);

            ProcessWrapper proc = Runtime.ProcessService.StartProcess("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null);

            proc.WaitForOutput();

            CompilerResults cr = new CompilerResults(null);

            string[] lines = output.ToString().Split('\n');
            foreach (string line in lines)
            {
                CompilerError err = CreateErrorFromString(line);
                if (err != null)
                {
                    cr.Errors.Add(err);
                }
            }

            return(new BuildResult(cr, output.ToString()));
        }
        int ExecuteCommand(string command, string args, string baseDirectory, ProgressMonitor monitor, out string errorOutput)
        {
            errorOutput = string.Empty;
            int exitCode = -1;

            using (var swError = new StringWriter()) {
                using (var chainedError = new LogTextWriter()) {
                    chainedError.ChainWriter(monitor.Log);
                    chainedError.ChainWriter(swError);

                    monitor.Log.WriteLine("{0} {1}", command, args);

                    using (ProcessWrapper p = Runtime.ProcessService.StartProcess(command, args, baseDirectory, monitor.Log, chainedError, null))
                        using (monitor.CancellationToken.Register(p.Cancel)) {
                            p.WaitForOutput();
                            chainedError.UnchainWriter(monitor.Log);
                            chainedError.UnchainWriter(swError);

                            errorOutput = swError.ToString();
                            exitCode    = p.ExitCode;

                            if (monitor.CancellationToken.IsCancellationRequested)
                            {
                                monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled"));
                                monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null);
                                if (exitCode == 0)
                                {
                                    exitCode = -1;
                                }
                            }
                        }
                }
            }

            return(exitCode);
        }
Ejemplo n.º 12
0
        static void EnableFileLogging( )
        {
            if (Path.DirectorySeparatorChar != '\\')
            {
                return;
            }

            // On Windows log all output to a log file

            string configPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

            configPath = Path.Combine(configPath, "MonoDevelop");
            if (!Directory.Exists(configPath))
            {
                Directory.CreateDirectory(configPath);
            }

            string file = Path.Combine(configPath, "log.txt");

            try {
                logFile           = new StreamWriter(file);
                logFile.AutoFlush = true;

                LogTextWriter tw = new LogTextWriter();
                tw.ChainWriter(logFile);
                tw.ChainWriter(Console.Out);
                Console.SetOut(tw);

                tw = new LogTextWriter();
                tw.ChainWriter(logFile);
                tw.ChainWriter(Console.Error);
                Console.SetError(tw);
            }
            catch {
            }
        }
        //FIXME: Check whether autogen.sh is required or not
        protected override BuildResult Build(IProgressMonitor monitor, SolutionEntityItem entry, ConfigurationSelector configuration)
        {
            Project project = entry as Project;

            if (project == null)
            {
                return(base.Build(monitor, entry, configuration));
            }

            MakefileData data = project.ExtendedProperties ["MonoDevelop.Autotools.MakefileInfo"] as MakefileData;

            if (data == null || !data.SupportsIntegration || String.IsNullOrEmpty(data.BuildTargetName))
            {
                return(base.Build(monitor, entry, configuration));
            }

            //FIXME: Gen autofoo ? autoreconf?

            string output   = String.Empty;
            int    exitCode = 0;

            monitor.BeginTask(GettextCatalog.GetString("Building {0}", project.Name), 1);
            try
            {
                string baseDir = project.BaseDirectory;
                string args    = string.Format("-j {0} {1}", data.ParallelProcesses, data.BuildTargetName);

                StringWriter  swOutput      = new StringWriter();
                LogTextWriter chainedOutput = new LogTextWriter();
                chainedOutput.ChainWriter(monitor.Log);
                chainedOutput.ChainWriter(swOutput);

                ProcessWrapper process = Runtime.ProcessService.StartProcess("make",
                                                                             args,
                                                                             baseDir,
                                                                             chainedOutput,
                                                                             chainedOutput,
                                                                             null);
                process.WaitForOutput();

                exitCode = process.ExitCode;
                output   = swOutput.ToString();
                chainedOutput.Close();
                swOutput.Close();
                monitor.Step(1);
            }
            catch (Exception e)
            {
                monitor.ReportError(GettextCatalog.GetString("Project could not be built: "), e);
                return(null);
            }
            finally
            {
                monitor.EndTask();
            }

            TempFileCollection tf = new TempFileCollection();
            Regex regexError      = data.GetErrorRegex(false);
            Regex regexWarning    = data.GetWarningRegex(false);

            BuildResult cr = ParseOutput(tf, output, project.BaseDirectory, regexError, regexWarning);

            if (exitCode != 0 && cr.FailedBuildCount == 0)
            {
                cr.AddError(GettextCatalog.GetString("Build failed. See Build Output panel."));
            }

            return(cr);
        }
        //FIXME: Check whether autogen.sh is required or not
        protected async override Task <BuildResult> OnBuild(ProgressMonitor monitor, ConfigurationSelector configuration, OperationContext operationContext)
        {
            if (data == null || !data.SupportsIntegration || String.IsNullOrEmpty(data.BuildTargetName))
            {
                return(await base.OnBuild(monitor, configuration, operationContext));
            }

            //FIXME: Gen autofoo ? autoreconf?

            string output   = String.Empty;
            int    exitCode = 0;

            monitor.BeginTask(GettextCatalog.GetString("Building {0}", Project.Name), 1);
            try
            {
                string baseDir = Project.BaseDirectory;
                string args    = string.Format("-j {0} {1}", data.ParallelProcesses, data.BuildTargetName);

                using (var swOutput = new StringWriter()) {
                    using (var chainedOutput = new LogTextWriter()) {
                        chainedOutput.ChainWriter(monitor.Log);
                        chainedOutput.ChainWriter(swOutput);

                        using (ProcessWrapper process = Runtime.ProcessService.StartProcess("make",
                                                                                            args,
                                                                                            baseDir,
                                                                                            chainedOutput,
                                                                                            chainedOutput,
                                                                                            null)) {
                            await process.Task;

                            chainedOutput.UnchainWriter(monitor.Log);
                            chainedOutput.UnchainWriter(swOutput);

                            exitCode = process.ExitCode;
                            output   = swOutput.ToString();
                            monitor.Step(1);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                monitor.ReportError(GettextCatalog.GetString("Project could not be built: "), e);
                return(null);
            }
            finally
            {
                monitor.EndTask();
            }

            TempFileCollection tf = new TempFileCollection();
            Regex regexError      = data.GetErrorRegex(false);
            Regex regexWarning    = data.GetWarningRegex(false);

            BuildResult cr = ParseOutput(tf, output, Project.BaseDirectory, regexError, regexWarning);

            if (exitCode != 0 && cr.FailedBuildCount == 0)
            {
                cr.AddError(GettextCatalog.GetString("Build failed. See Build Output panel."));
            }

            return(cr);
        }
Ejemplo n.º 15
0
        /// <summary>Executes a build command, writing output to the monitor.</summary>
        /// <returns>Whether the command executed successfully.</returns>
        /// <param name='monitor'>Progress monitor for writing output and handling cancellation.</param>
        /// <param name='startInfo'>Process start info. Redirection will be enabled if necessary.</param>
        /// <param name='stdout'>Text writer for stdout. May be null.</param>
        /// <param name='stderr'>Text writer for stderr. May be null.</param>
        public static int ExecuteBuildCommand(IProgressMonitor monitor, ProcessStartInfo startInfo,
                                              TextWriter stdout, TextWriter stderr)
        {
            monitor.Log.WriteLine(startInfo.FileName + " " + startInfo.Arguments);

            startInfo.UseShellExecute        = false;
            startInfo.RedirectStandardError  = true;
            startInfo.RedirectStandardOutput = true;

            int exitCode = -1;

            TextWriter    outWriter = monitor.Log, errWriter = monitor.Log;
            LogTextWriter chainedOut = null, chainedErr = null;

            if (stdout != null)
            {
                chainedOut = new LogTextWriter();
                chainedOut.ChainWriter(outWriter);
                chainedOut.ChainWriter(stdout);
                outWriter = chainedOut;
            }

            if (stderr != null)
            {
                chainedErr = new LogTextWriter();
                chainedErr.ChainWriter(errWriter);
                chainedErr.ChainWriter(stderr);
                errWriter = chainedErr;
            }

            var operationMonitor = new AggregatedOperationMonitor(monitor);

            IProcessAsyncOperation p = null;

            try {
                p = Runtime.ProcessService.StartProcess(startInfo, outWriter, errWriter, null);
                operationMonitor.AddOperation(p);                  //handles cancellation
                p.WaitForCompleted();
                exitCode = p.ExitCode;
            } finally {
                if (chainedErr != null)
                {
                    chainedErr.Dispose();
                }
                if (chainedOut != null)
                {
                    chainedOut.Dispose();
                }
                if (p != null)
                {
                    p.Dispose();
                }
                operationMonitor.Dispose();
            }

            if (exitCode != 0)
            {
                monitor.Log.WriteLine("{0} exited with code {1}", Path.GetFileName(startInfo.FileName), exitCode);
            }

            return(exitCode);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Executes a file and reports events related to the execution to the 'monitor' passed in the parameters.
        /// </summary>
        public static int ExecuteCommand(
            string command,
            string args,
            string baseDirectory,

            IProgressMonitor monitor,
            out string errorOutput,
            out string programOutput)
        {
            bool useMonitor = monitor != null;

            errorOutput = string.Empty;
            int exitCode = -1;

            var swError  = new StringWriter();
            var swOutput = new StringWriter();

            var chainedError = new LogTextWriter();

            chainedError.ChainWriter(swError);

            var chainedOutput = new LogTextWriter();

            chainedOutput.ChainWriter(swOutput);

            if (useMonitor)
            {
                chainedError.ChainWriter(monitor.Log);
                chainedOutput.ChainWriter(monitor.Log);
                monitor.Log.WriteLine("{0} {1}", command, args);
            }

            // Workaround for not handling %PATH% env var expansion properly
            if (!command.Contains(Path.DirectorySeparatorChar))
            {
                command = TryExpandPathEnvVariable(command, baseDirectory);
            }

            TryHandleSheBang(ref command, ref args);

            var operationMonitor = useMonitor ? new AggregatedOperationMonitor(monitor) : null;
            var p = Runtime.ProcessService.StartProcess(command, args, baseDirectory, chainedOutput, chainedError, null);

            if (useMonitor)
            {
                operationMonitor.AddOperation(p);                  //handles cancellation
            }
            p.WaitForOutput();
            swError.Flush();
            swOutput.Flush();
            errorOutput   = swError.ToString();
            programOutput = swOutput.ToString();
            exitCode      = p.ExitCode;
            p.Dispose();

            if (useMonitor)
            {
                if (monitor.IsCancelRequested)
                {
                    monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled"));
                    monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null);
                    if (exitCode == 0)
                    {
                        exitCode = -1;
                    }
                }

                operationMonitor.Dispose();
            }

            chainedError.Close();
            swOutput.Close();
            swError.Close();

            return(exitCode);
        }
Ejemplo n.º 17
0
        public bool Deploy(DeployContext ctx, Solution solution, string defaultConf, string targetDir, bool generateFiles, IProgressMonitor monitor)
        {
            if (generateFiles)
            {
                if (!GenerateFiles(ctx, solution, defaultConf, monitor))
                {
                    return(false);
                }
            }

            monitor.BeginTask(GettextCatalog.GetString("Deploying Solution to Tarball"), 3);
            try
            {
                string baseDir = Path.GetDirectoryName(solution.FileName);

                ProcessWrapper ag_process = Runtime.ProcessService.StartProcess("sh",
                                                                                generateAutotools ? "autogen.sh" : "configure",
                                                                                baseDir,
                                                                                monitor.Log,
                                                                                monitor.Log,
                                                                                null);
                ag_process.WaitForOutput();

                if (ag_process.ExitCode > 0)
                {
                    throw new Exception(GettextCatalog.GetString("An unspecified error occurred while running '{0}'", generateAutotools ? "autogen.sh" : "configure"));
                }

                monitor.Step(1);

                StringWriter  sw            = new StringWriter();
                LogTextWriter chainedOutput = new LogTextWriter();
                chainedOutput.ChainWriter(monitor.Log);
                chainedOutput.ChainWriter(sw);

                ProcessWrapper process = Runtime.ProcessService.StartProcess("make",
                                                                             "dist",
                                                                             baseDir,
                                                                             chainedOutput,
                                                                             monitor.Log,
                                                                             null);
                process.WaitForOutput();

                if (process.ExitCode > 0)
                {
                    throw new Exception(GettextCatalog.GetString("An unspecified error occurred while running '{0}'", "make dist"));
                }

                monitor.Step(1);

                // FIXME: hackish way to get the created tarball's filename
                string output = sw.ToString();
                int    targz  = output.LastIndexOf("tar.gz");
                int    begin  = output.LastIndexOf('>', targz);

                string filename = output.Substring(begin + 1, (targz - begin) + 5).Trim();

                FileService.CopyFile(Path.Combine(baseDir, filename), Path.Combine(targetDir, filename));
                monitor.Step(1);
            }
            catch (Exception e)
            {
                monitor.ReportError(GettextCatalog.GetString("Solution could not be deployed: "), e);
                return(false);
            }
            finally
            {
                monitor.EndTask();
            }
            monitor.ReportSuccess(GettextCatalog.GetString("Solution was successfully deployed."));
            return(true);
        }