38
8

More than 1 year has passed since last update.

Laravel のメインブランチの中に存在している "wip" コミットを洗い出してみた

Last updated at Posted at 2022-07-18

背景

Laravel には,

「コミットメッセージ書くのめんどくせぇ!全部 wip でいいわ」

という信仰に従って(?),メインブランチにも堂々と wip とだけ書かれたコミットがプッシュされています。これを揶揄するかのようにファングッズまで作られる状態です。下記に関しては Taylor 氏公認の模様。お行儀よくコミットメッセージを書いている古くからのオープンソースプロジェクト参加者が発狂しそうな実態ですね

ところで,フォロワーの過去の呟きを今更ながら掘り返してしまいました。せっかくなので,いったいどれだけの wip が存在するのか,統計をとって調べてみました。

調査1: laravel/framework

コミット数統計

最終コミットはこの状態です。

commit 76b407eafb16dfd4a553f3c437fbbc6d8268e3a1 (HEAD -> 9.x, origin/HEAD, origin/9.x)
Author: Samuel Mwangi <samuel@samuelmwangi.co.ke>
Date:   Sat Jul 16 22:38:10 2022 +0300

    [9.x] Fix factory typos (#43223)
    
    * Fix Typos
    
    Fix typos in Factory docblock
    
    * Missed typo

全体に占める割合

// 総コミット数
$ git log --oneline | wc -l
33933

// メッセージが "wip" または "WIP" のみからなるコミット数
$ git log --oneline --grep='^wip$' -i | wc -l
84

// メッセージに "wip" または "WIP" が含まれているコミット数
$ git log --oneline --grep='\bwip\b' -i | wc -l
145

歴史全体の中では,完全一致が 0.25%,部分一致が 0.43% となりました。あれ,意外とレア…?

期間別の統計

「おかしい!もっとよく見るはずなのに!」

そう感じた私は,半期ごとに調べてみることにしました。

oldest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
        --reverse \
    | head -1
)
newest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
    | head -1
)

since_date=$oldest_date
until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

printf "区間\t"
printf "全体\t"
printf "完全一致\t"
printf "部分一致\n"

while true; do
    printf "$since_date - $until_date\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" | wc -l)\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" --grep='^wip$' -i | wc -l)\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" --grep='\bwip\b' -i | wc -l)\n"

    since_date=$(gdate --date "$until_date 1 day" +%Y-%m-%d)
    until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

    if [[ "$since_date" > "$newest_date" ]]; then
        break
    fi
done

date コマンドは GNU 版の gdate を利用しています。ネタ系記事だけど一応このへんは技術要素あるから大丈夫(?)

結果は以下のようになりました。

区間	全体	完全一致	部分一致
2013-01-10 - 2013-07-10	    1866	       0	       0
2013-07-11 - 2014-01-11	    1400	       0	       0
2014-01-12 - 2014-07-12	    1547	       0	       0
2014-07-13 - 2015-01-13	    2356	       0	       0
2015-01-14 - 2015-07-14	    2237	       0	       0
2015-07-15 - 2016-01-15	    2389	       3	       3
2016-01-16 - 2016-07-16	    2325	       0	       1
2016-07-17 - 2017-01-17	    2723	       0	       1
2017-01-18 - 2017-07-18	    1762	       0	       2
2017-07-19 - 2018-01-19	    1726	       1	       2
2018-01-20 - 2018-07-20	    1274	       2	       2
2018-07-21 - 2019-01-21	    1659	      15	      16
2019-01-22 - 2019-07-22	    1847	       2	       2
2019-07-23 - 2020-01-23	    1527	       1	       2
2020-01-24 - 2020-07-24	    2172	      19	      21
2020-07-25 - 2021-01-25	    1636	       3	       6
2021-01-26 - 2021-07-26	    1076	      11	      16
2021-07-27 - 2022-01-27	    1200	      19	      45
2022-01-28 - 2022-07-28	    1001	       8	      25

2019 年がちょうど Laravel 6 の開発・リリースの時期と一致します。あの頃から良くも悪くも """勢いづいて""" きた記憶があるので感覚的にも腑に落ちますね。

変更内容の個別精査 (完全一致)

かなりのコミット数があるので,ここでは完全一致に絞ってみます。

check() {
    local i=0;
    for commit in $(git log --pretty=%H --since="$1" --until="$2" --grep='^wip$' -i --reverse); do
        ((i++))
        if [[ $(( i % 10 )) -eq 0 ]]; then
            echo "Press enter to continue\n"
            read
        fi
        open https://github.com/laravel/framework/commit/"$commit"
    done
}

ここから1個1個虱潰しにしていき,興味深いものに絞り込んで紹介します。但し,プルリクエストの中の1コミットであったものは目視で除外し,あくまで直接プッシュされたものに絞り込みます。

(ここも自動化できるといいんだけどな…)

〜 2018-07-20

check 2013-01-10 2018-07-20
  • wip · laravel/framework@faf2e22
    • AuthManager が,汎用的な Manager 継承をやめて全て固有実装に差し替え
      • 初っ端からなかなかぶっ込んできますね…安易な継承をやめること自体は正しいとは思いますが
  • wip · laravel/framework@1aa9577
    • Guard をクラスからコントラクトに変更して,これまで Guard だったものが SessionGuard として実装の1つに
      • むしろ今まで伝統的セッション管理にしか対応してなかったんかい!でもこの変更のおかげで今の治安があると思えばなかなかいい仕事

2018-07-21 〜 2020-01-23

  • wip · laravel/framework@b298de2
    • Eloquent Event Dispatcher のイベント発火用メソッドが fire から dispatch に変更
      • ありましたね〜 昔はイベントは基本 fire でしたけどいつの間にか dispatch に入れ替わってきてますね。まだ一部フレームワーク内に旧称が残っている場所はあった気がしますが
  • wip · laravel/framework@7248f29
    • 'Sorry, you may not access this page.''Sorry, you are not authorized to access this page.'
      • 自然な英語を感じる…これがネイティブの拘り… may not <V> ってちょっと堅苦しい感じするよね
  • wip · laravel/framework@359bd06
    wip · laravel/framework@e9fe34c
    • リリースバージョンを 5.7 から 5.8 に変更
      リリースバージョンを 5.7 から 5.5 に変更
      • え?って思ったけど, CI で自動デプロイするためにリリース用のスクリプトに変更いちいちコミットして突っ込んでいるのね。LTS の 5.5 をサポートするためにわざわざ対応しているのは偉い。(もう少し良い仕組みありそうな気はするけど…)
      • 以降では省略しますが,類似のコミットが非常に多かったです。

2020-01-24 〜 2022-07-28

やはり近年は劇的に増えてますね…

実はこの後部分一致でも調べましたが,特にこちらは問題ありませんでした

check() {
    local i=0;
    local x=$(git log --pretty=%H --since="$1" --until="$2" --grep='\bwip\b' -i --reverse)
    local y=$(git log --pretty=%H --since="$1" --until="$2" --grep='^wip$\|\(#[0-9]\+\)\|merge pull request' -i --reverse)
    diff=$(diff <(echo "$x") <(echo "$y") | grep '< ' | cut -d' ' -f 2)
    for commit in $(echo $diff); do
        ((i++))
        if [[ $(( i % 10 )) -eq 0 ]]; then
            echo "Press enter to continue\n"
            read
        fi
        open https://github.com/laravel/framework/commit/"$commit"
    done
}

おまけ: version っぽいコミットの調査

version っぽいコミット(typo 含む)のうち,通常のバージョン番号変更以外のことをやっているコミットを探してみます。

oldest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
        --reverse \
    | head -1
)
newest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
    | head -1
)

since_date=$oldest_date
until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

printf "区間\n"
printf "version っぽいコミット\t"

while true; do
    printf "$since_date - $until_date\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" --grep='^vers' -i | wc -l)\n"

    since_date=$(gdate --date "$until_date 1 day" +%Y-%m-%d)
    until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

    if [[ "$since_date" > "$newest_date" ]]; then
        break
    fi
done
version っぽいコミット	2013-01-10 - 2013-07-10	       0
2013-07-11 - 2014-01-11	       2
2014-01-12 - 2014-07-12	       0
2014-07-13 - 2015-01-13	       0
2015-01-14 - 2015-07-14	       2
2015-07-15 - 2016-01-15	       0
2016-01-16 - 2016-07-16	      14
2016-07-17 - 2017-01-17	      23
2017-01-18 - 2017-07-18	      21
2017-07-19 - 2018-01-19	      40
2018-01-20 - 2018-07-20	      36
2018-07-21 - 2019-01-21	      34
2019-01-22 - 2019-07-22	      36
2019-07-23 - 2020-01-23	      36
2020-01-24 - 2020-07-24	      37
2020-07-25 - 2021-01-25	      63
2021-01-26 - 2021-07-26	      27
2021-07-27 - 2022-01-27	      32
2022-01-28 - 2022-07-28	      37

統計自体はすべてのバージョンコミットを含んでいます。ここから const VERSION='...'; の書き換えをしたもの以外に絞り込むと…

check() {
    local i=0;
    local x=$(git log --pretty=%H --since="$1" --until="$2" --grep='^vers' -i --reverse)
    local y=$(git log --pretty=%H --since="$1" --until="$2" --grep='\(#[0-9]\+\)\|merge pull request' -i --reverse)
    diff=$(diff <(echo "$x") <(echo "$y") | grep '< ' | cut -d' ' -f 2)
    for commit in $(echo $diff); do
        if $(git show "$commit" | grep '^[+-]' | grep -v 'const VERSION\|^\(+++\|---\)' >/dev/null 2>&2); then
            ((i++))
            if [[ $(( i % 10 )) -eq 0 ]]; then
                echo "Press enter to continue\n"
                read
            fi
            open https://github.com/laravel/framework/commit/"$commit"
        fi
    done
}

〜 2018-07-20
2018-07-21 〜 2020-01-23

特に無し

2020-01-24 〜 2022-07-28

ありました!

  • versino · laravel/framework@5371296
    • エクステンションの phpredis 版のキャッシュ機能テスト
    • Redis を使った排他制御機能のトレイト分割によるリファクタリング
    • コンフリクト解決ミス修正
    • Eloquent 属性の Enum 対応
      • えぇ…
    • Collection::sortKeysUsing() メソッドの追加
      Stringable::scan() メソッドの追加

      Stringable::whenEmpty() Stringable::whenNotEmpty() の引数変更
      • えぇ…
  • version · laravel/framework@2748457

調査2: laravel/docs

ドキュメンテーションに悪名高い有名コミットがぶちこまれていた記憶があるので,こちらも掘り起こしてみます。

期間別の統計

区間	全体	完全一致	部分一致
2013-01-10 - 2013-07-10	     555	       0	       0
2013-07-11 - 2014-01-11	     350	       0	       0
2014-01-12 - 2014-07-12	     357	       0	       0
2014-07-13 - 2015-01-13	     264	       0	       0
2015-01-14 - 2015-07-14	    1482	       0	       0
2015-07-15 - 2016-01-15	     821	       0	       0
2016-01-16 - 2016-07-16	     677	       7	       7
2016-07-17 - 2017-01-17	    1006	       2	       2
2017-01-18 - 2017-07-18	     698	       1	       1
2017-07-19 - 2018-01-19	     781	       0	       0
2018-01-20 - 2018-07-20	     616	       0	       0
2018-07-21 - 2019-01-21	     887	       9	       9
2019-01-22 - 2019-07-22	     691	       1	       1
2019-07-23 - 2020-01-23	     851	       2	       2
2020-01-24 - 2020-07-24	    1068	      47	      47
2020-07-25 - 2021-01-25	     930	      16	      16
2021-01-26 - 2021-07-26	     488	      22	      22
2021-07-27 - 2022-01-27	     464	      46	      49
2022-01-28 - 2022-07-28	     371	      40	      44

やはり後半に不穏なニオイが…
何かを諦めたような爆発的増加が見える見える…

変更内容の個別精査 (完全一致または部分一致)

〜 2018-07-20

特に無し。

2018-07-21 〜 2020-01-23

2020-01-24 〜 2022-07-28

感想

力尽きました。ドキュメントのほう wip 多すぎ…
(たかがドキュメントだし,でそうしたくなる気持ちは分かるけど)

しかし思ったよりめちゃくちゃな wip は少なかったのがまだ救いか。

38
8
5

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
38
8