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