最近AtCoderのbeginer contestにリアルタイムで参加するようになり、競プロが楽しくなってきた。
5月から参加し始めたので、約3ヶ月が経ちソースコードもそこそこ増えてきた。
せっかくなのでgithubで管理してコードが溜まっていく様子を眺めてみたいと思った。
とはいえgithubにpushしたところでACしたコードは後から手を加えないと思うので、
今回はgit hookの勉強のため、コミットメッセージを自動生成してみることを目的にしようと思う。
#git hookとは
gitのコマンドのあれやこれやを使う前や後に自動で任意の処理を加えることができるスクリプト。
使い方などについては、記事の最後に参考記事のリンクを貼っておくのでこの記事では省略し、実例として紹介する。
公式のマニュアルはここで見ることができる。
#コミットメッセージを自動生成
今回はgit commit
を叩いたときに
prepare-commit-msg
で、デフォルトのコミットメッセージが記述されているようにする。
AtCoderの解答をgit管理するので、デフォルトのコミットメッセージは自分の提出一覧へのリンクにすることにする。
自分の提出一覧へのリンクはhttps://atcoder.jp/contests/{コンテスト名}/submissions/me
となっている。
私の場合、コンテストのコードは以下のようにコンテスト名でディレクトリを分けており、偶然にも提出一覧へのリンクの{コンテスト名}
と同じものをディレクトリ名にしていたので、ステージングしたファイルのディレクトリ名からURLが生成できる。
AtCoder
│ .gitignore
│ Source.cpp (雛形)
│
├─ABC126
│ Source.cpp
├─ABC127
│ Source.cpp
├─ABC129
│ Source.cpp
├─以下略
##ステージングしたファイル名を取得
普段git status
をするときは特にオプションを付けていないので調べてみたところ、とても簡素にファイル名だけ表示してくれる-s
コマンドがあった。
$ git status -s
M ABC126/Source.cpp
#prepare-commit-msg
上述したファイル名からディレクトリ名だけ切り出して、URLをつなげてコミットメッセージへ流す。出来上がったものは以下の通り。
#!/bin/sh
if [ "$2" == "" ] ; then
# addしたファイル名からURLを作る
echo "https://atcoder.jp/contests/`git status -s | awk -F '[ /]' '{print $3}'`/submissions/me `cat $1`" > $1
fi
https://atcoder.jp/contests/ABC126/submissions/me
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
# modified: ABC126/Source.cpp
#
ShellScriptはあまり得意ではない。