Skip to content

fedora-copr/vcs-diff-lint

Repository files navigation

Differential code linting for VCS repositories

Automatic code analysis has become a natural maintainer's need to improve the software quality. We need to run the analysis as soon as possible, ideally before a new code change is integrated.

Modern analysers are very powerful, increasingly more powerful. As they evolve, the same analysers over time raise new warnings. Powerful analyzers also need a reasonable context — it is not just enough to take a look at the patch file (changed code lines) itself to perform the complex analysis. A whole changed file needs to be analyzed, or even files that are used as dependencies (imports, includes, ...).

So before the change is done (change request) we want to run a set of powerful code analysers, but we aren't typically interested to see all the warnings (related even to the old code). We typically want to concentrate on the changed stuff, new code — to avoid creating new bugs.

So there's often a dilemma maintainers have: What analyser to enable, and in what verbosity level, to not have unnecessary clutter in the CI workflow output (so the CI is actually useful)? Without fixing all the code problems that cause reports first?

This project aims to help here. With vcs-diff-lint, you can trivially enable even very complex and verbose code analysers in even old projects. And still, thanks to the csdiff tool you'll be informed only about the new errors that are related to the change.

How it works

From within a VCS directory (only Git is supported for now) we first

  • analyze set of changed files against given changeset (the origin/main branch by default), so we know what files need to be analyzed
  • run code analyzers against the old file variants (before the change is done), then
  • run analyzers against the proposed file versions (not yet pushed changes),
  • perform a diff on the error sets (using csdiff), and finally
  • report the set of added (or optionally even fixed) analyzers' warnings.

Features

  • PyLint and Mypy is supported
  • monorepo support (multiple sub-projects in repo sub-directories)
  • file renames supported (if a file was just renamed, the old errors are not reported as new)

Usage

Use the https://github.com/marketplace/actions/vcs-diff-lint GitHub Action.

Alternatively, in a local git clone directory, run:

$ cd my_project && vcs-diff-lint --print-fixed-errors
# ================
#  Added warnings
# ================

Error: PYLINT_WARNING:
coprs_frontend/manage.py:105:4: C0104[disallowed-name]: Disallowed name "foo"

# ================
#  Fixed warnings
# ================

Error: PYLINT_WARNING:
coprs_frontend/manage.py:9: W0611[unused-import]: Unused import importlib