【google-java-format】すべてのファイルを一発でフォーマットする方法

# はじめに

[google-java-format](https://github.com/google/google-java-format)は、Javaのソースコードをフォーマットするプログラムです。
[Google Java Style](https://google.github.io/styleguide/javaguide.html)に基づいて、フォーマットします。

IntelliJやEclipseなどのプラグインもありますが、ここではコマンドラインツールを利用します。

google-java-formatには、さまざまなオプションがありますが、
「すべてのファイルを一発でフォーマットする」ためのオプションはありません。

<details><summary>オプションの一覧</summary>

```:オプションの一覧
Usage: google-java-format [options] file(s)

Options:
  -i, -r, -replace, --replace
    Send formatted output back to files, not stdout.
  -
    Format stdin -> stdout
  --assume-filename, -assume-filename
    File name to use for diagnostics when formatting standard input (default is <stdin>).
  --aosp, -aosp, -a
    Use AOSP style instead of Google Style (4-space indentation).
  --fix-imports-only
    Fix import order and remove any unused imports, but do no other formatting.
  --skip-sorting-imports
    Do not fix the import order. Unused imports will still be removed.
  --skip-removing-unused-imports
    Do not remove unused imports. Imports will still be sorted.
  --skip-reflowing-long-strings
    Do not reflow string literals that exceed the column limit.
  --skip-javadoc-formatting
    Do not reformat javadoc.
  --dry-run, -n
    Prints the paths of the files whose contents would change if the formatter were run normally.
  --set-exit-if-changed
    Return exit code 1 if there are any formatting changes.
  --lines, -lines, --line, -line
    Line range(s) to format, like 5:10 (1-based; default is all).
  --offset, -offset
    Character offset to format (0-based; default is all).
  --length, -length
    Character length to format.
  --help, -help, -h
    Print this usage statement.
  --version, -version, -v
    Print the version.
  @<filename>
    Read options and filenames from file.

If -i is given with -, the result is sent to stdout.
The --lines, --offset, and --length flags may be given more than once.
The --offset and --length flags must be given an equal number of times.
If --lines, --offset, or --length are given, only one file (or -) may be given.

google-java-format: Version 1.15.0
https://github.com/google/google-java-format
```
</details>

そのなかで、どうすれば実現できるのかを記事に書いていきます。

# 実現方針

google-java-formatでは、引数で「対象のファイル」を指定します。

```:対象ファイルの指定の例
 java -jar /path/google-java-format-1.15.0-all-deps.jar --replace src\SampleApplication.java src\SampleService.java
```

コマンドで「対象のファイル」を取得し、引数に渡すことで実現します。

Gitで管理されていることを前提とし、ここではGitのコマンドを使用します。（[git ls-files](https://git-scm.com/docs/git-ls-files)）
Gitで管理されていなくても、OSのコマンドを使用すれば、同様に実現できるはずです。(dir, ls, find)

つぎのIssueに着想を得ました。
[google/google-java-format | Glob support google-java-format [options] "**/*.java"](https://github.com/google/google-java-format/issues/129)

# 実現方法

## Windows | PowerShell

つぎのコマンドで実現できます。

```
java -jar /path/google-java-format-1.15.0-all-deps.jar --replace $(git ls-files *.java)
```

## Windows | Gradle

つぎのタスクで実現できます。

```gradle
task googleJavaFormat(group: 'format', type: Exec) {
    commandLine 'Powershell', '-C', '"iex \'java -jar /path/google-java-format-1.15.0-all-deps.jar --replace $(git ls-files *.java)\'"'
}
```

## Mac | Gradle

つぎのタスクで実現できます。

```gradle
task googleJavaFormat(group: 'format', type: Exec) {
    commandLine 'zsh', '-c', 'java -jar /path/google-java-format-1.15.0-all-deps.jar --replace $(git ls-files "*.java")'
}
```