clocによるコミット間のステップ数比較

# はじめに
コードのステップ数はこれまでVScode Counterで計測してきたが、今回コミット間の差分のステップ数が必要になり、[cloc](https://www.npmjs.com/package/cloc)というツールを使ってみた。
また、非常に多くあるclocのオプションについても実行例付きで厳選して整理する。

# 環境

- cloc 2.02
- Windows 11 Home 23H2
- Node.js 20.15.0

また、動作確認する上でサンプルソースコードとして[Nuxt](https://nuxt.com/)アプリを使用した。

# コミット間の比較
```bash
$ npx cloc --diff <commit_hash1> <commit_hash2>
```
※同じコマンドで、コミットハッシュ以外にファイルやアーカイブ、ブランチなども指定できる。

使用例。
```bash
$ npx cloc --diff adbbf85d00d5d77c492effcf88b64165199e869e 7a01e036a2641b692c0d44d53fa931e37c233d74
       4 text files.
       5 text files.
       0 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.70 s (10.0 files/s, 176.1 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Markdown
 same                            0              0              0              0
 modified                        1              0              0              1
 added                           1              0              0              1
 removed                         0             25              0             49
Vuejs Component
 same                            0              0              0             11
 modified                        1              0              0              2
 added                           2              0              0             11
 removed                         2              0              0             23
-------------------------------------------------------------------------------
SUM:
 same                            0              0              0             11
 modified                        2              0              0              3
 added                           3              0              0             12
 removed                         2             25              0             72
-------------------------------------------------------------------------------
```

# 注意：日本語ファイルがあるとエラーになる

```
$ npx cloc --diff adbbf85d00d5d77c492effcf88b64165199e869e 7a01e036a2641b692c0d44d53fa931e37c233d74
fatal: pathspec '"\343\201\273\343\201\222.md"' did not match any files
Failed to create tarfile of files from git. at C:\Users\Hoge\AppData\Local\npm-cache\_npx\193bf3c6a01f3d46\node_modules\.bin\..\cloc\lib\cloc line 5676.
```

以下を実施すれば解消する。
```
$ git config --local core.quotepath false
```

# 気になったオプション

`--help`を付与して実行すれば各オプションの説明が参照できる。また、`-v`を付与すると実行内容の詳細が標準出力される。そのほか、気になったオプションについて挙動を確認してみた結果を以下に示す。

## --include-ext=\<ext1\>[,ext2[...]]

指定した拡張子のファイルのみをカウント対象とする。拡張子の指定時、`.（ドット）`は不要である。

<details><summary>実行例</summary>

```bash
$ npx cloc --include-ext=md,ts  --diff 31a1dd76228f12091805969cbe941883f332f26f 8735ade64963a29ac6bf8c553298b53c2afa82b2
       2 text files.
       3 text files.
       2 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.78 s (2.6 files/s, 10.3 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Markdown
 same                            0              0              0              5
 modified                        1              0              0              0
 added                           0              1              0              1
 removed                         0              0              0              0
TypeScript
 same                            0              0              0              0
 modified                        0              0              0              0
 added                           1              0              0              1
 removed                         0              0              0              0
-------------------------------------------------------------------------------
SUM:
 same                            0              0              0              5
 modified                        1              0              0              0
 added                           1              1              0              2
 removed                         0              0              0              0
-------------------------------------------------------------------------------
```
</details>

## --exclude-ext=\<ext1\>[,\<ext2\>[...]]

指定した拡張子のファイルをカウント対象から除外する。拡張子の指定時、`.（ドット）`は不要である。

<details><summary>実行例</summary>

```bash
$ npx cloc --exclude-ext=md,ts  --diff 31a1dd76228f12091805969cbe941883f332f26f 8735ade64963a29ac6bf8c553298b53c2afa82b2
       2 text files.
       3 text files.
       3 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.84 s (1.2 files/s, 6.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Vuejs Component
 same                            0              0              0              3
 modified                        1              0              0              2
 added                           0              0              0              0
 removed                         0              0              0              0
-------------------------------------------------------------------------------
SUM:
 same                            0              0              0              3
 modified                        1              0              0              2
 added                           0              0              0              0
 removed                         0              0              0              0
-------------------------------------------------------------------------------
```
</details>

## --exclude-list-file=\<file\>

\<file\>の中に記載したファイルやディレクトリをカウント対象から除外する。\<file\>のフォーマットは、`--list-file`のインプットファイルと同じ。

<details><summary>実行例</summary>

```bash
$ cat input.txt 
README.md
components/MyTitle.vue
$ npx cloc --exclude-list-file=./input.txt --diff 31a1dd76228f12091805969cbe941883f332f26f 8735ade64963a29ac6bf8c553298b53c2afa82b2
       0 text files.
       1 text file.
       0 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.80 s (1.2 files/s, 1.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
TypeScript
 same                            0              0              0              0
 modified                        0              0              0              0
 added                           1              0              0              1
 removed                         0              0              0              0
-------------------------------------------------------------------------------
SUM:
 same                            0              0              0              0
 modified                        0              0              0              0
 added                           1              0              0              1
 removed                         0              0              0              0
-------------------------------------------------------------------------------
```
</details>

## --csv

csv形式で出力する。

<details><summary>実行例</summary>

```bash
$ npx cloc --csv dev/
       2 text files.
       2 unique files.
       0 files ignored.

files,language,blank,comment,code,"github.com/AlDanial/cloc v 2.02  T=0.02 s (101.2 files/s 303.5 lines/s)"
1,Vuejs Component,0,0,5
1,Markdown,0,0,1
2,SUM,0,0,6
```
</details>


## --git

---diffオプション使用時のインプットは、デフォルトでは、まずファイルやアーカイブなどであるかを判定し、次にコミットハッシュなどgit関連のインプットと認識しようとする。このオプションを使用すると強制的に最初にgit関連のインプットとして認識しようとする。ブランチ名と同じディレクトリがある場合などに、ブランチ名として認識させたいときなどに使える。

## --diff-timeout \<N\>

このオプションは、比較時の1ファイルあたりのタイムアウト値。デフォルトだと10秒。すなわち、比較に10秒以上かかる場合はその時点でタイムアウトし無視される。`--diff-timeout 0`にするとタイムアウトしない設定になる。

## --count-and-diff \<set1\> \<set2\>

\<set1\>,\<set2\>に指定できるのは、ファイル、ディレクトリ、アーカイブのみで、git関連は指定不可。このオプションを指定すると、以下の流れで処理するようになる。
1. \<set1\>の行数カウント
1. \<set2\>の行数カウント
1. 上記2つのカウント結果の差分計算

## --diff-alignment=\<file\>

このオプションを使用すると、強制的に`--diff`状態で実行され、差分を計算する際に関連するファイルの情報を\<file\>の中に吐き出す。
<details><summary>実行例</summary>

```bash
$ npx cloc --diff-alignment=out.txt adbbf85d00d5d77c492effcf88b64165199e869e 7a01e036a2641b692c0d44d53fa931e37c233d74
       4 text files.
       5 text files.
Wrote out.txtunique files.
       0 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.71 s (9.8 files/s, 172.3 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Markdown
 same                            0              0              0              0
 modified                        1              0              0              1
 added                           1              0              0              1
 removed                         0             25              0             49
Vuejs Component
 same                            0              0              0             11
 modified                        1              0              0              2
 added                           2              0              0             11
 removed                         2              0              0             23
-------------------------------------------------------------------------------
SUM:
 same                            0              0              0             11
 modified                        2              0              0              3
 added                           3              0              0             12
 removed                         2             25              0             72
-------------------------------------------------------------------------------

$ cat out.txt
Files added: 3
  + /tmp/8pCN38dLMm/components/MyTitle.vue ; Vuejs Component
  + /tmp/8pCN38dLMm/components/SimpleCounter.vue ; Vuejs Component
  + /tmp/8pCN38dLMm/ほげ.md ; Markdown

Files removed: 2
  - /tmp/KwAjQBOTRf/components/SimpleTable.vue ; Vuejs Component
  - /tmp/KwAjQBOTRf/components/SimpleTitle.vue ; Vuejs Component

File pairs compared: 2
  != /tmp/KwAjQBOTRf/README.md | /tmp/8pCN38dLMm/README.md ; Markdown
  != /tmp/KwAjQBOTRf/app.vue | /tmp/8pCN38dLMm/app.vue ; Vuejs Component

```
</details>

## --diff-list-file=\<file\>

比較するファイルのペアを\<file\>に記述し、それをもとに比較するように指示するオプション。\<file\>のフォーマットは、`--diff-alignment`オプション使用時の出力結果と同じ。

## --list-file=\<file\>

処理対象を\<file\>に記載して、それらだけをカウントするように指示するオプション。
<details><summary>実行例</summary>

```bash
$ cat input.txt 
README.md
components/MyTitle.vue
$ npx cloc --list-file=./input.txt
       2 text files.
       2 unique files.
       0 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.02 s (127.1 files/s, 762.8 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Markdown                         1              2              0              5
Vuejs Component                  1              0              0              5
-------------------------------------------------------------------------------
SUM:                             2              2              0             10
-------------------------------------------------------------------------------

$
```
</details>

## --diff-list-files \<file1\> \<file2\>

\<file1\>,\<file2\>のフォーマットは、`--list-file`のインプットファイルと同じ。
このオプションを指定すると、\<file1\>に記載したファイルやディレクトリと\<file2\>に記載したファイルやディレクトリを比較する。
<details><summary>実行例</summary>

```bash
$ cat input1.txt 
README.md
components/MyTitle.vue
$ cat input2.txt 
dev/README.md
dev/NewTitle.vue
$ npx cloc --diff-list-files ./input1.txt ./input2.txt
       2 text files.
       2 text files.
Use of uninitialized value in numeric lt (<) at C:\Users\hoge\AppData\Local\npm-cache\_npx\193bf3c6a01f3d46\node_modules\.bin\..\cloc\lib\cloc line 13308, <$fh> line 2.
Use of uninitialized value $L_drop in pattern match (m//) at C:\Users\hoge\AppData\Local\npm-cache\_npx\193bf3c6a01f3d46\node_modules\.bin\..\cloc\lib\cloc line 13332, <$fh> line 2.
Use of uninitialized value $leading in regexp compilation at C:\Users\hoge\AppData\Local\npm-cache\_npx\193bf3c6a01f3d46\node_modules\.bin\..\cloc\lib\cloc line 13174, <$fh> line 2.
Use of uninitialized value $leading in regexp compilation at C:\Users\hoge\AppData\Local\npm-cache\_npx\193bf3c6a01f3d46\node_modules\.bin\..\cloc\lib\cloc line 13174, <$fh> line 2.
       0 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.03 s (114.9 files/s, 727.5 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Vuejs Component
 same                            0              0              0              0
 modified                        0              0              0              0
 added                           1              0              0              5
 removed                         1              0              0              5
Markdown
 same                            0              0              0              0
 modified                        1              0              0              1
 added                           0              0              0              0
 removed                         0              3              0              5
-------------------------------------------------------------------------------
SUM:
 same                            0              0              0              0
 modified                        1              0              0              1
 added                           1              0              0              5
 removed                         1              3              0             10
-------------------------------------------------------------------------------
```
</details>

# 参考文献

https://qiita.com/horit/items/003856c8c862d13f8fd9

# おわりに

cloc 超便利！！