| # Chromium OS Preupload Hooks |
| |
| [TOC] |
| |
| This repo holds hooks that get run by repo during the upload phase. They |
| perform various checks automatically such as running linters on your code. |
| |
| Note: Currently all hooks are enabled by default. Each repo must explicitly |
| turn off any hook it wishes to disable. |
| |
| Note: While we still use "presubmit" in many places (including config files), |
| these checks only run at preupload time. |
| |
| ## Usage |
| |
| Normally these execute automatically when you run `repo upload`. If you want to |
| run them by hand, you can execute `pre-upload.py` directly. By default, that |
| will scan the active repo and process all commits that haven't yet been merged. |
| See its help for more info. |
| |
| ### Bypassing |
| |
| Sometimes you might want to bypass the upload checks. While this is **strongly |
| discouraged** (often failures you add will affect others and block them too), |
| sometimes there are valid reasons for this. You can simply use the option |
| `--no-verify` when running `repo upload` to skip all upload checks. This will |
| skip **all** checks and not just specific ones. It should be used only after |
| having run & evaluated the upload output previously. |
| |
| # Config Files |
| |
| ## PRESUBMIT.cfg |
| |
| This file is checked in the top of a specific git repository. Stacking them |
| in subdirectories (to try and override parent settings) is not supported. |
| |
| ## Example |
| |
| ``` |
| # Per-project `repo upload` hook settings. |
| # https://chromium.googlesource.com/chromiumos/repohooks/ |
| |
| [Hook Scripts] |
| cros lint = cros lint ${PRESUBMIT_FILES} |
| pre-upload_unittest = ./pre-upload_unittest.py |
| |
| [Hook Overrides] |
| cros_license_check: true |
| long_line_check: true |
| tab_check: true |
| stray_whitespace_check: true |
| |
| [Hook Overrides Options] |
| cros_license_check: --exclude_regex=\b(checkpatch\.pl|kernel-doc)$ |
| ``` |
| |
| ## Environment |
| |
| Hooks are executed in the top directory of the git repository. All paths should |
| generally be relative to that point. |
| |
| A few environment variables are set so scripts don't need to discover things. |
| |
| * `PRESUBMIT_PROJECT`: The project name being changed by the commit |
| (e.g. 'chromiumos/platform/firmware'). |
| * `PRESUBMIT_COMMIT`: The full commit hash of your change. |
| * `PRESUBMIT_FILES`: A list of files affected by your commit delimited by |
| newlines (e.g. 'README.md\nsub/dir/foo.py'). |
| |
| ## [Hook Scripts] |
| |
| This section allows for completely arbitrary hooks to run on a per-repo basis. |
| |
| The key can be any name (as long as the syntax is valid), as can the program |
| that is executed. The key is used as the name of the hook for reporting purposes, |
| so it should be at least somewhat descriptive. |
| |
| Whitespace in the key name is OK! |
| |
| The keys must be unique as duplicates will silently clobber earlier values. |
| |
| You do not need to send stderr to stdout. The tooling will take care of |
| merging them together for you automatically. |
| |
| ``` |
| [Hook Scripts] |
| my first hook = program --gogog ${PRESUBMIT_FILES} |
| another hook = funtimes --i-need "some space" ${PRESUBMIT_FILES} |
| some fish = linter --ate-a-cat ${PRESUBMIT_FILES} |
| some cat = formatter --cat-commit ${PRESUBMIT_COMMIT} |
| ``` |
| |
| ## [Hook Overrides] |
| |
| This section allows for turning off common/builtin hooks. |
| |
| Note: Not all hooks that we run may be disabled. We only document the ones that |
| may be controlled by the config file here, but we run many more checks. |
| |
| * `aosp_license_check`: Require source files have an Android (Apache) license. |
| * `black_check`: Require Python files be formated by Black. |
| * `blank_line_check`: Check for trailing blank lines. |
| * `branch_check`: Require all commit messages have a `BRANCH=` line. |
| * `bug_field_check`: Require all commit messages have a `BUG=` line. |
| * `cargo_clippy_check`: Run Rust code through `cargo clippy`. |
| * `check_change_no_include_board_phase`: Reject commit messages that refer to |
| hardware board development phases (e.g. PVT). |
| * `check_rustfmt`: Run Rust code through `rustfmt`. |
| * `checkpatch_check`: Run commits through Linux's `checkpatch.pl` tool. |
| * `clang_format_check`: Run source code through `clang-format`. |
| * `contribution_check`: Check source files for invalid "not a contribution". |
| * `cros_license_check`: Require source files have a Chromium (BSD) license. |
| * `exec_files_check`: Check common file types do not have +x permission bits. |
| * `filepath_chartype_check`: Check source files for FilePath::CharType use. |
| * `git_cl_presubmit`: Run git-cl PRESUBMIT.py logic if available. |
| * `gofmt_check`: Run Go code through `gofmt`. |
| * `handle_eintr_close_check`: Check C++ code does not use unsafe |
| `HANDLE_EINTR(close(...))` idioms. |
| * `kernel_splitconfig_check`: Require CrOS kernel config changes are separate |
| commits from kernel code changes. |
| * `kerneldoc_check`: Run commits through Linux's `kernel-doc` tool. |
| * `keyword_check`: Check text files & commit messages for |
| [blocked terms](#blocked_terms). |
| * `long_line_check`: Do not allow lines longer than 80 cols. |
| * `manifest_check`: Check all ebuild `Manifest` files. |
| * `project_prefix_check`: Require all commit message have a subdir prefix. |
| * `signoff_check`: Require all commit messages have a `Signed-off-by` tag. |
| * `stray_whitespace_check`: Check source files for stray whitespace. |
| * `tab_check`: Do not allow tabs for indentation in source files. |
| * `tabbed_indent_required_check`: Require tabs for indentation. |
| * `test_field_check`: Require all commit messages have a `TEST=` line. |
| |
| ## [Hook Overrides Options] |
| |
| Some hooks accept custom options. The key name matches the Hook Overrides |
| name above, so see that list for more details. |
| |
| ``` |
| [Hook Overrides Options] |
| cros_license_check: --exclude_regex=\b(checkpatch\.pl|kernel-doc)$ |
| ``` |
| |
| ## Blocked and Unblocked Word List {#blocked_terms} |
| |
| `blocked_terms.txt` contains a default list of words which are blocked by |
| keyword_check. `unblocked_terms.txt` is a default list of words which are |
| unblocked. |
| |
| Repohook references the global `unblocked_terms.txt` only if a copy doesn't |
| exist in a project. Thus, you can copy `unblocked_terms.txt` to your project |
| and remove the words which are already cleared locally. That'll allow your |
| project to manage keyword-blocking/unblocking individually. Each project can |
| have multiple `unblocked_terms.txt`. The parent directories of each file being |
| changed are searched. The one nearest to the file has a higher priority. |
| |
| 1. Copy `unblocked_terms.txt` to the project's root directory. |
| 2. List which words are already cleared (or not present): |
| ```$ ~/chromiumos/src/platform/dev/contrib/search_blocked_words.sh``` |
| 3. Remove the cleared words from the project's `unblocked_terms.txt` |
| 4. Test and submit CL. |
| |
| Later you can do: |
| |
| 1. Pick a word from the project's `unblocked_terms.txt`. |
| 2. Fix all occurrences of the word. |
| 3. Verify the clearance: |
| ```$ ~/chromiumos/src/platform/dev/contrib/search_blocked_words.sh``` |
| 4. Remove the word from the project's `unblocked_terms.txt`. |
| 5. Test and submit CL. |
| |
| Additionally for terms that cannot be removed, adding a comment with nocheck at |
| the end of the line with the term(s) will skip the keyword_check on that line. |
| |
| ``` |
| Example line skipping blocked term check. # nocheck |
| This line is still checked. |
| This line is also checked as nocheck is not on the end of the line. |
| ``` |
| |
| # Third Party code |
| |
| We have many third party repos where you probably want to disable CrOS checks. |
| You'll need to disable each one in your project's PRESUBMIT.cfg file. |
| See the reference above for which checks you probably want to disable. |
| |
| # Reporting issues |
| |
| You can file bugs |
| [here](https://issuetracker.google.com/issues/new?component=1037860). |
| |
| If you want to ask questions, use our normal |
| [development groups](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/contact.md). |