using System; using System.IO; using System.Text; using ln.build.commands; using ln.logging; namespace ln.build.pipeline { public class ShellCommand : StageCommand { public event CommandExitedDelegate OnCommandExited; public CommandRunner CommandRunner { get; } public ShellCommand(string filename,params CommandRunner.Argument[] arguments) :base("SH") { CommandRunner = new CommandRunner("/bin/bash", "-c"){ Throw = CRThrow.NEVER, }; CommandRunner.AddArguments(arguments); } public ShellCommand(string cmdline) :base("SH") { CommandRunner = new CommandRunner("/bin/bash", "-c", string.Format("\"{0}\"",cmdline)){ Throw = CRThrow.NEVER, }; } public override void Run(Stage stage) { MemoryStream logStream = new MemoryStream(); int result = CommandRunner.Run(stage.CommandEnvironment, logStream); stage.CommandEnvironment.Logger.Log(LogLevel.INFO, "command output:\n{0}", Encoding.UTF8.GetString(logStream.ToArray())); stage.CommandEnvironment.Logger.Log(LogLevel.INFO, "command exit code: {0}", result); if (result != 0) throw new Exception(String.Format("command exited with code {0} [0x{0:x}]", result)); } } }