イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

コミットメッセージをチェックするスクリプト書いてみた

初めまして、今年新卒でエンジニアに配属されました小畑です。

プログラミングとしては、CとかJavaとかアセンブリ言語とかを軽く勉強した程度で
わりと初心者に近い人です。

そんな私が、ブログ記事・・・これは先輩のブログ記事を参考にするしかない!
そう思っていい記事ないかなと見ていたら、先輩のこんな良い記事が。

コミットメッセージミスを防いでみよう!

キャッシュについて深く反省してみる…​
http://tech.innovation.co.jp/2017/07/31/to-reflect-on-the-cache.html

この記事の後半、シェルスクリプトで問題を見つけたらアラートを表示する。

これだ!!!

最近gitでcommitをする時につけるメッセージを間違えてしまいます。
正しいものは下のメッセージです。

$ git commit -m "テスト!"     #☓正しくない
$ git commit -m "LF-22 テスト!" #◯正しい

これを判定するプログラムをシェルスクリプトで書いてみました!
その勉強の軌跡も書きますので、シェルスクリプトでそんな書き方あるんだ!って気づきになれば幸いです!

動作

$ git cmt "LF-54 テスト"      #正しいのでコミットする
git commit -m "LF-54 テスト"
~~いろいろ書かれて~~
1 file changed, 1 insertion(+)

$ git cmt "テスト"             #コメント付け足してコミットする
git commit -m "LF-707 テスト" OK?(y/n)
y
~~いろいろ書かれて~~
1 file changed, 1 insertion(+)

$ git cmt "テスト"             #コミットしない
git commit -m "LF-707 テスト" OK?(y/n)
n
exit

Step1 メッセージの条件を確かめよう

/usr/local/binにgit-cmt-cというファイルを作成します。
git commit check的な意味合いでこの名前にしました!

まずは条件の判断が出来るかチェックします
1.引数$1をechoでgrepに投げます。
2.grepで条件を正規表現でチェック!

#!/bin/bash
#引数が"LF-**[スペース]"で始まるなら引数をそのまま出力
echo $1 | grep -e "^LF-.* "
実行結果
$ git-cmt-c "LF-22tes"
  何も出力されない 

$ git-cmt-c "LF-22 tes"
LF-22 tes

Step2 if文に入れてメッセージを表示しよう

ここで一つ問題が出てきました。
先程の文をif文にそのまま入れると
if [ echo $1 | grep -e "^LF-.* " ]; then
出力結果を考えると
if [ LF-22 tes ]; then
このように、スペース混じりの文字列が出力されるので、
スペースで区切られた文字は別々の文字と判断されてしまいます。
そこで、以下の手順を踏みました。

1.""で囲むことで、出力されるスペース混じりの文字列を一つにまとめる
2.if文内ではコマンドの実行結果を判定したいので、
  ``で囲むことで文字列ではなくコマンドの実行結果を取得する

#!/bin/bash
#引数が条件にあっているかチェック
if [ "`echo $1 | grep -e "^LF-.* "`" ]; then
  echo "ばっちり!"
else
  echo "先頭にkeyがついてないよ!"
fi
実行結果
$ git-cmt-c "LF-22tes"
先頭にkeyがついてないよ!

$ git-cmt-c "LF-22 tes"
ばっちり!

Step3 エイリアスを設定しよう

このコマンドは、自社サービスのプログラムを触る時にだけ使いたいので、 対象のgitのディレクトリ内.git/configにちょっと追記をします。

***/.git/config
[alias]
        cmt = cmt-c

Step4 正しい時はコミットしよう!

1.実行したいコマンドを記述
2.引数を""で囲みながらコマンドに結合
3.evalで実行!

git-cmt-c
#!/bin/bash
command="git commit -m"
comment='"'$1'"'

#引数が条件にあっていればコマンドを実行
if [ "`echo $1 | grep -e "^LF-.* .*$"`" ]; then
  eval $command' '$comment
else
  echo "先頭にkeyがついてないよ!"
fi
実行結果
$ git cmt "test"           #コミットしない
先頭にkeyがついてないよ!

$ git cmt "LF-123 test"    #コミットする
LF-123 test
~~いろいろ書かれてて~~
1 file changed, 1 insertion(+)

Step5 自動でコメント追加して、実行許可をもらう

ここまででも十分ですが、せっかくなら自動でコメント追加してみましょう。
私達が行ってるプロジェクトでは、ブランチ名feature/◯◯/123の123部分が コメントに必要なので、
番号だけ抜き出し、コメントに追加します。

1.git rev-parseでブランチ名取得
2.sedでブランチ名から数値だけを取得して、コメントに追加
3.read caseでyの時だけコマンド実行

#!/bin/bash
command='git commit -m'
comment='"'$1'"'

#引数が条件にあっていればコマンドを実行
#条件にあっていなければ、LF-**を追加して、コマンド実行許可をもらう
if [ "`echo $1 | grep -e "^LF-.* .*$"`" ]; then
  echo $command' '$comment
  eval $command' '$comment
else
  number="`git rev-parse --abbrev-ref HEAD | sed -E "s/.*\/(.*)$/\1/"`"
  comment='"'LF-$number' '$1'"'

  echo $command' '$comment' OK?(y/n)'
  read ans
  case $ans in
    [Yy] )
      eval $command' '$comment ;;
    * )
      echo 'exit' ;;
  esac
fi
実行結果
$ git cmt "LF-54 テスト"     #正しいのでコミットする
git commit -m "LF-54 テスト"
~~いろいろ書かれて~~
1 file changed, 1 insertion(+)

$ git cmt "テスト"             #コミットする
git commit -m "LF-707 テスト" OK?(y/n)
y
~~いろいろ書かれて~~
1 file changed, 1 insertion(+)

$ git cmt "テスト"             #コミットしない
git commit -m "LF-707 テスト" OK?(y/n)
n
exit

やったことまとめ

■使ったコマンド

  • grep -eで条件一致を探す

  • "" でくくって空行混じりの文字列対策

  • evalで実行

  • sedで条件文字列を抜き出し

  • read caseでユーザーにコマンドを求める

そして偉大なる先輩に敬礼(`・ω・´)ゞ
ここまで読んでくださった方、ありがとうございました!