水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

gitで行数をカウントするバッチファイル作ろうとしてハマってた

ゆめちくんは競技プログラミングに興味を持っており,暇な時間を使って問題を解いています.
ゆめちくんは自分がこれまでにどのくらいプログラムを書いてきたのかが知りたくなりました.
ここではプログラムの書いた量を便宜的に行数として考えることにします.

ゆめちくんはインターネットで検索したところ,gitリポジトリ内の行数をワンライナーで記述可能であるということを知ることが出来ました.

参考にしたところ

qiita.com
koyamay.hatenablog.com
antibayesian.hateblo.jp

コマンドを幾つか組み合わせれば,プログラムの編集行数が分かりそうです.

しかし,ゆめちくんはアホなので,そんなに多くのコマンドを覚えることが出来ません.
そこでバッチファイルを作り,ワンクリックでコマンドを実行することを考えました.

期待される出力

+10, -2, 8
のように,追加した行数をプラス,削除した行数をマイナスとした値,追加した行と削除した行の差分.





ッて感じで,gitリポジトリで書いたプログラムの商業数を求めようとしたんですよ.
基本的にワンライナーで~ってやつのプログラムを使ってます.

え,そのワンライナーで~ってところで紹介されているものをそのままバッチファイルの中身にすればいいじゃないかって?

そもそもawkがない問題.

Mac, Linuxにはデフォルトで入っているらしいが,Windowsには入っていない.
(ちょっと踏み込むとすぐこれなので,やっぱりMacが開発機として選ばれているの,最近非常に納得がいくようになってきているの良くない)

そのため,gawkを導入.
Downloads - gnu-on-windows - GNU tools for win32 - Google Project Hosting
ここから落として,awk.exeにリネーム,C:\Windows\System32へ移動.C:\Windows\System32にそのままいれれば,パスのことあまり考えなくてもいいことをこれまで知らなかった.(Windowsそのものに対する知識の欠如)

で,これでcmd起動して,awkって打ち込んで帰って来ればOK.

バッチの文字の扱いの問題.

で,ここまで行ければ,gitリポジトリのフォルダ内で例のワンライナーを書くと動きます.
無事に出力されてます.

自分が解いたAtCoderのコードをまとめたリポジトリでテスト.
f:id:kawasumi_yume:20150410201902p:plain

参考(ペイントでモザイクをかける法法)

chihayuu-no-blog.hatenablog.jp


はい,ここで普通の人ならばゴールなんでしょうが,私はこのたぐいのコマンドを覚えるのが非常に苦手なので,バッチファイルにしようと考えました.
そのままバッチファイルにすれば余裕やろ~~

f:id:kawasumi_yume:20150410203149p:plain

???????
見事にハマりました.そもそも何なんだこの出力….

で,最初は文字列が正しく読み込まれてないとか,不正な文字が実は入ってたりだとかそういったところ疑っていたのですが…

結局のところはこうでした,バッチファイル内で"%"を文字として渡すには,"%%"にしないといけないようだ….*1

参考

猫科研究所 - コマンドプロンプトのエスケープ仕様


で,追加 - 削除の行も追加して最終的には,バッチファイルがこんな感じになりました.(ハイライトがおかしいけどもう治すのがめんどくさいのでこのままで…)

git log --numstat --pretty="%%H" | awk "NF==3 {plus+=$1; minus+=$2} END {printf(\"+%%d, -%%d, %%d\n\", plus, minus, plus - minus)}"

ユーザー名指定する場合はこう.

git log --numstat --pretty="%%H" --author="yumechi-525" | awk "NF==3 {plus+=$1; minus+=$2} END {printf(\"+%%d, -%%d\n\", plus, minus)}"

ようやく出来た….

f:id:kawasumi_yume:20150410204326p:plain

疲れました.
一応githubにも置きました.*2
github.com

てか,こういうのはgist使えって話しですね.

gist4de66cd0c492e6efb7de

追記(2015/04/18)

timeoutだとうまくいかないので,標準入力を待つような形に変更しました.エンターキーを押すと終了するみたいな.

おわり.
短いの共有するならgistで良さそうですね.

*1: ボクはバッチファイルをほとんど書いたことがないのでわかりませんでした.ちなみに^%や\%も試してみて,ダメだったので出力できねえ,と半ば折れかけていました… %%とは…!!

*2: 公用のgithubアカウントのせいで,PyCharmがgitクライアントとして機能してる現状,あまりよろしくない