A collection of git pre-commit
hooks to help with code auto-formatting.
Licensed under Apache License, Version 2.0.
Please, share your own formatters back. PRs are welcome!
You could just copy contents of this repo to $PROJECT/.git/hooks/
. However, a slightly better way might be:
$ cd $PROJECT
$ git remote add git-hooks-code-autoformat https://github.com/michalrus/git-hooks-code-autoformat.git
$ git subtree add --prefix=git-hooks/ git-hooks-code-autoformat master
Now, you have $PROJECT/git-hooks/
directory with contents of this repo. This subtree is updateable with $ git subtree pull --prefix=git-hooks/ git-hooks-code-autoformat master
. Any person can just clone your project and they'll have $PROJECT/git-hooks
in place at the very moment.
What's left is to symlink $PROJECT/.git/hooks
to $PROJECT/git-hooks
:
$ cd .git && mv hooks hooks.old && ln -s ../git-hooks hooks
IMPORTANT: this linking step has to be done manually by every developer.
The usual workflow then is:
- Modify some files.
$ git add
them.$ git commit
them.
Now, for each staged ("git-added") file, an autoformatter will be called, and then the file will be re-added, and only then the git commit
will continue. This might create a problem, see Known problems below.
If an error occurs (e.g. trying to format a not so well-formed XML), an error message is printed and the commit is aborted.
- Java ← will format
*.java
files using a small wrapper—eclipse-code-formatter—around Eclipse’sCodeFormatter
with Google’s Java Style definition, - XML ← will format
*.xml
,*.bmml
and*.owl
(Balsamiq Mockups, Protégé) files and any file that is recognized as XML by libmagic, - XMind ← will format
*.xmind/**.xml
files (an*.xmind
file is really a ZIP archive and should be extracted—and autoformatted—before being added to VCS; you can then open a mindmap using$ XMind some/directory.xmind
and it will then be added to the recently opened maps list), - Flat OpenDocument Spreadsheet ← will format
*.fods
files, a format used by LibreOffice Calc for storing spreadsheets.
- Take a look at the existing formatters above.
- Create
autoformat/NAME.patterns
file containing a regular expressions—1 per line—matching all file names to be treated with yourNAME
formatter. - AND/OR create
autoformat/NAME.magic
file containing a regular expressions—1 per line—matching outputs of libmagic’s/usr/bin/file "$FILE"
for all files to be treated with yourNAME
formatter. - Create
autoformat/NAME
executable script. It might be called several times, but always with one argument, an absolute path to a file to format. When formatting, you've got to modify this file in place. - If you want to abort the commit, print an error message and exit from the formatter with a non-zero exit code.
- The
pre-commit
hook autoformats every staged ("git-added") file (if an applicable formatter exists) and then re-adds the file to the stage. Now, if you modify some file,$ git add
it, then modify it again and then$ git commit
—and there exists a formatter for this type of a file—second modification will also be commited.