def format_files(paths: Collection[Union[Path, str]], fix: bool, repo: Optional[Path] = None) -> int: """Checks or fixes formatting for the specified files.""" formatter = CodeFormatter(Path(p) for p in paths) _LOG.info('Checking formatting for %s', plural(formatter.paths, 'file')) for line in _file_summary(paths, repo if repo else Path.cwd()): print(line, file=sys.stderr) errors = formatter.check() print_format_check(errors, show_fix_commands=(not fix)) if errors: if fix: formatter.fix() # TODO: This should perhaps check that the fixes were successful. _LOG.info('Formatting fixes applied successfully') return 0 _LOG.error('Formatting errors found') return 1 _LOG.info('Congratulations! No formatting changes needed') return 0
def run(self, program: Program, keep_going: bool = False) -> bool: """Executes a series of presubmit checks on the paths.""" checks = self._apply_filters(program) _LOG.debug('Running %s for %s', program.title(), self._root.name) print(_title(f'{self._root.name}: {program.title()}')) _LOG.info('%d of %d checks apply to %s in %s', len(checks), len(program), plural(self._paths, 'file'), self._root) print() for line in tools.file_summary(self._relative_paths): print(line) print() if not self._paths: print(color_yellow('No files are being checked!')) _LOG.debug('Checks:\n%s', '\n'.join(c.name for c, _ in checks)) start_time: float = time.time() passed, failed, skipped = self._execute_checks(checks, keep_going) self._log_summary(time.time() - start_time, passed, failed, skipped) return not failed and not skipped
def run(self, ctx: PresubmitContext, count: int, total: int) -> _Result: """Runs the presubmit check on the provided paths.""" print( _box(_CHECK_UPPER, f'{count}/{total}', self.name, plural(ctx.paths, "file"))) _LOG.debug('[%d/%d] Running %s on %s', count, total, self.name, plural(ctx.paths, "file")) start_time_s = time.time() result = self._call_function(ctx) time_str = _format_time(time.time() - start_time_s) _LOG.debug('%s %s', self.name, result.value) print(_box(_CHECK_LOWER, result.colorized(_LEFT), self.name, time_str)) _LOG.debug('%s duration:%s', self.name, time_str) return result
def _log_summary(self, time_s: float, passed: int, failed: int, skipped: int) -> None: summary_items = [] if passed: summary_items.append(f'{passed} passed') if failed: summary_items.append(f'{failed} failed') if skipped: summary_items.append(f'{skipped} not run') summary = ', '.join(summary_items) or 'nothing was done' result = _Result.FAIL if failed or skipped else _Result.PASS total = passed + failed + skipped _LOG.debug('Finished running %d checks on %s in %.1f s', total, plural(self._paths, 'file'), time_s) _LOG.debug('Presubmit checks %s: %s', result.value, summary) print( _box( _SUMMARY_BOX, result.colorized(_LEFT, invert=True), f'{total} checks on {plural(self._paths, "file")}: {summary}', _format_time(time_s)))
def fix(self) -> None: """Fixes format errors for supported files in place.""" for code_format, files in self._formats.items(): code_format.fix(files) _LOG.info('Formatted %s', plural(files, code_format.language + ' file'))