| .. _chapter-pw-presubmit: |
| |
| .. default-domain:: cpp |
| |
| .. highlight:: sh |
| |
| ------------ |
| pw_presubmit |
| ------------ |
| The presubmit module provides Python tools for running presubmit checks and |
| checking and fixing code format. It also includes the presubmit check script for |
| the Pigweed repository, ``pigweed_presubmit.py``. |
| |
| Presubmit checks are essential tools, but they take work to set up, and |
| projects don’t always get around to it. The ``pw_presubmit`` module provides |
| tools for setting up high quality presubmit checks for any project. We use this |
| framework to run Pigweed’s presubmit on our workstations and in our automated |
| building tools. |
| |
| The ``pw_presubmit`` module also includes ``pw format``, a tool that provides a |
| unified interface for automatically formatting code in a variety of languages. |
| With ``pw format``, you can format C, C++, Python, GN, and Go code according to |
| configurations defined by your project. ``pw format`` leverages existing tools |
| like ``clang-format``, and it’s simple to add support for new languages. |
| |
| .. image:: ../docs/images/pw_presubmit_demo.gif |
| :alt: ``pw format`` demo |
| :align: left |
| |
| Compatibility |
| ============= |
| Python 3 |
| |
| pw_presubmit Python package |
| =========================== |
| |
| Presubmit tools |
| --------------- |
| A presubmit check is defined as a function or other callable. The function may |
| take either no arguments or a list of the paths on which to run. Presubmit |
| checks communicate failure by raising any exception. |
| |
| For example, either of these functions may be used as presubmit checks: |
| |
| .. code-block:: python |
| |
| @pw_presubmit.filter_paths(endswith='.py') |
| def file_contains_ni(paths): |
| for path in paths: |
| with open(path) as file: |
| contents = file.read() |
| if 'ni' not in contents and 'nee' not in contents: |
| raise PresumitFailure('Files must say "ni"!', path=path) |
| |
| def run_the_build(): |
| subprocess.run(['make', 'release'], check=True) |
| |
| Presubmit checks are provided to the ``parse_args_and_run_presubmit`` or |
| ``run_presubmit`` function as a list. For example, |
| |
| .. code-block:: python |
| |
| PRESUBMIT_CHECKS = [file_contains_ni, run_the_build] |
| sys.exit(0 if parse_args_and_run_presubmit(PRESUBMIT_CHECKS) else 1) |
| |
| Presubmit checks that accept a list of paths may use the ``filter_paths`` |
| decorator to automatically filter the paths list for file types they care about. |
| |
| Members |
| ^^^^^^^ |
| .. autofunction:: pw_presubmit.run_presubmit |
| |
| .. autofunction:: pw_presubmit.parse_args_and_run_presubmit |
| |
| .. autodecorator:: pw_presubmit.filter_paths |
| |
| .. autofunction:: pw_presubmit.call |
| |
| .. autoexception:: pw_presubmit.PresubmitFailure |
| |
| Presubmit checks |
| ---------------- |
| The ``pw_presubmit`` package includes presubmit checks that can be used with any |
| project. These checks include: |
| |
| * Check code format of several languages including C, C++, and Python |
| * Initialize a Python environment |
| * Run all Python tests |
| * Run pylint |
| * Ensure source files are included in the GN and Bazel builds |
| * Build and run all tests with GN |
| * Build and run all tests with Bazel |
| * Ensure all header files contain ``#pragma once`` |
| |
| pw_presubmit.format_code |
| ------------------------ |
| The ``format_code`` submodule formats supported source files using external code |
| format tools. The file ``format_code.py`` can be invoked directly from the |
| command line or from ``pw`` as ``pw format``. |