Write output from `sh' task action directly:
* Accept output as argument in Remote#execute; * Modify ShellCommand so that env output is directly handled.
This commit is contained in:
		| @@ -3,7 +3,8 @@ module Producer | ||||
|     module Actions | ||||
|       class ShellCommand < Action | ||||
|         def apply | ||||
|           output.puts remote.execute(arguments.first) | ||||
|           remote.execute(arguments.first, output) | ||||
|           output.puts | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   | ||||
| @@ -23,8 +23,7 @@ module Producer | ||||
|         @fs ||= Remote::FS.new(session.sftp.connect) | ||||
|       end | ||||
|  | ||||
|       def execute(command) | ||||
|         output = '' | ||||
|       def execute(command, output = '') | ||||
|         channel = session.open_channel do |channel| | ||||
|           channel.exec command do |ch, success| | ||||
|             ch.on_data do |c, data| | ||||
|   | ||||
| @@ -6,18 +6,20 @@ module Producer | ||||
|           raise 'no session for mock remote!' | ||||
|         end | ||||
|  | ||||
|         def execute(command) | ||||
|         def execute(command, output = '') | ||||
|           tokens = command.split | ||||
|           program = tokens.shift | ||||
|  | ||||
|           case program | ||||
|           when 'echo' | ||||
|             tokens.join ' ' | ||||
|             output << tokens.join(' ') | ||||
|           when 'true' | ||||
|             '' | ||||
|             output << '' | ||||
|           when 'false' | ||||
|             raise RemoteCommandExecutionError | ||||
|           end | ||||
|  | ||||
|           output | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   | ||||
| @@ -79,6 +79,7 @@ module Producer::Core | ||||
|     describe '#execute', :ssh do | ||||
|       let(:arguments) { 'some remote command' } | ||||
|       let(:command)   { "echo #{arguments}" } | ||||
|       let(:output)    { StringIO.new } | ||||
|  | ||||
|       it 'executes the given command in a new channel' do | ||||
|         story_with_new_channel do |ch| | ||||
| @@ -88,7 +89,7 @@ module Producer::Core | ||||
|         expect_story_completed { remote.execute command } | ||||
|       end | ||||
|  | ||||
|       it 'returns the output' do | ||||
|       it 'returns the command standard output output' do | ||||
|         story_with_new_channel do |ch| | ||||
|           ch.sends_exec command | ||||
|           ch.gets_data arguments | ||||
| @@ -96,6 +97,15 @@ module Producer::Core | ||||
|         expect(remote.execute command).to eq arguments | ||||
|       end | ||||
|  | ||||
|       it 'writes command standard output to provided output' do | ||||
|         story_with_new_channel do |ch| | ||||
|           ch.sends_exec command | ||||
|           ch.gets_data arguments | ||||
|         end | ||||
|         remote.execute command, output | ||||
|         expect(output.string).to eq arguments | ||||
|       end | ||||
|  | ||||
|       it 'raises an exception when the exit status code is not 0' do | ||||
|         story_with_new_channel do |ch| | ||||
|           ch.sends_exec command | ||||
|   | ||||
| @@ -15,7 +15,9 @@ module TestEnvHelpers | ||||
|  | ||||
|   def expect_execution(command) | ||||
|     opts = { expected_from: caller.first } | ||||
|     RSpec::Mocks.expect_message(env.remote, :execute, opts).with(command) | ||||
|     RSpec::Mocks | ||||
|       .expect_message(env.remote, :execute, opts) | ||||
|       .with(command, env.output) | ||||
|   end | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user