예제 #1
0
def _calculate_head_comparison(
        target_file_manager: TargetFileManager,
        tools: Iterable[Tool]) -> Tuple[Baseline, float]:
    """
    Calculates a baseline consisting of all findings from the branch head

    If no HEAD branch exists return empty baseline

    :param paths: Which paths are being checked
    :param tools: Which tools to check
    :return: The branch head baseline
    """
    try:
        with target_file_manager.run_context(True,
                                             RunStep.BASELINE) as target_paths:
            runner = Runner(paths=target_paths,
                            use_cache=True,
                            skip_setup=True)
            if len(runner.paths) > 0:
                before = time.time()
                comparison_results = runner.parallel_results(tools, {},
                                                             keep_bars=False)
                baseline = {
                    tool_id: {f.syntactic_identifier_str()
                              for f in findings}
                    for tool_id, findings in comparison_results
                    if isinstance(findings, list)
                }
                elapsed = time.time() - before
                return baseline, elapsed
            else:
                return {}, 0.0
    except NoGitHeadException:
        logging.debug("No git head found so defaulting to empty head baseline")
        return {}, 0.0
예제 #2
0
def orchestrate(
    baseline: Baseline,
    target_file_manager: TargetFileManager,
    staged: bool,
    tools: Iterable[Tool],
) -> Tuple[Collection[RunResults], float]:
    """
        Manages interactions between TargetFileManager, Runner and Tools

        Uses passed target_file_manager, staged flag, and tool list to setup
        Runner and runs tools on relevant files, returning aggregated output
        of tool running and time to run all tools in parallel
    """
    elapsed = 0.0
    if staged:
        head_baseline, elapsed = _calculate_head_comparison(
            target_file_manager, tools)
        for t in tools:
            tool_id = t.tool_id()
            if tool_id not in baseline:
                baseline[tool_id] = head_baseline.get(tool_id, set())
            else:
                baseline[tool_id].update(head_baseline.get(tool_id, set()))

    with target_file_manager.run_context(staged,
                                         RunStep.CHECK) as target_paths:
        use_cache = not staged  # if --all then can use cache
        skip_setup = staged  # if check --all then include setup
        runner = Runner(paths=target_paths,
                        use_cache=use_cache,
                        skip_setup=skip_setup)

        if len(runner.paths) == 0:
            echo_warning(
                f"Nothing to check or archive. Please confirm that changes are staged and not excluded by `{IGNORE_FILE_NAME}`. To check all Git tracked files, use `--all`."
            )
            click.secho("", err=True)
            all_results: Collection[RunResults] = []
            elapsed = 0.0
        else:
            before = time.time()
            all_results = runner.parallel_results(tools, baseline)
            elapsed += time.time() - before

    return all_results, elapsed