diff --git a/lib/kafo/progress_bar.rb b/lib/kafo/progress_bar.rb index cfe5eacb..8f8299c7 100644 --- a/lib/kafo/progress_bar.rb +++ b/lib/kafo/progress_bar.rb @@ -10,9 +10,9 @@ module Kafo # #finite_template and #infinite_template methods. Also you may find useful to # change more methods like #done_message or #print_error class ProgressBar - MONITOR_RESOURCE = %r{\w*MONITOR_RESOURCE ([^\]]+\])} - EVALTRACE_START = %r{/(.+\]): Starting to evaluate the resource} - EVALTRACE_END = %r{/(.+\]): Evaluated in [\d\.]+ seconds} + MONITOR_RESOURCE = %r{\w*MONITOR_RESOURCE (?[^\]]+\])} + EVALTRACE_START = %r{/(?.+\]): Starting to evaluate the resource( \((?\d+) of (?\d+)\))?} + EVALTRACE_END = %r{/(?.+\]): Evaluated in [\d\.]+ seconds} PREFETCH = %r{Prefetching .* resources for} def initialize @@ -37,12 +37,25 @@ def update(line) force_update = false if (line_monitor = MONITOR_RESOURCE.match(line)) - @resources << line_monitor[1] + @resources << line_monitor[:resource] @total = (@total == :unknown ? 1 : @total + 1) end if (line_start = EVALTRACE_START.match(line)) - if (known_resource = find_known_resource(line_start[1])) + if line_start[:total] + # Puppet 6.6 introduced progress in evaltrace + # Puppet counts 1-based where we count 0-based here + new_lines = line_start[:count].to_i - 1 + new_total = line_start[:total].to_i + if new_lines != @lines || @total != new_total + @lines = new_lines + @total = new_total + update_bar = true + force_update = true + end + end + + if (known_resource = find_resource(line_start[:resource])) line = known_resource update_bar = true force_update = true @@ -50,7 +63,7 @@ def update(line) end if (line_end = EVALTRACE_END.match(line)) && @total != :unknown && @lines < @total - if (known_resource = find_known_resource(line_end[1])) + if (known_resource = find_resource(line_end[:resource])) @resources.delete(known_resource) # ensure it's only counted once @lines += 1 end @@ -102,14 +115,9 @@ def infinite_template 'Installing...' end - def find_known_resource(resource) - loop do - return resource if @resources.include?(resource) - # continue to remove prefixes from /Stage[main]/Example/File[/etc/foo] until a resource name is found - break unless resource.include?('/') - resource = resource.sub %r{.*?/}, '' - end - nil + def find_resource(resource) + found = resource.match(%r{Stage.*\/(?.*\[.*\])$}) + found.nil? ? nil : found[:resource] end end diff --git a/test/kafo/progress_bar_test.rb b/test/kafo/progress_bar_test.rb index 2239a42c..6380eb56 100644 --- a/test/kafo/progress_bar_test.rb +++ b/test/kafo/progress_bar_test.rb @@ -5,30 +5,49 @@ module Kafo let(:bar) { ProgressBar.new.tap { |pb| pb.instance_variable_set(:@bar, powerbar) } } let(:powerbar) { MiniTest::Mock.new } - it "calls powerbar.show" do - powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => 2}, true]) - powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 1, :total => 2}, true]) - powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 1, :total => 2}, true]) + describe 'Puppet 5' do + it "calls powerbar.show" do + powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 1, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 1, :total => 2}, true]) - bar.update('MONITOR_RESOURCE File[/foo/bar]') - bar.update('MONITOR_RESOURCE Notify[test]') - bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') - bar.update('Prefetching example resources for example_type') - bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') - powerbar.verify + bar.update('MONITOR_RESOURCE File[/foo/bar]') + bar.update('MONITOR_RESOURCE Notify[test]') + bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') + bar.update('Prefetching example resources for example_type') + bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') + powerbar.verify + end + + it 'handles an unknown total' do + powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => :unknown}, true]) + powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 0, :total => :unknown}, true]) + powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 0, :total => :unknown}, true]) + + bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') + bar.update('Prefetching example resources for example_type') + bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') + powerbar.verify + end end - it 'handles an unknown total' do - powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 0, :total => :unknown}, true]) + describe 'Puppet 6' do + it "calls powerbar.show" do + powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 1, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 1, :total => 2}, true]) - bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') - bar.update('Prefetching example resources for example_type') - bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') - powerbar.verify + bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource (1 of 2)') + bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') + bar.update('Prefetching example resources for example_type') + bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource (2 of 2)') + bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') + powerbar.verify + end end end end