zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

filter_issues.ex (2368B)


      1 defmodule Credo.CLI.Command.Diff.Task.FilterIssues do
      2   use Credo.Execution.Task
      3 
      4   alias Credo.Issue
      5 
      6   def call(exec, _opts) do
      7     issues = get_old_new_and_fixed_issues(exec)
      8 
      9     Execution.put_issues(exec, issues)
     10   end
     11 
     12   defp get_old_new_and_fixed_issues(exec) do
     13     current_issues = Execution.get_issues(exec)
     14 
     15     previous_issues =
     16       exec
     17       |> Execution.get_assign("credo.diff.previous_exec")
     18       |> Execution.get_issues()
     19 
     20     previous_dirname = Execution.get_assign(exec, "credo.diff.previous_dirname")
     21 
     22     # in previous_issues, in current_issues
     23     old_issues = Enum.filter(current_issues, &old_issue?(&1, previous_issues, previous_dirname))
     24 
     25     # in previous_issues, not in current_issues
     26     fixed_issues = previous_issues -- old_issues
     27 
     28     # not in previous_issues, in current_issues
     29     new_issues = Enum.filter(current_issues, &new_issue?(&1, previous_issues, previous_dirname))
     30 
     31     old_issues = Enum.map(old_issues, fn issue -> %Issue{issue | diff_marker: :old} end)
     32 
     33     # TODO: we have to rewrite the filename to make it look like the file is in the current dir
     34     #       instead of the generated tmp dir
     35     fixed_issues = Enum.map(fixed_issues, fn issue -> %Issue{issue | diff_marker: :fixed} end)
     36     new_issues = Enum.map(new_issues, fn issue -> %Issue{issue | diff_marker: :new} end)
     37 
     38     List.flatten([new_issues, fixed_issues, old_issues])
     39   end
     40 
     41   defp new_issue?(current_issue, previous_issues, previous_dirname)
     42        when is_list(previous_issues) do
     43     !Enum.any?(previous_issues, &same_issue?(current_issue, &1, previous_dirname))
     44   end
     45 
     46   defp old_issue?(previous_issue, current_issues, previous_dirname)
     47        when is_list(current_issues) do
     48     Enum.any?(current_issues, &same_issue?(previous_issue, &1, previous_dirname))
     49   end
     50 
     51   defp same_issue?(current_issue, %Issue{} = previous_issue, previous_dirname) do
     52     same_file_or_same_line? =
     53       current_issue.filename == Path.relative_to(previous_issue.filename, previous_dirname) ||
     54         current_issue.line_no == previous_issue.line_no
     55 
     56     same_file_or_same_line? &&
     57       current_issue.column == previous_issue.column &&
     58       current_issue.category == previous_issue.category &&
     59       current_issue.message == previous_issue.message &&
     60       current_issue.trigger == previous_issue.trigger &&
     61       current_issue.scope == previous_issue.scope
     62   end
     63 end