11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTと協力してcommit-msgを作った

Last updated at Posted at 2023-04-02

はじめに

昔からコミットメッセージをおしゃれにしたいなーって思っていました。
しかし、やる気が出ず後回しにしていました。

そんなときに、ChatGPTというものが出てきたので、実験台としてペアプロをしてみました。
ついでにQiitaのイベントに乗っかりました。

どういうものを作ったか

  1. prefix/コミットメッセージ本文の形式でcommitする
  2. commit-msgが絵文字を装飾したり見やすいように整えてくれる

例えばupdate/ファイル更新, add/ファイル追加, remove/ファイルの中身を削除のフォーマットでcommit→pushしたら下図のようになります。

スクリーンショット 2023-03-23 222243.png

書いたコードはこちら。
※色々見やすい方向に書き換えているため、上図のような形式になっているとは限りません。
この記事では上図のようなcommit-msgを作る方法になっています。

ChatGPTとのペアプロの進め方

Step1. どういうものを作りたいのか要件整理をする

いくらChatGPTが万能だとは言え、要件が決まってないとモノは作れません。
作りたいモノの要件は粗方決まっていたので、下記の通り整理しました。

# Goal
決まったフォーマットで入力したときに、絵文字を装飾してお洒落にする。
決まったフォーマット以外は、エラーで弾く。

## フォーマット
`prefix/commit-msg`の形式。

### prefixの種類
下記の4つを対象にする
- add: 新規ファイルの追加などで使用する。クラッカーの絵文字を付ける。
- update: ファイルの更新などで使用する。キラキラの絵文字を付ける。
- remove: ファイルの削除などで使用する。爆発(?)の絵文字を付ける。
- fix: バグの修正などで使用する。虫の絵文字を付ける。

## 変換後  
`[{絵文字}prefix{絵文字}] コミットメッセージ本文` の形式に変換する
(上の画像を参照)

Step2. ChatGPTにお願いする。

この時、自分はまだcommit-msgについて何も知らなかったので、まずは下記のように質問してみました。
image.png

それっぽいコードが出てきましたが、それ以上に自分はcommit-msgがPythonで書けることに驚きました。
(bashが出てくることを想定していたので、bashを解説してもらいながら進めるつもりでした)

コードを読むと何となくやっていることが見えてきました。

  1. 何らかのファイルを読み込む
  2. update/から始まっていれば[update] hogeを生成する
  3. ファイルの先頭に移動して、2.で作った文言を追加する
  4. 現在の位置にある(追加した文言)以降の文字列を削除する(変換前の文言を削除)

では、手順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から案だけ貰って改良したからペアプロとは呼ばないなと思ったのでタイトルを変えました

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?