BioErrorLog Tech Blog

試行錯誤の記録

ソースコードの行数をカウントする

プログラムのソースコードレポジトリの行数を計測する方法の備忘録です。

はじめに

ソースコードを読みながら、ふとそのレポジトリ全体の行数を知りたくなったときがありました。

やり方の備忘録を残します。

ソースコードの行数をカウントする

コマンドで行数をカウントする

下記コマンドで、gitレポジトリ全体の行数をパッと計測できます。

git ls-files | xargs wc -l

git ls-filesでgit レポジトリ内で管理されているファイルを一覧で取得し、その内容をxargs wc -lで行数カウントしています。


特定のファイルのみを対象にカウントしたい場合は、例えば下記のように間にgrepを挟みます。

git ls-files | grep '\.go' | xargs wc -l

上記の例では、.go拡張子を持つファイルのみを対象として行数カウントしています。 任意の正規表現でカウント対象をgrepでフィルタ可能です。


具体例として、pythonのrequestsライブラリのソースコードのうち、.py拡張子を持つものの行数をカウントしてみます。

# git clone https://github.com/psf/requests.git
# cd requests
git ls-files | grep '\.py' | xargs wc -l
      86 docs/_themes/flask_theme_support.py
     386 docs/conf.py
     132 setup.py
     180 src/requests/__init__.py
      14 src/requests/__version__.py
      50 src/requests/_internal_utils.py
     540 src/requests/adapters.py
     157 src/requests/api.py
     314 src/requests/auth.py
      17 src/requests/certs.py
      79 src/requests/compat.py
     561 src/requests/cookies.py
     151 src/requests/exceptions.py
     134 src/requests/help.py
      33 src/requests/hooks.py
    1032 src/requests/models.py
      30 src/requests/packages.py
     831 src/requests/sessions.py
     128 src/requests/status_codes.py
      99 src/requests/structures.py
    1094 src/requests/utils.py
      14 tests/__init__.py
      23 tests/compat.py
      58 tests/conftest.py
       8 tests/test_adapters.py
      27 tests/test_help.py
      22 tests/test_hooks.py
     428 tests/test_lowlevel.py
      13 tests/test_packages.py
    2839 tests/test_requests.py
      78 tests/test_structures.py
     165 tests/test_testserver.py
     926 tests/test_utils.py
       0 tests/testserver/__init__.py
     134 tests/testserver/server.py
      17 tests/utils.py
   10800 total

合計で10800行の.pyコードがあることが分かりました。

ツールで行数をカウントする

ソースコードの行数をカウントするツールも世の中に多く存在しており、ざっと有名どころを調べただけでもこれだけあります。

今回は、有名なclocを試してみます。

まずは各種パッケージマネージャーでclocをインストールします。

npm install -g cloc              # https://www.npmjs.com/package/cloc
sudo apt install cloc            # Debian, Ubuntu
sudo yum install cloc            # Red Hat, Fedora
sudo dnf install cloc            # Fedora 22 or later
sudo pacman -S cloc              # Arch
sudo emerge -av dev-util/cloc    # Gentoo https://packages.gentoo.org/packages/dev-util/cloc
sudo apk add cloc                # Alpine Linux
doas pkg_add cloc                # OpenBSD
sudo pkg install cloc            # FreeBSD
sudo port install cloc           # macOS with MacPorts
brew install cloc                # macOS with Homebrew
winget install AlDanial.Cloc     # Windows with winget
choco install cloc               # Windows with Chocolatey
scoop install cloc               # Windows with Scoop


では先ほどの例と同様、requestsライブラリをclocでカウントしてみます。

# git clone https://github.com/psf/requests.git
# cd requests
cloc .
      93 text files.
      81 unique files.                              
      23 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.28 s (285.3 files/s, 60468.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                          35           1997           1994           6809
reStructuredText                16            858            243           1931
Markdown                         9            589              6           1626
DOS Batch                        1             34              2            227
make                             2             34              7            202
YAML                             9             33             36            177
CSS                              1             32              2            143
HTML                             3             30              3            114
INI                              1              3              0             15
Text                             2              0              0             10
TOML                             1              1              0              9
SVG                              1              0              0              1
-------------------------------------------------------------------------------
SUM:                            81           3611           2293          11264
-------------------------------------------------------------------------------

このように言語ごとのファイル数と、空白行/コメント行/コード行の数が計測できます。

ちなみにPythonコードについては、
1997(空白) + 1994(コメント) + 6809(コード) = 10800(合計)
なので、先述のコマンドでの計測結果と一致しますね。

他にも、gitコミットを指定してカウントしたり、差分を計測したりと多様な使い方があります。 興味ある方はcloc公式レポを参照ください。

おわりに

以上、gitレポジトリのソースコード行数をカウントする方法を簡単にメモしました。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

参考