From 348af0f8b93abd9642d5bf0c5bf86edc23600ca0 Mon Sep 17 00:00:00 2001 From: oanatmaria <49147761+oanatmaria@users.noreply.github.com> Date: Wed, 3 Jun 2020 17:18:01 +0300 Subject: [PATCH 1/2] (maint) Test commit message action (#542) --- .github/workflows/checks.yaml | 2 ++ tasks/commits.rake | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/checks.yaml b/.github/workflows/checks.yaml index 6feef8c27..e53d21ac6 100644 --- a/.github/workflows/checks.yaml +++ b/.github/workflows/checks.yaml @@ -37,6 +37,8 @@ jobs: steps: - name: Checkout current PR uses: actions/checkout@v2 + with: + fetch-depth: 2 - name: Commit message checks uses: ruby/setup-ruby@v1 diff --git a/tasks/commits.rake b/tasks/commits.rake index 2192b2e20..7c53faa5e 100644 --- a/tasks/commits.rake +++ b/tasks/commits.rake @@ -8,7 +8,7 @@ task(:commits) do # populated with the range of commits the PR contains. If not available, this # falls back to `master..HEAD` as a next best bet as `master` is unlikely to # ever be absent. - commit_range = ENV['TRAVIS_COMMIT_RANGE'].nil? ? 'master..HEAD' : ENV['TRAVIS_COMMIT_RANGE'].sub(/\.\.\./, '..') + commit_range = 'HEAD^..HEAD' puts "Checking commits #{commit_range}" `git log --no-merges --pretty=%s #{commit_range}`.each_line do |commit_summary| # This regex tests for the currently supported commit summary tokens: maint, doc, gem, or fact-. From 9ccba540d6a32d9d17c6b62d88e42d3f0d9731ca Mon Sep 17 00:00:00 2001 From: Bogdan Irimie Date: Wed, 3 Jun 2020 17:50:02 +0300 Subject: [PATCH 2/2] (FACT-2635) Incorrect output for non existing fact (#536) * (FACT-2635) Add SearchFact and ResolvedFact with nil type. * (FACT-2635) Move nil fact resolution to internal fact manager. Fix tests. * (FACT-2634) Add test for nil fact. * (FACT-2635) Rubocop fixes. * (FACT-2635) Remove unused arguments from error_check. * (FACT-2635) Fix formatter for keys that contain ":" in their name. * (FACT-2635) Remove commented code. * (FACT-2635) Remove filter_nil_facts method as it was redundant. * (FACT-2635) Reject nil facts when resolving facts fro API calls. * (FACT-2635) Add test for nil fact in query parser. * (FACT0-2635) Add unit tests for rejection of nil facts in `[]` and `value` API methods. * (FACT-2635) Fix typo. * (FACT-2635) Make 'merge' a valid word for github action Co-authored-by: Oana Tanasoiu --- .rubocop_todo.yml | 2 - lib/facter.rb | 10 ++- .../fact/internal/internal_fact_manager.rb | 17 ++++- .../formatters/legacy_fact_formatter.rb | 6 +- lib/framework/parsers/query_parser.rb | 6 +- spec/facter/facter_spec.rb | 73 +++++++++++++------ spec/facter/query_parser_spec.rb | 12 +++ .../internal/internal_fact_manager_spec.rb | 18 +++++ tasks/commits.rake | 2 +- 9 files changed, 113 insertions(+), 33 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index efbc96bdb..d0f27d646 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -129,7 +129,6 @@ RSpec/MessageSpies: - 'spec/custom_facts/util/loader_spec.rb' - 'spec/custom_facts/util/parser_spec.rb' - 'spec/custom_facts/util/resolution_spec.rb' - - 'spec/facter/facter_spec.rb' - 'spec/facter/facts/aix/os/name_spec.rb' - 'spec/facter/facts/aix/os/release_spec.rb' - 'spec/facter/facts/macosx/is_virtual_spec.rb' @@ -188,7 +187,6 @@ RSpec/VerifiedDoubles: - 'spec/custom_facts/util/directory_loader_spec.rb' - 'spec/custom_facts/util/fact_spec.rb' - 'spec/custom_facts/util/resolution_spec.rb' - - 'spec/facter/facter_spec.rb' - 'spec/facter/facts/aix/ssh_spec.rb' - 'spec/facter/facts/macosx/memory/swap/capacity_spec.rb' - 'spec/facter/facts/macosx/memory/swap/used_bytes_spec.rb' diff --git a/lib/facter.rb b/lib/facter.rb index b92503022..61ea55369 100644 --- a/lib/facter.rb +++ b/lib/facter.rb @@ -245,7 +245,7 @@ def to_user_output(cli_options, *args) SessionCache.invalidate_all_caches fact_formatter = Facter::FormatterFactory.build(Facter::Options.get) - status = error_check(args, resolved_facts) + status = error_check(resolved_facts) [fact_formatter.format(resolved_facts), status || 0] end @@ -289,6 +289,9 @@ def resolve_fact(user_query) user_query = user_query.to_s resolved_facts = Facter::FactManager.instance.resolve_facts([user_query]) SessionCache.invalidate_all_caches + # we must make a distinction between custom facts that return nil and nil facts + # Nil facts should not be packaged as ResolvedFacts! (add_fact_to_searched_facts packages facts) + resolved_facts = resolved_facts.reject { |fact| fact.type == :nil } fact_collection = FactCollection.new.build_fact_collection!(resolved_facts) splitted_user_query = Facter::Utils.split_user_query(user_query) @@ -310,9 +313,10 @@ def resolve_fact(user_query) # facts that are not found or resolved, otherwise it will return nil # # @api private - def error_check(args, resolved_facts) + def error_check(resolved_facts) if Options[:strict] - missing_names = args - resolved_facts.map(&:user_query).uniq + missing_names = resolved_facts.select { |fact| fact.type == :nil }.map(&:user_query) + if missing_names.count.positive? status = 1 log_errors(missing_names) diff --git a/lib/framework/core/fact/internal/internal_fact_manager.rb b/lib/framework/core/fact/internal/internal_fact_manager.rb index 55d70ce47..cf249d799 100644 --- a/lib/framework/core/fact/internal/internal_fact_manager.rb +++ b/lib/framework/core/fact/internal/internal_fact_manager.rb @@ -5,11 +5,13 @@ class InternalFactManager @@log = Facter::Log.new(self) def resolve_facts(searched_facts) - searched_facts = filter_internal_facts(searched_facts) + internal_searched_facts = filter_internal_facts(searched_facts) + threads = start_threads(internal_searched_facts) + resolved_facts = join_threads(threads, internal_searched_facts) - threads = start_threads(searched_facts) + nil_resolved_facts = resolve_nil_facts(searched_facts) - join_threads(threads, searched_facts) + resolved_facts.concat(nil_resolved_facts) end private @@ -18,6 +20,15 @@ def filter_internal_facts(searched_facts) searched_facts.select { |searched_fact| %i[core legacy].include? searched_fact.type } end + def resolve_nil_facts(searched_facts) + resolved_facts = [] + searched_facts.select { |fact| fact.type == :nil }.each do |fact| + resolved_facts << ResolvedFact.new(fact.name, nil, :nil, fact.name) + end + + resolved_facts + end + def start_threads(searched_facts) threads = [] # only resolve a fact once, even if multiple search facts depend on that fact diff --git a/lib/framework/formatters/legacy_fact_formatter.rb b/lib/framework/formatters/legacy_fact_formatter.rb index d61f6a62a..8a06fc9c8 100644 --- a/lib/framework/formatters/legacy_fact_formatter.rb +++ b/lib/framework/formatters/legacy_fact_formatter.rb @@ -60,7 +60,7 @@ def hash_to_facter_format(facts_hash) pretty_json = JSON.pretty_generate(facts_hash) @log.debug('Change key value delimiter from : to =>') - pretty_json.gsub!(/^(.*?)(:)/, '\1 =>') + pretty_json.gsub!(/":/, '" =>') @log.debug('Remove quotes from parent nodes') pretty_json.gsub!(/\"(.*)\"\ =>/, '\1 =>') @@ -84,8 +84,10 @@ def remove_enclosing_accolades(pretty_fact_json) end def remove_comma_and_quation(output) + # quotation marks that come after \ are not removed @log.debug('Remove unnecessary comma and quotation marks on root facts') - output.split("\n").map! { |line| line =~ /^[\s]+/ ? line : line.gsub(/,$|\"/, '') }.join("\n") + output.split("\n") + .map! { |line| line =~ /^[\s]+/ ? line : line.gsub(/,$|(?. # The exception tries to explain it in more full. - if /^\((maint|doc|docs|gem|fact-\d+)\)|revert/i.match(commit_summary).nil? + if /^\((maint|doc|docs|gem|fact-\d+)\)|revert|merge/i.match(commit_summary).nil? raise "\n\n\n\tThis commit summary didn't match CONTRIBUTING.md guidelines:\n" \ "\n\t\t#{commit_summary}\n" \ "\tThe commit summary (i.e. the first line of the commit message) should start with one of:\n" \