Hello community, here is the log from the commit of package rubygem-sshkit for openSUSE:Factory checked in at 2016-07-01 09:59:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-sshkit (Old) and /work/SRC/openSUSE:Factory/.rubygem-sshkit.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-sshkit" Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-sshkit/rubygem-sshkit.changes 2016-05-29 03:12:35.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-sshkit.new/rubygem-sshkit.changes 2016-07-01 09:59:21.000000000 +0200 @@ -1,0 +2,6 @@ +Wed Jun 15 04:34:48 UTC 2016 - co...@suse.com + +- updated to version 1.11.0 + see installed CHANGELOG.md + +------------------------------------------------------------------- Old: ---- sshkit-1.10.0.gem New: ---- sshkit-1.11.0.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-sshkit.spec ++++++ --- /var/tmp/diff_new_pack.YJ0Fxg/_old 2016-07-01 09:59:21.000000000 +0200 +++ /var/tmp/diff_new_pack.YJ0Fxg/_new 2016-07-01 09:59:21.000000000 +0200 @@ -24,7 +24,7 @@ # Name: rubygem-sshkit -Version: 1.10.0 +Version: 1.11.0 Release: 0 %define mod_name sshkit %define mod_full_name %{mod_name}-%{version} ++++++ sshkit-1.10.0.gem -> sshkit-1.11.0.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md --- old/CHANGELOG.md 2016-04-22 19:56:55.000000000 +0200 +++ new/CHANGELOG.md 2016-06-14 21:43:07.000000000 +0200 @@ -3,16 +3,29 @@ This file is written in reverse chronological order, newer releases will appear at the top. -## `master` (Unreleased) +## [Unreleased][] * Add your entries below here, remember to credit yourself however you want to be credited! +## [1.11.0][] (2016-06-14) + +### Bug fixes + + * Fixed colorized output alignment in Logger::Pretty. @xavierholt + [PR #349](https://github.com/capistrano/sshkit/pull/349) + * Fixed a bug that prevented nested `with` calls + [#43](https://github.com/capistrano/sshkit/issues/43) + +### Other changes + + * Known hosts lookup optimization is now enabled by default. @byroot + ## 1.10.0 (2016-04-22) * You can now opt-in to caching of SSH's known_hosts file for a speed boost when deploying to a large fleet of servers. Refer to the - [README](https://github.com/capistrano/sshkit#known-hosts-caching) for + [README](https://github.com/capistrano/sshkit/tree/v1.10.0#known-hosts-caching) for details. We plan to turn this on by default in a future version of SSHKit. [PR #330](https://github.com/capistrano/sshkit/pull/330) @byroot * SSHKit now explicitly closes its pooled SSH connections when Ruby exits; @@ -615,3 +628,6 @@ ## 0.0.1 First release. + +[Unreleased]: https://github.com/capistrano/sshkit/compare/v1.11.0...HEAD +[1.11.0]: https://github.com/capistrano/sshkit/compare/v1.10.0...v1.11.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/EXAMPLES.md new/EXAMPLES.md --- old/EXAMPLES.md 2016-04-22 19:56:55.000000000 +0200 +++ new/EXAMPLES.md 2016-06-14 21:43:07.000000000 +0200 @@ -44,10 +44,10 @@ ```ruby on hosts do |host| f = '/some/file' - if test("[ -d #{f} ]") - execute :touch, f - else + if test("[ -f #{f} ]") info "#{f} already exists on #{host}!" + else + execute :touch, f end end ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2016-04-22 19:56:55.000000000 +0200 +++ new/README.md 2016-06-14 21:43:07.000000000 +0200 @@ -53,7 +53,7 @@ Typically, you would pass a Symbol for the command name and it's args as follows: ```ruby -on '1.example.com' +on '1.example.com' do if test("[ -f somefile.txt ]") execute(:cp, 'somefile.txt', 'somewhere_else.txt') end @@ -508,19 +508,6 @@ SSHKit::Backend::Netssh.pool.idle_timeout = 0 # disabled ``` -## Known hosts caching - -If you connect to many hosts with the `Netssh` backend, looking up `~/.ssh/known_hosts` can significantly impact performances. -You can mitigate this by using SSHKit's lookup caching like this: - -```ruby -SSHKit::Backend::Netssh.configure do |ssh| - ssh.ssh_options = { - known_hosts: SSHKit::Backend::Netssh::KnownHosts.new, - } -end -``` - ## Tunneling and other related SSH themes In order to do special gymnasitcs with SSH, tunneling, aliasing, complex options, etc with SSHKit it is possible to use [the underlying Net::SSH API](https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md#setting-global-ssh-options) however in many cases it is preferred to use the system SSH configuration file at [`~/.ssh/config`](http://man.cx/ssh_config). This allows you to have personal configuration tied to your machine that does not have to be committed with the repository. If this is not suitable (everyone on the team needs a proxy command, or some special aliasing) a file in the same format can be placed in the project directory at `~/yourproject/.ssh/config`, this will be merged with the system settings in `~/.ssh/config`, and with any configuration specified in [`SSHKit::Backend::Netssh.config.ssh_options`](https://github.com/capistrano/sshkit/blob/master/lib/sshkit/backends/netssh.rb#L133). Files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/backends/abstract.rb new/lib/sshkit/backends/abstract.rb --- old/lib/sshkit/backends/abstract.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/backends/abstract.rb 2016-06-14 21:43:07.000000000 +0200 @@ -35,6 +35,11 @@ raise "Must pass a Host object" unless host.is_a? Host @host = host @block = block + + @pwd = nil + @env = nil + @user = nil + @group = nil end def make(commands=[]) @@ -83,12 +88,11 @@ end def with(environment, &_block) - @_env = (@env ||= {}) - @env = @_env.merge environment + env_old = (@env ||= {}) + @env = env_old.merge environment yield ensure - @env = @_env - remove_instance_variable(:@_env) + @env = env_old end def as(who, &_block) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/backends/local.rb new/lib/sshkit/backends/local.rb --- old/lib/sshkit/backends/local.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/backends/local.rb 2016-06-14 21:43:07.000000000 +0200 @@ -7,8 +7,7 @@ class Local < Abstract def initialize(_ = nil, &block) - @host = Host.new(:local) # just for logging - @block = block + super(Host.new(:local), &block) end def upload!(local, remote, _options = {}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/backends/netssh.rb new/lib/sshkit/backends/netssh.rb --- old/lib/sshkit/backends/netssh.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/backends/netssh.rb 2016-06-14 21:43:07.000000000 +0200 @@ -28,7 +28,13 @@ attr_writer :ssh_options def ssh_options - @ssh_options ||= {} + default_options.merge(@ssh_options ||= {}) + end + + private + + def default_options + @default_options ||= {known_hosts: SSHKit::Backend::Netssh::KnownHosts.new} end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/command.rb new/lib/sshkit/command.rb --- old/lib/sshkit/command.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/command.rb 2016-06-14 21:43:07.000000000 +0200 @@ -131,9 +131,9 @@ def verbosity if (vb = options[:verbosity]) - case vb.class.name - when 'Symbol' then return Logger.const_get(vb.to_s.upcase) - when 'Fixnum' then return vb + case vb + when Symbol then return Logger.const_get(vb.to_s.upcase) + when Integer then return vb end else Logger::INFO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/configuration.rb new/lib/sshkit/configuration.rb --- old/lib/sshkit/configuration.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/configuration.rb 2016-06-14 21:43:07.000000000 +0200 @@ -10,7 +10,10 @@ end def deprecation_logger - self.deprecation_output = $stderr if @deprecation_logger.nil? + unless defined? @deprecation_logger + self.deprecation_output = $stderr + end + @deprecation_logger end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/formatters/pretty.rb new/lib/sshkit/formatters/pretty.rb --- old/lib/sshkit/formatters/pretty.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/formatters/pretty.rb 2016-06-14 21:43:07.000000000 +0200 @@ -34,7 +34,7 @@ def log_command_exit(command) runtime = sprintf('%5.3f seconds', command.runtime) - successful_or_failed = command.failure? ? colorize('failed', :red, :bold) : colorize('successful', :green, :bold) + successful_or_failed = command.failure? ? colorize('failed', :red, :bold) : colorize('successful', :green, :bold) message = "Finished in #{runtime} with exit status #{command.exit_status} (#{successful_or_failed})." write_message(command.verbosity, message, command.uuid) end @@ -43,8 +43,8 @@ def format_message(verbosity, message, uuid=nil) message = "[#{colorize(uuid, :green)}] #{message}" unless uuid.nil? - level = colorize(Pretty::LEVEL_NAMES[verbosity], Pretty::LEVEL_COLORS[verbosity]) - '%6s %s' % [level, message] + level = colorize(LEVEL_NAMES[verbosity].rjust(6), LEVEL_COLORS[verbosity]) + "#{level} #{message}" end private diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/host.rb new/lib/sshkit/host.rb --- old/lib/sshkit/host.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/host.rb 2016-06-14 21:43:07.000000000 +0200 @@ -17,10 +17,12 @@ end def keys - Array(@keys) + @keys end def initialize(host_string_or_options_hash) + @keys = [] + @local = false if host_string_or_options_hash == :local @local = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/runners/group.rb new/lib/sshkit/runners/group.rb --- old/lib/sshkit/runners/group.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/runners/group.rb 2016-06-14 21:43:07.000000000 +0200 @@ -3,17 +3,20 @@ module Runner class Group < Sequential - attr_writer :group_size + attr_accessor :group_size + + def initialize(hosts, options = nil, &block) + super(hosts, options, &block) + @group_size = @options[:limit] || 2 + end + def execute hosts.each_slice(group_size).collect do |group_hosts| Parallel.new(group_hosts, &block).execute sleep wait_interval end.flatten end - private - def group_size - @group_size || options[:limit] || 2 - end + end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/runners/sequential.rb new/lib/sshkit/runners/sequential.rb --- old/lib/sshkit/runners/sequential.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/runners/sequential.rb 2016-06-14 21:43:07.000000000 +0200 @@ -3,7 +3,13 @@ module Runner class Sequential < Abstract - attr_writer :wait_interval + attr_accessor :wait_interval + + def initialize(hosts, options = nil, &block) + super(hosts, options, &block) + @wait_interval = @options[:wait] || 2 + end + def execute last_host = hosts.pop @@ -16,6 +22,7 @@ run_backend(last_host, &block) end end + private def run_backend(host, &block) backend(host, &block).run @@ -24,9 +31,6 @@ raise e2, "Exception while executing #{host.user ? "as #{host.user}@" : "on host "}#{host}: #{e.message}" end - def wait_interval - @wait_interval || options[:wait] || 2 - end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/sshkit/version.rb new/lib/sshkit/version.rb --- old/lib/sshkit/version.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/lib/sshkit/version.rb 2016-06-14 21:43:07.000000000 +0200 @@ -1,3 +1,3 @@ module SSHKit - VERSION = "1.10.0".freeze + VERSION = "1.11.0".freeze end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2016-04-22 19:56:55.000000000 +0200 +++ new/metadata 2016-06-14 21:43:07.000000000 +0200 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: sshkit version: !ruby/object:Gem::Version - version: 1.10.0 + version: 1.11.0 platform: ruby authors: - Lee Hambley @@ -9,7 +9,7 @@ autorequire: bindir: bin cert_chain: [] -date: 2016-04-22 00:00:00.000000000 Z +date: 2016-06-14 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: net-ssh @@ -96,20 +96,6 @@ - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency - name: unindent - requirement: !ruby/object:Gem::Requirement - requirements: - - - ">=" - - !ruby/object:Gem::Version - version: '0' - type: :development - prerelease: false - version_requirements: !ruby/object:Gem::Requirement - requirements: - - - ">=" - - !ruby/object:Gem::Version - version: '0' -- !ruby/object:Gem::Dependency name: mocha requirement: !ruby/object:Gem::Requirement requirements: @@ -198,7 +184,6 @@ - test/unit/backends/test_local.rb - test/unit/backends/test_netssh.rb - test/unit/backends/test_printer.rb -- test/unit/core_ext/test_string.rb - test/unit/formatters/test_custom.rb - test/unit/formatters/test_dot.rb - test/unit/formatters/test_pretty.rb @@ -233,7 +218,7 @@ version: '0' requirements: [] rubyforge_project: -rubygems_version: 2.6.2 +rubygems_version: 2.6.4 signing_key: specification_version: 4 summary: SSHKit makes it easy to write structured, testable SSH commands in Ruby @@ -251,7 +236,6 @@ - test/unit/backends/test_local.rb - test/unit/backends/test_netssh.rb - test/unit/backends/test_printer.rb -- test/unit/core_ext/test_string.rb - test/unit/formatters/test_custom.rb - test/unit/formatters/test_dot.rb - test/unit/formatters/test_pretty.rb diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sshkit.gemspec new/sshkit.gemspec --- old/sshkit.gemspec 2016-04-22 19:56:55.000000000 +0200 +++ new/sshkit.gemspec 2016-06-14 21:43:07.000000000 +0200 @@ -24,6 +24,5 @@ gem.add_development_dependency('minitest-reporters') gem.add_development_dependency('rake') gem.add_development_dependency('rubocop') - gem.add_development_dependency('unindent') gem.add_development_dependency('mocha') end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/functional/backends/test_netssh.rb new/test/functional/backends/test_netssh.rb --- old/test/functional/backends/test_netssh.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/test/functional/backends/test_netssh.rb 2016-06-14 21:43:07.000000000 +0200 @@ -33,13 +33,13 @@ end.run command_lines = @output.lines.select { |line| line.start_with?('Command:') } - assert_equal <<-EOEXPECTED.unindent, command_lines.join - Command: /usr/bin/env date - Command: /usr/bin/env ls -l - Command: if test ! -d /tmp; then echo \"Directory does not exist '/tmp'\" 1>&2; false; fi - Command: if ! sudo -u root whoami > /dev/null; then echo \"You cannot switch to user 'root' using sudo, please check the sudoers file\" 1>&2; false; fi - Command: cd /tmp && ( export RAILS_ENV="production" ; sudo -u root RAILS_ENV="production" -- sh -c '/usr/bin/env touch restart.txt' ) - EOEXPECTED + assert_equal [ + "Command: /usr/bin/env date\n", + "Command: /usr/bin/env ls -l\n", + "Command: if test ! -d /tmp; then echo \"Directory does not exist '/tmp'\" 1>&2; false; fi\n", + "Command: if ! sudo -u root whoami > /dev/null; then echo \"You cannot switch to user 'root' using sudo, please check the sudoers file\" 1>&2; false; fi\n", + "Command: cd /tmp && ( export RAILS_ENV=\"production\" ; sudo -u root RAILS_ENV=\"production\" -- sh -c '/usr/bin/env touch restart.txt' )\n" + ], command_lines end def test_capture @@ -59,7 +59,10 @@ capture(:uname) host_ssh_options = host.ssh_options end.run - assert_equal({ forward_agent: false, paranoid: true }, host_ssh_options) + assert_equal [:forward_agent, :paranoid, :known_hosts].sort, host_ssh_options.keys.sort + assert_equal false, host_ssh_options[:forward_agent] + assert_equal true, host_ssh_options[:paranoid] + assert_instance_of SSHKit::Backend::Netssh::KnownHosts, host_ssh_options[:known_hosts] end def test_env_vars_substituion_in_subshell diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/helper.rb new/test/helper.rb --- old/test/helper.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/test/helper.rb 2016-06-14 21:43:07.000000000 +0200 @@ -4,7 +4,6 @@ require 'minitest/autorun' require 'minitest/reporters' require 'mocha/setup' -require 'unindent' require 'stringio' require 'json' @@ -21,6 +20,7 @@ end SSHKit::Backend::ConnectionPool.class_eval do + alias_method :old_flush_connections, :flush_connections def flush_connections Thread.current[:sshkit_pool] = {} end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/unit/backends/test_abstract.rb new/test/unit/backends/test_abstract.rb --- old/test/unit/backends/test_abstract.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/test/unit/backends/test_abstract.rb 2016-06-14 21:43:07.000000000 +0200 @@ -161,6 +161,7 @@ def initialize(&block) block = block.nil? ? lambda {} : block super(ExampleBackend.example_host, &block) + @full_stdout = nil end def execute_command(command) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/unit/backends/test_netssh.rb new/test/unit/backends/test_netssh.rb --- old/test/unit/backends/test_netssh.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/test/unit/backends/test_netssh.rb 2016-06-14 21:43:07.000000000 +0200 @@ -26,7 +26,7 @@ assert_equal %w(/home/user/.ssh/id_rsa), backend.config.ssh_options[:keys] assert_equal false, backend.config.ssh_options[:forward_agent] assert_equal %w(publickey password), backend.config.ssh_options[:auth_methods] - + assert_instance_of backend::KnownHosts, backend.config.ssh_options[:known_hosts] end def test_netssh_ext diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/unit/core_ext/test_string.rb new/test/unit/core_ext/test_string.rb --- old/test/unit/core_ext/test_string.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/test/unit/core_ext/test_string.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,12 +0,0 @@ -class String - - def unindent - indent = self.split("\n").select do |line| - !line.strip.empty? - end.map do |line| - line.index(/[^\s]/) - end.compact.min || 0 - self.gsub(/^[[:blank:]]{#{indent}}/, '') - end - -end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/unit/formatters/test_pretty.rb new/test/unit/formatters/test_pretty.rb --- old/test/unit/formatters/test_pretty.rb 2016-04-22 19:56:55.000000000 +0200 +++ new/test/unit/formatters/test_pretty.rb 2016-06-14 21:43:07.000000000 +0200 @@ -18,12 +18,12 @@ end { - log: "\e[0;34;49mINFO\e[0m Test\n", - fatal: "\e[0;31;49mFATAL\e[0m Test\n", - error: "\e[0;31;49mERROR\e[0m Test\n", - warn: "\e[0;33;49mWARN\e[0m Test\n", - info: "\e[0;34;49mINFO\e[0m Test\n", - debug: "\e[0;30;49mDEBUG\e[0m Test\n" + log: "\e[0;34;49m INFO\e[0m Test\n", + fatal: "\e[0;31;49m FATAL\e[0m Test\n", + error: "\e[0;31;49m ERROR\e[0m Test\n", + warn: "\e[0;33;49m WARN\e[0m Test\n", + info: "\e[0;34;49m INFO\e[0m Test\n", + debug: "\e[0;30;49m DEBUG\e[0m Test\n" }.each do |level, expected_output| define_method("test_#{level}_output_with_color") do output.stubs(:tty?).returns(true) @@ -37,11 +37,11 @@ simulate_command_lifecycle(pretty) expected_log_lines = [ - "\e[0;34;49mINFO\e[0m [\e[0;32;49maaaaaa\e[0m] Running \e[1;33;49m/usr/bin/env a_cmd some args\e[0m as \e[0;34;49muser\e[0m@\e[0;34;49mlocalhost\e[0m", - "\e[0;30;49mDEBUG\e[0m [\e[0;32;49maaaaaa\e[0m] Command: \e[0;34;49m/usr/bin/env a_cmd some args\e[0m", - "\e[0;30;49mDEBUG\e[0m [\e[0;32;49maaaaaa\e[0m] \e[0;32;49m\tstdout message\e[0m", - "\e[0;30;49mDEBUG\e[0m [\e[0;32;49maaaaaa\e[0m] \e[0;31;49m\tstderr message\e[0m", - "\e[0;34;49mINFO\e[0m [\e[0;32;49maaaaaa\e[0m] Finished in 1.000 seconds with exit status 0 (\e[1;32;49msuccessful\e[0m)." + "\e[0;34;49m INFO\e[0m [\e[0;32;49maaaaaa\e[0m] Running \e[1;33;49m/usr/bin/env a_cmd some args\e[0m as \e[0;34;49muser\e[0m@\e[0;34;49mlocalhost\e[0m", + "\e[0;30;49m DEBUG\e[0m [\e[0;32;49maaaaaa\e[0m] Command: \e[0;34;49m/usr/bin/env a_cmd some args\e[0m", + "\e[0;30;49m DEBUG\e[0m [\e[0;32;49maaaaaa\e[0m] \e[0;32;49m\tstdout message\e[0m", + "\e[0;30;49m DEBUG\e[0m [\e[0;32;49maaaaaa\e[0m] \e[0;31;49m\tstderr message\e[0m", + "\e[0;34;49m INFO\e[0m [\e[0;32;49maaaaaa\e[0m] Finished in 1.000 seconds with exit status 0 (\e[1;32;49msuccessful\e[0m)." ] assert_equal expected_log_lines, output.split("\n") end