commit | 76b1bc7640db65a243bc0d83a28d5cb61d62e9e3 | [log] [tgz] |
---|---|---|
author | Mike Frysinger <vapier@google.com> | Wed Apr 20 16:50:16 2016 -0400 |
committer | Mike Frysinger <vapier@google.com> | Thu Apr 21 13:37:47 2016 -0400 |
tree | ae69130dcf872ff3b9d1db2abbe8788a34f6b62d | |
parent | 4953eba604dcba682e906b19b1c4907afe6b49e3 [diff] |
hooks: add some commit message hooks Allow repos to enforce Bug: and Change-Id: fields in the commit message. We need to extract & plumb down the commit message to all the hooks now. Bug: 28288284 Change-Id: I8c16e1e2d771569fb0721c135d41dbfeca44135c
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 disabled by default. Each repo must explicitly turn on any hook it wishes to enforce.
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.
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.
These files are checked in the top of a specific git repository. Stacking them in subdirectories (to try and override parent settings) is not supported.
This file controls the hooks/checks that get run when running repo upload
.
[Hook Scripts] name = script --with args ${PREUPLOAD_FILES} [Builtin Hooks] cpplint = true [Builtin Hooks Options] cpplint = --filter=-x ${PREUPLOAD_FILES}
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.
REPO_PROJECT
: The name of the project. e.g. platform/tools/repohooks
REPO_PATH
: The path to the project relative to the root. e.g. tools/repohooks
REPO_REMOTE
: The remote git URL. e.g. https://android.googlesource.com/platform/tools/repohooks
PREUPLOAD_COMMIT
: The commit that is currently being checked. e.g. 1f89dce0468448fa36f632d2fc52175cd6940a91
[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.
[Hook Scripts] my_first_hook = program --gogog ${PREUPLOAD_FILES} another_hook = funtimes --i-need "some space" ${PREUPLOAD_FILES} some_fish = linter --ate-a-cat ${PREUPLOAD_FILES}
[Builtin Hooks]
This section allows for turning on common/builtin hooks. There are a bunch of canned hooks already included geared towards AOSP style guidelines.
commit_msg_bug_field
: Require a valid Bug:
line.commit_msg_changeid_field
: Require a valid Change-Id:
Gerrit line.cpplint
: Run through the cpplint tool (for C++ code).gofmt
: Run Go code through gofmt
.jsonlint
: Verify JSON code is sane.pylint
: Run Python code through pylint
.xmllint
: Run XML code through xmllint
.Note: Builtin hooks tend to match specific filenames (e.g. .json
). If no files match in a specific commit, then the hook will be skipped for that commit.
[Builtin Hooks] # Turn on cpplint checking. cpplint = true # Turn off gofmt checking. gofmt = false
[Builtin Hooks Options]
Used to customize the behavior of specific [Builtin Hooks]
. Any arguments set here will be passed directly to the linter in question. This will completely override any existing default options, so be sure to include everything you need (especially ${PREUPLOAD_FILES}
-- see below).
Quoting is handled naturally. i.e. use "a b c"
to pass an argument with whitespace.
A few keywords are recognized to pass down settings. These are not environment variables, but are expanded inline. Files with whitespace and such will be expanded correctly via argument positions, so do not try to force your own quote handling.
${PREUPLOAD_FILES}
: List of files to operate on.[Builtin Hooks Options] # Pass more filter args to cpplint. cpplint = --filter=-x ${PREUPLOAD_FILES}
These are notes for people updating the pre-upload.py
hook itself:
pre-upload.py
script is loaded and exec-ed in its own context. The only entry-point that matters is main
.rh/hooks.py
. Be sure to keep the list up-to-date with the documentation in this file.pylint
should support per-repo pylintrc files.pylint
needs to know what other modules exist locally to verify their API. We can support this case by doing a full checkout of the repo in a temp dir, but this can slow things down a lot. Will need to consider a PREUPLOAD.cfg
knob.cpplint
and pylint
tools to the AOSP manifest and use those local copies instead of relying on versions that are in $PATH..cc
and .py
and .xml
.clang-format
: Checks style/formatting of code.clang-check
: Runs static analyzers against code.