はじめに
昔からコミットメッセージをおしゃれにしたいなーって思っていました。
しかし、やる気が出ず後回しにしていました。
そんなときに、ChatGPTというものが出てきたので、実験台としてペアプロをしてみました。
ついでにQiitaのイベントに乗っかりました。
どういうものを作ったか
-
prefix/コミットメッセージ本文
の形式でcommitする - commit-msgが絵文字を装飾したり見やすいように整えてくれる
例えばupdate/ファイル更新
, add/ファイル追加
, remove/ファイルの中身を削除
のフォーマットでcommit→pushしたら下図のようになります。
書いたコードはこちら。
※色々見やすい方向に書き換えているため、上図のような形式になっているとは限りません。
この記事では上図のようなcommit-msgを作る方法になっています。
ChatGPTとのペアプロの進め方
Step1. どういうものを作りたいのか要件整理をする
いくらChatGPTが万能だとは言え、要件が決まってないとモノは作れません。
作りたいモノの要件は粗方決まっていたので、下記の通り整理しました。
# Goal
決まったフォーマットで入力したときに、絵文字を装飾してお洒落にする。
決まったフォーマット以外は、エラーで弾く。
## フォーマット
`prefix/commit-msg`の形式。
### prefixの種類
下記の4つを対象にする
- add: 新規ファイルの追加などで使用する。クラッカーの絵文字を付ける。
- update: ファイルの更新などで使用する。キラキラの絵文字を付ける。
- remove: ファイルの削除などで使用する。爆発(?)の絵文字を付ける。
- fix: バグの修正などで使用する。虫の絵文字を付ける。
## 変換後
`[{絵文字}prefix{絵文字}] コミットメッセージ本文` の形式に変換する
(上の画像を参照)
Step2. ChatGPTにお願いする。
この時、自分はまだcommit-msgについて何も知らなかったので、まずは下記のように質問してみました。
それっぽいコードが出てきましたが、それ以上に自分はcommit-msgがPythonで書けることに驚きました。
(bashが出てくることを想定していたので、bashを解説してもらいながら進めるつもりでした)
コードを読むと何となくやっていることが見えてきました。
- 何らかのファイルを読み込む
-
update/
から始まっていれば[update] hoge
を生成する - ファイルの先頭に移動して、2.で作った文言を追加する
- 現在の位置にある(追加した文言)以降の文字列を削除する(変換前の文言を削除)
では、手順1で読み込んでいるファイルは何でしょうか?
ここはChatGPTに聞いてもへーで終わりそうだったので、自分で調べてみました。
commit-msg フックは、開発者の書いたコミットメッセージを保存した一時ファイルへのパスをパラメータに取ります
Step3. 絵文字を追加する
調べたら一瞬で出てきました。これをコミットメッセージに追加すれば出来そうですね。
こんな感じ
new_commit_msg = "[:sparkles:update:sparkles:] " + commit_msg.split("/", 1)[1]
Step4. リファクタリングと拡張
ChatGPTが書いたコードは下記の理由から動きません。
withを抜けているのにもかかわらず、f.seek(0)
と操作をしようとしているためです。
なので、最低限下記のように改善させる必要があります。
with open(commit_msg_file, "r+") as f:
commit_msg = f.read().strip()
if commit_msg.startswith("update/"):
new_commit_msg = "[update] " + commit_msg.split("/", 1)[1]
f.seek(0)
f.write(new_commit_msg)
f.truncate()
さて、次は拡張ですね。
毎回startswith(...)
を書くのはめんどくさいので、match/case
にしてみました。
prefix, msg = commit_msg.split("/", 1)
match prefix:
case "update":
emoji = ":sparkles:"
case "add":
emoji = ":tada:"
case "remove":
emoji = ":boom:"
case "fix":
emoji = ":bug:"
case _:
raise SyntaxError("Commitメッセージに構文の誤りがあります")
new_commit_msg = f"[{emoji}{prefix}{emoji}] {msg}"
後は良い感じにコードを整えて完成しました!
ChatGPTを使った感想
知見外の何かを作る際のペアプロ相手としてはちょうどいいかもしれません。
しかし、上のコードのように甘い部分があるので鵜呑みにはできません。
そのあたりも「本当か?」と思いながら調べつつ進めていけば知識も付いていくのではないか、と思います。
追記: ChatGPTから案だけ貰って改良したからペアプロとは呼ばないなと思ったのでタイトルを変えました