Class: RuboCop::Cop::FormulaAuditStrict::ShellCommands

Inherits:
RuboCop::Cop::FormulaCop show all
Defined in:
brew/Library/Homebrew/rubocops/lines.rb

Instance Attribute Summary

Attributes inherited from RuboCop::Cop::FormulaCop

#file_path

Instance Method Summary collapse

Methods inherited from RuboCop::Cop::FormulaCop

#audit_comments, #audit_urls, #block_size, #caveats_strings, #check_precedence, #class_name, #component_precedes?, #depends_on?, #depends_on_name_type?, #end_column, #expression_negated?, #find_all_blocks, #find_block, #find_blocks, #find_const, #find_every_func_call_by_name, #find_every_method_call_by_name, #find_instance_call, #find_instance_method_call, #find_method_calls_by_name, #find_method_def, #find_method_with_args, #find_node_method_by_name, #find_strings, #format_component, #formula_tap, #get_checksum_node, #line_number, #line_start_column, #method_called?, #method_called_ever?, #method_called_in_block?, #method_name, #node_equals?, #offending_node, #on_class, #parameters, #parameters_passed?, #problem, #regex_match_group, #size, #source_buffer, #start_column, #string_content, #versioned_formula?

Instance Method Details

#audit_formula(_node, _class_node, _parent_class_node, body_node) ⇒ Object



560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
# File 'brew/Library/Homebrew/rubocops/lines.rb', line 560

def audit_formula(_node, _class_node, _parent_class_node, body_node)
  # Match shell commands separated by spaces in the same string
  shell_cmd_with_spaces_regex = /[^"' ]*(?:\s[^"' ]*)+/

  popen_commands = [
    :popen_read,
    :safe_popen_read,
    :popen_write,
    :safe_popen_write,
  ]

  shell_metacharacters = %w[> < < | ; : & * $ ? : ~ + @ !` ( ) [ ]]

  find_every_method_call_by_name(body_node, :system).each do |method|
    # Only separate when no shell metacharacters are present
    next if shell_metacharacters.any? { |meta| string_content(parameters(method).first).include?(meta) }

    next unless match = regex_match_group(parameters(method).first, shell_cmd_with_spaces_regex)

    good_args = match[0].gsub(" ", "\", \"")
    offending_node(parameters(method).first)
    problem "Separate `system` commands into `\"#{good_args}\"`"
  end

  popen_commands.each do |command|
    find_instance_method_call(body_node, "Utils", command) do |method|
      index = parameters(method).first.hash_type? ? 1 : 0

      # Only separate when no shell metacharacters are present
      next if shell_metacharacters.any? { |meta| string_content(parameters(method)[index]).include?(meta) }

      next unless match = regex_match_group(parameters(method)[index], shell_cmd_with_spaces_regex)

      good_args = match[0].gsub(" ", "\", \"")
      offending_node(parameters(method)[index])
      problem "Separate `Utils.#{command}` commands into `\"#{good_args}\"`"
    end
  end
end

#autocorrect(node) ⇒ Object



600
601
602
603
604
605
# File 'brew/Library/Homebrew/rubocops/lines.rb', line 600

def autocorrect(node)
  lambda do |corrector|
    good_args = node.source.gsub(" ", "\", \"")
    corrector.replace(node.source_range, good_args)
  end
end