🔍

コード行数計測ツール「cloc」を使って改修ステップ数をカウントしてみた

2024/12/04に公開

はじめに

こんにちは。クラウドエース株式会社 第四開発部の相原です。

本記事では、Git のコミット間でどれだけコードが改修されたかを、「cloc」を使ってカウントする方法について解説します。cloc はコード行数を計測したり、変更差分を分析するのに役立つ便利なツールです。

この記事を通じて、リポジトリ内の変更をより効率的に把握できるようになり、プロジェクト管理やコードレビューに役立てていただければと思います。

環境

  • macOS Sonoma 14.4.1
  • Homebrew 4.4.6
  • cloc 2.02

対象となる読者

  • Git を日常的に使用している開発者
  • コードの変更量を効率的に把握したい方
  • cloc を使ったコード分析に興味がある方

cloc について

cloc(Count Lines of Code)は、さまざまなプログラミング言語で書かれたソースコードの行数をカウントするためのオープンソースツールです。

このツールは、プロジェクトの規模を把握したり、コードベースのメンテナンスや分析に役立ちます。

特徴

多言語対応

cloc は、C、Java、Python、Ruby など、さまざまなプログラミング言語をサポートしています。多言語のプロジェクトにおいても、一貫してコード行数を計測することが可能です。

簡単に使用可能

コマンドラインから簡単なコマンドを実行するだけで、迅速にコード行数を集計できます。セットアップが容易で、誰でもすぐに利用を開始できます。

詳細なレポート

コード行、コメント行、空行を分類して計測し、それらの内訳を含む詳細なレポートを生成します。計測結果はテキストやファイルに出力可能で、プロジェクトの変更内容を分析するのに役立ちます。

より詳細な情報は公式のドキュメントを参照してください。

https://github.com/AlDanial/cloc

「cloc」のインストール

以下のコマンドで cloc をインストールできます。

brew install cloc

上記以外のインストール方法については、公式のドキュメントを参照してください。

比較するコード

今回は「変更」「追加」「削除」のステップ数が cloc で検出できることを検証するために、以下のようなサンプルコードを用意して変更を加えました。

変更前

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        //コンソールに出力
        System.out.println("変更しない");
        System.out.println("修正する");
        System.out.println("削除する");
    }
}

変更前のコードを「変更前の状態」として Git に記録します。

git add .
git commit -m "変更前"

変更後

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);

        //コンソールに出力
        System.out.println("追加した");
        System.out.println("変更しない");
        System.out.println("修正した");
    }
}

変更後のコードを「変更後の状態」として Git に記録します。

git add .
git commit -m "変更後"

変更前と変更後の違いは以下の通りです。

  • 「変更しない」と出力する行を残した。
  • 「削除する」と出力する行を消して、「追加した」と出力する行を追加した。
  • 「修正する」と出力する行を、「修正した」と出力するように修正した。

Gitのコミットハッシュ値を使い、コード行数計測をする

リポジトリ内のある時点と別の時点でのコードの変更点を知りたい場合、以下の手順で Git のコミットハッシュを指定して cloc を実行することで計測できます。

リモートリポジトリをクローン

まず、Git リポジトリをローカルにクローンします。

git clone <リポジトリのURL>

Gitのコミット履歴を参照

Git のコミットの履歴を確認します。

git log

特定のコミットハッシュ値を使い、差分を計測

比較対象のコミット間で差分を計測します。

cloc --diff <コミットハッシュ1> <コミットハッシュ2>

HEAD で最新のコミットを指定することもできます。

cloc --diff <コミットハッシュ1> HEAD

サンプルコードの変更前後の差分を計測した結果

サンプルコードの変更前後のコミットハッシュを利用して差分を計測します。

cloc --diff 690dc17ee5977bb6e8757c586225bc7d755ba0dc df4f1d29b9fa1925a7ec490984f3eeeec000a9f2
       1 text file.
       1 text file.
       0 files ignored.                             

github.com/AlDanial/cloc v 2.02  T=0.23 s (4.4 files/s, 62.1 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Java
 same                            0              0              1             10
 modified                        1              0              0              1
 added                           0              0              0              1
 removed                         0              0              0              1
-------------------------------------------------------------------------------
SUM:
 same                            0              0              1             10
 modified                        1              0              0              1
 added                           0              0              0              1
 removed                         0              0              0              1
-------------------------------------------------------------------------------
  • 1行目: 1 text file.
    最初のコミット(変更前)の中で、cloc が計測対象として認識したファイルが1つあったことを示しています。

  • 2行目: 1 text file.
    2つ目のコミット(変更後)の中で、cloc が計測対象として認識したファイルが1つあったことを示しています。

  • 3行目: 0 files ignored.
    計測対象外になったファイルは0件だったことを示しています。

集計結果の項目ごとの説明

  • same
    変更前後で同一のコード行数を表します。今回、変更のないコード(例えばパッケージ宣言やインポート文)が10行存在しているため、same に 10 と出力されています。

  • modified
    修正されたコード行数を表します。「修正する」と出力するコードが、「修正した」と出力するコードに変更したため、modified に 1 が出力されています。

  • added
    新たに追加されたコード行数を表します。「追加した」と出力するコードが追記されたため、added に 1 が出力されています。

  • removed
    削除されたコード行数を表します。「削除する」と出力するコードが削除されたため、removed に 1 と出力されています。

計測対象のファイルを txt ファイルで出力する

--diff オプションを使うことで、Git のコミット間で変更されたファイルの行数を計測できますが、どのようなファイルが計測対象となったかまでは分かりません。

計測対象になったファイル一覧を確認するには、 --diff-alignment オプションを使う必要があります。

cloc --diff-alignment=found_files.txt 690dc17ee5977bb6e8757c586225bc7d755ba0dc df4f1d29b9fa1925a7ec490984f3eeeec000a9f2
       1 text file.
       1 text file.
Wrote found_files.txtiles.                          
       0 files ignored.                           

github.com/AlDanial/cloc v 2.02  T=0.27 s (3.7 files/s, 52.1 lines/s)

//以下の出力は前のcloc --diff 690dc17ee5977bb6e8757c586225bc7d755ba0dc
df4f1d29b9fa1925a7ec490984f3eeeec000a9f2と同じです。

コマンドを走らせると、作業をしているディレクトリに found_files.txt が作成されます。

File pairs compared: 1
  != /var/folders/jt/873k1nns1czgpzx27b08t88r0000gp/T/UX4Zm370kg/src/main/java/com/example/demo/DemoApplication.java | /var/folders/jt/873k1nns1czgpzx27b08t88r0000gp/T/sf3SBuNsnO/src/main/java/com/example/demo/DemoApplication.java ; Java

出力される txt ファイルの項目ごとの説明

  • Files added
    コードが新たに追加されたファイル一覧を表示します。今回は追加されたファイルがないので表示されていません。

  • Files removed
    コードが削除されたファイル一覧を表示します。今回は削除されたファイルがないので表示されていません。

  • Files pairs compared
    ハッシュコミット間で比較したファイル一覧を表示します。

無視されたファイルをtxtファイルで出力する

今回 cloc の計測対象外になったファイルはありませんでしたが、--diff オプションと --ignored オプションを使うことで、計測対象から除外されたファイルの一覧を出力できます。

cloc --diff 690dc17ee5977bb6e8757c586225bc7d755ba0dc df4f1d29b9fa1925a7ec490984f3eeeec000a9f2 --ignored=ignored_files.txt
       1 text file.
       1 text file.
Wrote ignored_files.txtes.                          
       0 files ignored.                           

github.com/AlDanial/cloc v 2.02  T=0.19 s (5.2 files/s, 72.6 lines/s)

//以下の出力は前のcloc --diff 690dc17ee5977bb6e8757c586225bc7d755ba0dc
df4f1d29b9fa1925a7ec490984f3eeeec000a9f2と同じです。

作業をしているディレクトリに計測対象から除外されたファイルの一覧が記述された found_files.txt が作成されます。

今回、無視されたファイルがなかったので空の txt ファイルが作成されました。

cloc の計測対象外になるファイルの種類

・バイナリファイル

cloc はソースコード行を計測するツールであり、バイナリファイル(非テキストファイル)はコード行として解析されないため無視されます。

・言語不明なファイル

言語判別ができないファイルは無視されます。

・重複ファイル

cloc は同一内容の重複ファイルを検出し、1つにまとめて処理します。そのため、それ以外の重複ファイルは無視されます。

・.gitignoreにリストされているファイル

.gitignore にリストされたファイルは、解析対象から除外されています。

まとめ

  • cloc を使えば、Git のコミット間でコードの修正・追加・削除行数を正確に計測可能
  • --diff オプションや出力機能を活用し、計測対象や無視されたファイルを確認できる。
  • コードの変更規模を可視化することで、進捗管理やコードレビューを効率化できる。

参考文献

Discussion