From 641fcd0acac991add511fd778c6b3d9599764ace Mon Sep 17 00:00:00 2001 From: Mitchell Chambers Date: Fri, 9 Jun 2023 13:45:28 +1000 Subject: [PATCH] Add protective code for error parsing with versionomy issue #324 --- lib/onceover/controlrepo.rb | 99 +++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/lib/onceover/controlrepo.rb b/lib/onceover/controlrepo.rb index 9247cae..8462851 100644 --- a/lib/onceover/controlrepo.rb +++ b/lib/onceover/controlrepo.rb @@ -232,61 +232,74 @@ def print_puppetfile_table output_array = [] threads = [] + error_array = [] puppetfile.modules.each do |mod| threads << Thread.new do - row = [] - logger.debug "Loading data for #{mod.full_name}" - row << mod.full_name - if mod.is_a?(R10K::Module::Forge) - row << mod.expected_version - row << mod.v3_module.current_release.version - - # Configure a custom version format to support modern Puppet Forge versions. - # (major.minor.tiny-patchlevel-patchlevel_minor) - # e.g. 8.5.0-0-2 - puppet_format = Versionomy.default_format.modified_copy do - field(:patchlevel_minor) do - recognize_number(:default_value_optional => true, - :delimiter_regexp => '-', - :default_delimiter => '-') + begin + row = [] + logger.debug "Loading data for #{mod.full_name}" + row << mod.full_name + if mod.is_a?(R10K::Module::Forge) + row << mod.expected_version + row << mod.v3_module.current_release.version + + # Configure a custom version format to support modern Puppet Forge versions. + # (major.minor.tiny-patchlevel-patchlevel_minor) + # e.g. 8.5.0-0-2 + puppetforge_format = Versionomy.default_format.modified_copy do + field(:patchlevel_minor) do + recognize_number(:default_value_optional => true, + :delimiter_regexp => '-', + :default_delimiter => '-') + end end - end - current = puppetforge_format.parse(mod.expected_version) - latest = puppetforge_format.parse(mod.v3_module.current_release.version) - row << if current.major < latest.major - "Major".red - elsif current.minor < latest.minor - "Minor".yellow - elsif current.tiny < latest.tiny - "Tiny".green - elsif current.patchlevel < latest.patchlevel - "PatchLevel".green - elsif current.patchlevel_minor < latest.patchlevel_minor - "PatchLevel_minor".green - else - "No".green - end - - row << mod.v3_module.endorsement - superseded_by = mod.v3_module.superseded_by - row << (superseded_by.nil? ? '' : superseded_by[:slug]) - else - row << "N/A" - row << "N/A" - row << "N/A" - row << "N/A" - row << "N/A" + current = puppetforge_format.parse(mod.expected_version) + latest = puppetforge_format.parse(mod.v3_module.current_release.version) + row << if current.major < latest.major + "Major".red + elsif current.minor < latest.minor + "Minor".yellow + elsif current.tiny < latest.tiny + "Tiny".green + elsif current.patchlevel < latest.patchlevel + "PatchLevel".green + elsif current.patchlevel_minor < latest.patchlevel_minor + "PatchLevel_minor".green + else + "No".green + end + + row << mod.v3_module.endorsement + superseded_by = mod.v3_module.superseded_by + row << (superseded_by.nil? ? '' : superseded_by[:slug]) + else + row << "N/A" + row << "N/A" + row << "N/A" + row << "N/A" + row << "N/A" + end + output_array << row + rescue => e + error = [] + error << mod.full_name + error << mod.expected_version + error << mod.v3_module.current_release.version + error << e.message + error_array << error + logger.debug "Error loading module #{mod.full_name} - #{e.inspect}" + end end - output_array << row end - end threads.map(&:join) output_array.sort_by! { |line| line[0] } + error_array.sort_by! { |line| line[0] } unless error_array.empty? puts Terminal::Table.new(headings: ["Full Name", "Current Version", "Latest Version", "Out of Date?", "Endorsement", "Superseded by"], rows: output_array) + puts Terminal::Table.new(headings: ["Issue assessing module", "Current", "Latest", "Error"], rows: error_array) unless error_array.empty? end def update_puppetfile