サイトアイコン Capital P

Git を使って WordPress 本体用のパッチを作成する

これまでに WordPress 本体にパッチを送ったことがある人はご存知だと思いますが、WordPress 本体は Trac + Subversion を使用して開発されています。

https://core.trac.wordpress.org/

この件については GitHub に移行しようぜーと何年も前から定期的に議論されているのですが、コミッターたちのワークフローが SVN ベースで確立されているのでなかなか難しいようですね。

でも Trac + SVN での開発というのはレガシーな環境なので、若い人に SVN コマンドを覚えてっていうのはいろいろ心が痛みます。

というわけで今回の記事では、WordPress 本体へのパッチを Git を使って作成する方法を説明します。

SVN リポジトリを Git に変換する

WordPress 本体の SVN リポジトリを Git に変換するには以下の要領でできます。

まず任意のディレクトリを作成してください。

$ mkdir -p wordpress-develop && cd wordpress-develop

次に以下のコマンドで WordPress 本体の SVN リポジトリを Git に変換してダウンロードします。

$ git svn clone -r HEAD -s --prefix=svn/ http://develop.svn.wordpress.org/trunk/ .

このコマンドは僕がやったときにはたびたびタイムアウトが出て失敗しました。。。根気よく何回か試してください。。。

今回は、-r HEAD というオプションをつけて最新のコミットのみをダウンロードしています。このオプションを外すと過去の全部のコミット履歴を取得できますが、僕の環境では10時間かかりました。。。

-r HEAD をつければ数分で終わるので、ササッとやりたい人はこれをつけることをおすすめします。

GitHub でメンテしたい場合には、GitHub でリポジトリを作った後、以下のような感じで `push` してください。

$ git remote add origin git@github.com:xxxx/wordpress-develop.git
$ git push origin --all

SVN リポジトリ側でのコミットとミラーリングする

GIt に変換したあとで WordPress 本体の SVN 上のコミットをミラーリングさせるには以下のコマンドを実行してください。

$ git checkout master
$ git svn rebase

パッチを作成する

パッチを作成するのは GitHub でプルリクエストを送るのと同じ要領です。

まず以下のような感じで作業用のブランチを作成してください。

$ git checkout -b my-patch

このブランチで必要な修正をした後で、以下のコマンドで Trac に投稿するためのパッチを作成してください。

$ git diff master --no-prefix

このときにプルリクエストを送っておくと後述する CI を実行することができます。

$ git push origin my-patch

ユニットテストをローカルで実行する

ユニットテストをローカル環境で実行するには以下のコマンドを実行してください。

mysql -u root -e "CREATE DATABASE wordpress_tests;"
cp wp-tests-config-sample.php wp-tests-config.php
sed -i -e "s/youremptytestdbnamehere/wordpress_tests/" wp-tests-config.php
sed -i -e "s/yourusernamehere/root/" wp-tests-config.php
sed -i -e "s/yourpasswordhere//" wp-tests-config.php
npm install
$(npm bin)/grunt
svn checkout https://plugins.svn.wordpress.org/wordpress-importer/tags/0.6.3/ tests/phpunit/data/plugins/wordpress-importer

ローカル環境で MySQL がインストールされていれば、まるまるコピーしてそのまんまターミナルにコピペしていただければいいと思います。

次に PHPUnit をインストールしてください。WordPress は PHP5.2 以上を動作環境としていますので、インストールする PHPUnit は 5.7 が手っ取り早いです。

$ composer global require phpunit/phpunit:5.7

以上が完了したら phpunit コマンドでテストが走ると思います。

ちょっとめんどくさいのですが、src ディレクトリ内にある WordPress 本体のファイルを修正してユニットテストを実行する場合、以下のコマンドを実行しないといけないことにご注意ください。

$ $(npm bin)/grunt

Travis CI で CI を実行する

ローカルでユニットテストを実行しても、完全にすべてのテストが実行されるわけではないので Travis CI で CI を走らせるほうが無難です。

WordPress 本体のソースコードにはそのための一連のファイルも含まれていますので、Travis CI で有効化するだけです。

あとは、修正するたびに `git push` すれば自動的にユニットテストが実行されるようになります。

参考

僕が個人的に作ったリポジトリです。

https://github.com/miya0001/wpdev

WordPress 4.9 のリリースリードを努めたエンジニアさんが在籍する XWP さんによるリポジトリです。こちらも運用の一例として参考になるかもです。

https://github.com/xwp/wordpress-develop

WordPress のパッチの送り方に関する公式なドキュメントです。あまり詳しくないですが、この記事で説明した方法によるパッチの送り方も紹介されています。

Submitting a Patch

このようにこの方法はすでに多くの開発者たちが使用している方法なので、コントリビューターデイではこの方法でやるのもありかもですね。

 

モバイルバージョンを終了