最近 OSS を clone コードを読むことが増えていて、どれくらいのペースでリポジトリを clone しているのか測りたくなってきた。計測は面倒なので気が向いた時で良いとして、計測したくなったときにできるよう、clone したリポジトリ一覧を後から集計できるようにしておきたい。
— mizdra (@mizdra) 2022年8月5日
ということをふと思いついた。定量的に物事を見れると良い振り返りができて嬉しいと思う。とりあえず集計だけでもやってみる。
shell の history から一覧を作る
どうやって一覧しよう、と思ってまず思いついたのが、shell の history を使う方法。ghq list
で探しても良いけど、ディスク容量が減ってきたら見なくなったリポジトリを削除したりするので、やっぱり shell history からたどるのが良いだろうというアイデア。
history 1
の出力を grep すれば良いだけで、ちょっと前にも id:onk さんが似たようなことをされていた。
$ history 1 | awk '{ print $2,$3,$4 }' | grep -e 'git clone' | awk '{ print $3 }' git@github.com:mizdra/typed-less-modules.git git@github.com:vercel/next.js.git git@github.com:madyankin/postcss-modules-example.git ...
普段は git clone
ではなく ghq get
を使っているので、OR 検索する。
$ history 1 | awk '{ print $2,$3,$4 }' | grep -e 'git clone' -e 'ghq get' | awk '{ print $3 }' git@github.com:mizdra/typed-less-modules.git git@github.com:vercel/next.js.git git@github.com:madyankin/postcss-modules-example.git git@github.com:mrmckeb/typescript-plugin-css-modules.git --help --shallow ...
ghq get --shallow <url>
のようなケースが上手く考慮できていないので考慮してやる。ついでに --help
は除外する。
$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' | grep -v '\-\-help' | awk '{ print $3,$4 }' git@github.com:mizdra/typed-less-modules.git git@github.com:vercel/next.js.git git@github.com:madyankin/postcss-modules-example.git git@github.com:mrmckeb/typescript-plugin-css-modules.git --shallow git@github.com:vercel/next.js.git
id:mizdra は git sclone
という git clone --shallow
の alias も使っているので、これも考慮する。
$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' -e 'git sclone' | grep -v '\-\-help' | awk '{ print $3,$4 }' git@github.com:mizdra/typed-less-modules.git git@github.com:vercel/next.js.git git@github.com:madyankin/postcss-modules-example.git git@github.com:mrmckeb/typescript-plugin-css-modules.git --shallow git@github.com:vercel/next.js.git git@github.com:garris/BackstopJS.git ...
自分以外の OSS のリポジトリのみに絞りたいので、org が自分のものは除外する (OSS を自分の org に fork したものも除外されてしまうけど…まあそんな数もないので気にせずで)。こういう時ハンドルネームがユニークだと、雑に除外条件を設定しても期待通りになってうれしい。
$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' -e 'git sclone' | grep -v -e '\-\-help' -e 'mizdra' | awk '{ print $3,$4 }' git@github.com:vercel/next.js.git git@github.com:madyankin/postcss-modules-example.git git@github.com:mrmckeb/typescript-plugin-css-modules.git --shallow git@github.com:vercel/next.js.git git@github.com:garris/BackstopJS.git ...
完成系
という訳で、完成したワンライナーとその実行結果がこちら。private リポジトリ見られると良くないものや、mizdra 以外の org で自分が開発しているものなどは手作業で除外した。
$ history 1 | awk '{ print $2,$3,$4,$5 }' | grep -e 'git clone' -e 'ghq get' -e 'git sclone' | grep -v -e '\-\-help' -e 'mizdra' | awk '{ print $3,$4 }' git@github.com:vnc0/magic-trackpad-switcher.git git@github.com:mrmckeb/typescript-plugin-css-modules.git git@github.com:AriPerkkio/eslint-remote-tester.git git@github.com:zhouzi/graphql-codegen-factories.git git@github.com:garris/BackstopJS.git git@github.com:APIs-guru/graphql-faker.git git@github.com:isucon/isucon11-qualify.git git@github.com:vercel/next.js.git --shallow git@github.com:vercel/next.js.git git@github.com:vercel/next.js.git git@github.com:jest-community/vscode-jest.git https://github.com/jest-community/jest-editor-support.git git@github.com:prettier/prettier.git https://github.com/royriojas/file-entry-cache --shallow git@github.com:microsoft/TypeScript.git --shallow git@github.com:dotansimha/graphql-code-generator.git git@github.com:madyankin/postcss-modules-example.git git@github.com:facebook/docusaurus.git git@github.com:postcss/postcss.git
同じリポジトリが何回も出力されていたり、--shallow
が出ていたりするのが気になるけど、とりあえず良さそうなデータが集計できて満足した!
shell history だけだと clone 日時まではわからないので、なんか色々工夫したほうが良いのかもしれない。HISTTIMEFORMAT
を変更して shell history に日付が埋め込まれるようにするのが良い気がするけど、これって過去の履歴壊れたりしないかな…どうしようかな…というところで悩み中。
おまけ
ところで一覧を見て、「なんか最近触ったリポジトリばかりだな…」と思ったのでちょっと調べてみたら…
$ history 1 | wc -l 1068 $ echo $HISTSIZE 2000 $ cat ~/.zshenv | grep HISTSIZE export HISTSIZE=1000000
.zshrc
で設定した $HISTSIZE
が上手く適用されていないのか、1068 件しか保存されてなさそう。というか値 3 つともバラバラになっている。そんな………………
追記 (2022/08/06 02:12)
どうやら shell history の最大件数は HISTSIZE
ではなく HISTFILESIZE
で調整するものらしい。
$ echo $HISTFILESIZE $ cat ~/.zshenv | grep HISTFILESIZE $ echo $? 1
何も設定していなくて、zsh のデフォルト値が使われていそう。そういうことだったのか…
追記 (2022/08/06 12:23)
もうちょっと調べてみたら、zsh で履歴の最大保存件数を表す環境変数は HISTFILESIZE
ではなく SAVEHIST
のようだった。これ shell ごとに違うんですね。
$ echo $SAVEHIST 1000 $ cat ~/.zshenv | grep SAVEHIST export SAVEHIST=1000000
.zshenv
で SAVEHIST
設定しているはずなのだけど、なぜか無視されていた。.zshenv
で設定している他の環境変数 (export EDITOR="code --wait"
とか) はちゃんと認識されているのだけどなー。なんでだろう。
追記 (2022/08/06 13:26)
https://t.co/TgOa1Cy2Pp を読むと環境変数は .zshenv で設定すると良さそう & https://t.co/oy125xI6ji や https://t.co/7hsyX8MGh1 を見ると、SAVEHIST は .zshrc で設定すると良さそうに見える...のだけど、.zshenv に SAVEHIST を書いたら上書きされてしまうのがなぜなのかが分からない。
— mizdra (@mizdra) 2022年8月6日
メーリングリストで何か議論されていないかな…と思ってメーリングリストのアーカイブを検索してみる。アーカイブは https://www.zsh.org/mla/ にあるけど、全文検索機能は付いていないので、ここは Google で <キーワード> site:https://www.zsh.org/mla/
というクエリを打ち込んで調べる。Google 便利。
メーリングリストのアーカイブ検索しているけど何も分からない… ソースコード追わないと分からなさそう。https://t.co/5b6c5pDxxW
— mizdra (@mizdra) 2022年8月6日
という訳で ghq get git@github.com:zsh-users/zsh.git
する。こうして git clone した OSS リポジトリがまた1つ増えていく…
よく分からないけどデフォルト値設定しているところは発見したhttps://t.co/FNS34s2iWk
— mizdra (@mizdra) 2022年8月6日
もう追う体力残ってないので、.zshrc
に設定を移動して終わりにした。
とりあえず .zshrc に移動したhttps://t.co/8N4Q0Fglxp
— mizdra (@mizdra) 2022年8月6日