diff --git a/lib/parallel_tests/cli.rb b/lib/parallel_tests/cli.rb index fcd99df1..f312e566 100644 --- a/lib/parallel_tests/cli.rb +++ b/lib/parallel_tests/cli.rb @@ -212,6 +212,7 @@ def parse_options!(argv) opts.on("--serialize-stdout", "Serialize stdout output, nothing will be written until everything is done") { options[:serialize_stdout] = true } opts.on("--prefix-output-with-test-env-number", "Prefixes test env number to the output when not using --serialize-stdout") { options[:prefix_output_with_test_env_number] = true } opts.on("--combine-stderr", "Combine stderr into stdout, useful in conjunction with --serialize-stdout") { options[:combine_stderr] = true } + opts.on("--progress-bar-compatible", "Serialize stdout output, but write immediately and rewrite on the fly") { options[:progress_bar_compatible] = true; options[:combine_stderr] = false } opts.on("--non-parallel", "execute same commands but do not in parallel, needs --exec") { options[:non_parallel] = true } opts.on("--no-symlinks", "Do not traverse symbolic links to find test files") { options[:symlinks] = false } opts.on('--ignore-tags [PATTERN]', 'When counting steps ignore scenarios with tags that match this pattern') { |arg| options[:ignore_tag_pattern] = arg } diff --git a/lib/parallel_tests/output_rewriter.rb b/lib/parallel_tests/output_rewriter.rb new file mode 100644 index 00000000..60060a7e --- /dev/null +++ b/lib/parallel_tests/output_rewriter.rb @@ -0,0 +1,24 @@ +require 'parallel_tests' + +module ParallelTests + class OutputRewriter + CURSOR_UP_CHARACTER = "\033[A" + + $output_rewrite_mutex = Mutex.new + $output_by_group = [] + + def self.rewrite(new_group_output:, group_index:) + $output_rewrite_mutex.synchronize do + number_of_lines_to_overwrite = $output_by_group.sum { |s| s.to_s.count("\n") } + + $output_by_group[group_index] = new_group_output + + result = CURSOR_UP_CHARACTER * number_of_lines_to_overwrite + $output_by_group.each { |group_output| result += group_output.to_s } + + $stdout.print result + $stdout.flush + end + end + end +end diff --git a/lib/parallel_tests/test/runner.rb b/lib/parallel_tests/test/runner.rb index d697027a..ff94545f 100644 --- a/lib/parallel_tests/test/runner.rb +++ b/lib/parallel_tests/test/runner.rb @@ -1,4 +1,5 @@ require 'parallel_tests' +require 'parallel_tests/output_rewriter' module ParallelTests module Test @@ -158,7 +159,10 @@ def capture_output(out, env, options={}) read = read.force_encoding(Encoding.default_internal) end result << read - unless options[:serialize_stdout] + + if options[:progress_bar_compatible] + ParallelTests::OutputRewriter.rewrite(new_group_output: result, group_index: env['TEST_ENV_NUMBER'].to_i) + elsif !options[:serialize_stdout] message = read message = "[TEST GROUP #{env['TEST_ENV_NUMBER']}] #{message}" if options[:prefix_output_with_test_env_number] $stdout.print message