Lookup the whitespace attribute for each modified file and dispatch
custom checks as necessary. Currently the only custom check is the
approximate tab-in-indent check for Git < 1.7.2.
Chain the pre-commit, commit-msg, and prepare-commit-msg hooks to
locally configured scripts. Interpret relative paths with respect to
the working directory where the hooks run (top of work tree). This
allows project setup scripts to add project-specific checks for each of
these hooks.
uncrustify (uncrustify.sourceforge.net) is applied to changed files prior to
commit.
This feature is off by default. To enable this behavior, set
git config hooks.uncrustify true
By default, the behavior of git-mergetool is used to review the changes
uncrustify makes before they are added to the commit. For more information on
this behavior, see
git help mergetool
KWStyle is run on the changed C++ files and the commit is aborted if the files
do not pass the test. A file similar to the original is saved with a '*.kws'
extension so that line numbers referenced in the error message can be examined.
The test is off by default. To enable this behavoir, set
git config hooks.KWStyle true
Project specific uncrustify and KWStyle configuration files are set with 'git
config'. For example,
git config hooks.uncrustify.conf path/to/uncrustify.conf
git config hooks.KWStyle.conf path/to/KWStyle.conf
git config hooks.KWStyle.overwriteRulesConf path/to/overwrite.conf # optional
If the appropriate values have not been set, die() is called. An
optional KWStyle overwrite rules file can also been configured.
The files on which to run the style checks must also be identified in the
repository's '.gitattributes'. For example,
*.h hooks.style
*.cpp hooks.style
Or, to only enable a subset of style hooks,
*.h hooks.style=KWStyle
*.cpp hooks.style=KWStyle,uncrustify
Change-Id: Ia6b2d4136af3002eb0ec5d36f03c50df928917f4
If hooks.submodule is 'false' disable all checks. If an individual
hooks.<module>.update is 'true' then accept any update for that module.
Leave these options out of the hints printed. Developers that know what
they are doing will be able to find them by reading the hook source.
Since Git does not automatically update submodule checkouts when
checking out a new version in the work tree, it is common to have
locally modified submodule references. Therefore it is easy to stage
such modifications with other changes by accident, especially with
commands like "git add -u" or "git commit -a". The result is almost
always wrong if the submodule change is not intended.
Prevent such mistakes by requiring an extra step to commit submodule
link updates with other changes. When this case is detected, print a
message describing the situation and provide cut-and-paste instructions
to proceed.
On Solaris, where /bin/sh is actually sh, not bash, some expressions
like $() are not supported. Git's own scripts on this machine are
configured to use "#!/bin/bash". Change our shebang line to
#!/usr/bin/env bash
which should work almost everywhere.
Check blob and tree object sizes to prevent large objects from entering
the repository. The default limit is 1024 KiB, but it can be set with
git config hooks.MaxObjectKiB $KiB
locally, or disabled by using 0 KiB.
Check new files and files whose mode changes to verify that each file
mode matches the content of the file. The mode of a file must be
executable if and only if the file looks executable (name ends in a
Windows executable extension or content starts with a shebang line).
Commit "Reject leading TABs" added use of shell syntax of the form
$(case "..." in
a) ... ;;
esac)
Some shell implementations fail to recognize that the ')' in the case
label is not the end of the '$(' expression. Work around the problem
by moving the case block into a separate function outside the '$()'
expression.