public Process StartCompile(HP.WindowsPrison.Prison prison)
        {
            string exe  = GetExecutable(Path.Combine(path, "bin"), "compile");
            string args = string.Format("{0} {1} >> {2} 2>&1", this.appDir, this.cacheDir, this.logFile);

            Logger.Debug("Running compile script {0} {1}", exe, args);

            var script = string.Format("{0} {1}", exe, args);

            Process process = prison.Execute(null, script, this.appDir, false, null, null, null, null);

            return(process);
        }
        public bool Detect(HP.WindowsPrison.Prison prison)
        {
            string exe = GetExecutable(Path.Combine(this.path, "bin"), "detect");

            string outputPath = Path.Combine(this.cacheDir, "detect.yml");
            string script     = string.Format("{0} {1} > {2} 2>&1", exe, this.appDir, outputPath);

            Logger.Debug("Running detect script: {0}", script);

            Process process = prison.Execute(null, script, this.appDir, false, null, null, null, null);

            var startTs = DateTime.Now;

            while (prison.JobObject != null && prison.JobObject.ActiveProcesses > 0)
            {
                if ((DateTime.Now - startTs).TotalSeconds > 30)
                {
                    Logger.Debug("Staging's detect script timed out. Killing all job processes. Detect path: {0}", exe);
                    prison.JobObject.TerminateProcesses(-2);
                    break;
                }

                Thread.Sleep(100);
            }

            if (File.Exists(outputPath))
            {
                this.detectOutput = File.ReadAllText(outputPath);
                Logger.Debug("Detect output: {0}", this.detectOutput);
                File.Delete(outputPath);
            }
            else
            {
                Logger.Warning("Detect output missing. Detect yml path: {0}", outputPath);
            }

            if (process.ExitCode == 0)
            {
                return(true);
            }
            else
            {
                Logger.Warning("Detect process exited with {0}", process.ExitCode);
                return(false);
            }
        }
        public ReleaseInfo GetReleaseInfo(HP.WindowsPrison.Prison prison)
        {
            string exe = GetExecutable(Path.Combine(this.path, "bin"), "release");

            string outputPath = Path.Combine(this.cacheDir, "release.yml");
            string script     = string.Format("{0} {1} > {2} 2>&1", exe, this.appDir, outputPath);

            Process process = prison.Execute(null, script, this.appDir, false, null, null, null, null);

            process.WaitForExit(5000);

            string output = File.ReadAllText(outputPath);

            File.Delete(outputPath);
            using (var reader = new StringReader(output))
            {
                Deserializer deserializer = new Deserializer();
                return((ReleaseInfo)deserializer.Deserialize(reader, typeof(ReleaseInfo)));
            }
        }