# clang-format-linter
Tired of spending half time of code review on marking code style
issues?
Here we go - this allows to use `clang-format` as a linter for
[arcanist](https://phacility.com/phabricator/arcanist) to enforce style over
your C/C++/Objective-C codebase.
It's not invasive (yet) and at the moment just suggests to autofix
code.
## Installation
What you want to get is to make this module to be available for
`arcanist`. There are a couple of ways to achieve it depending on your
requirements.
### Prerequisites
Right now `clang-format` should be installed beforehand. On OS X you
can do it through [homebrew](https://brew.sh) `brew install
clang-format`.
You also have to configure your style in `.clang-format`
([documentation](http://clang.llvm.org/docs/ClangFormatStyleOptions.html))
Best way is to start from a predefined style by dumping an existing
style `clang-format -style=LLVM -dump-config > .clang-format` and tune
parameters.
There is also a wonderful
[interactive builder](http://clangformat.com/) available.
### Project-specific installation
You can add this repository as a git submodule and in this case
`.arcconfig` should look like:
```json
{
"load": "path/to/submodule"
// ...
}
```
### Global installation
`arcanist` can load modules from an absolute path. But there is one
more trick - it also searches for modules in a directory up one level
from itself.
It means that you can clone this repository to the same directory
where `arcanist` and `libphutil` are located. In the end it should
look like this:
```sh
> ls
arcanist
clang-format-linter
libphutil
```
In this case you `.arcconfig` should look like
```json
{
"load": "clang-format-linter"
// ...
}
```
Another approach is to clone `clang-format-linter` to a fixed location
and use absolute path like:
```sh
cd ~/.dev-tools
git clone https://github.com/vhbit/clang-format-linter
```
```json
{
"load": "~/.dev-tools/clang-format-linter"
// ...
}
```
Both ways of global installation are actually almost equally as in
most cases you'd like to have a bootstrapping script for all tools.
## Setup
Once installed, linter can be used and configured just as any other
`arcanist linter`
Here is a simplest `.arclint`:
```json
{
"linters": {
"clang-format": {
"type": "clang-format",
"include": "(^Source/.*\\.(m|h|mm)$)"
},
// ...
}
}
```