はじめに
仕事では運用チームの開発担当をしています。普段は1人開発なのですが、サーバーリプレース案件(Windows Server 2008R2 + Oracle11g -> Windows Server 2016 + PostgreSQL 9.6)で20種類以上ある既存アプリケーションの改修と動作検証の対応することになり、手伝いしてくれる方がきたのでプロジェクト管理としてRedmineを導入することにしました。
bitnami Redmineというオールインワンパッケージをインストール(Redmine Ver 3.4.6.stable)しまして、「view customize plugin」という定番プラグインとかも入れました。
ガントチャート関連でいい拡張機能と思ったものは、修正パッチという形で提供されていまして、今回は下記パッチの適用を例に説明していきます。
参照:Redmineを改善するパッチを書いて、OSSへの貢献もする仕事
パッチファイル
Feature #20481: ガントチャートの表示領域の幅をドラッグでリサイズのサイトからパッチファイル「change_to_right_and_left_resizable_panel_v2.patch」を取得します。
http://www.redmine.org/issues/20481
中身は単純なテキストファイルです。TortoiseSVN がインストールされていると、TortoiseUDiffツールにより下図のようにシンタックスハイライトされます。
パッチ適用
今回は4パターンによるパッチ適用を試しました。
- 手修正
- コマンドプロンプト
- Git Bash
- WSL(Ubuntu)
オープンソース系にはこれまであまり関わってきてなかったので、知識が疎いです。
会社ではパッチ適用方法が分からなかったので、短いしそのまま手修正していきました。その後に「patch」コマンドがあることを知り、自宅のPC(Windows 10 Home)に、bitnami Redmineをインストールして試していきました。
適用準備
patchフォルダ作成
redmine導入フォルダ(例 C:\redmine) 配下にあるapps\redmine\htdocs
フォルダにpatch
フォルダを作成して、「change_to_right_and_left_resizable_panel_v2.patch」を格納します。
patchコマンドの導入
patch.exe は、Windowsでは標準にインストールされていません。
下記サイトからダウンロードできます。
patch.exe ユーザーアカウント制御(UAC)対応
もう少し調べると、Git for Windows がインストールされている場合、Git\usr\bin\patch.exe
に含まれています。
既にGit for Windowsはインストール済みだったので、コマンドプロンプトでpatch -v
が実行できました。今回はこのpatch.exe
を使います。
手修正
パッチファイルの中身をみて、編集対象ファイルを確認します。先頭のaとbはダミーフォルダです。
--- a/app/views/gantts/show.html.erb
+++ b/app/views/gantts/show.html.erb
--- a/public/javascripts/gantt.js
+++ b/public/javascripts/gantt.js
編集対象ファイルをテキストエディタで開いて、差分分の削除と追加をしていきます。
少なければいいですが、多いと手作業ではさすがに大変になってきます。
コマンドプロンプト
redmine導入フォルダ(例 C:\redmine) 配下にあるapps\redmine\htdocs
フォルダに移動して、下記コマンドを実行します。
※-p1オプションは、手修正で説明したaとbのダミーフォルダ以降を対象フォルダにします。
C:\redmine>cd C:\redmine\apps\redmine\htdocs
C:\redmine\apps\redmine\htdocs>patch -p1 < patch\change_to_right_and_left_resizable_panel_v2.patch
patching file app/views/gantts/show.html.erb
結果として、patchコマンドを実行するとpatchがハングしました。
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Assertation failed!
Program: C:\Perl64\c\bin\patch.exe
File: .\src\patch\2.5.9\patch-2.5.9-src\patch.c, Line 354
Expression: hunk
C:\redmine\apps\redmine\htdocs>
Git Bash
Git Bashを実行するとMINGW64が起動します。
PC MINGW64 /C/redmine/apps/redmine/htdocs
$ patch -p1 < patch/change_to_right_and_left_resizable_panel_v2.patch
show.html.erb
とgantt.js
が正しく修正されました。
patching file app/views/gantts/show.html.erb
Hunk #1 succeeded at 131 (offset -6 lines).
Hunk #2 succeeded at 138 (offset -6 lines).
Hunk #3 succeeded at 264 (offset -6 lines).
Hunk #4 succeeded at 361 (offset -6 lines).
patching file public/javascripts/gantt.js
Hunk #1 succeeded at 239 with fuzz 2 (offset 66 lines).
WSL(Ubuntu)
Linuxではpatchコマンドが標準でインストールされています。
Windows 10にはWSL(Windows Subsystem for Linux)のサブシステムができるようになっており、自分は Ubuntu を入れています。
Git for Windows をインストールしたくない場合、この方法が使えます。
Windows Subsystem for Linux内からWindows側のファイルにアクセスする
スタートメニューの「Ubuntu」をクリックします。
PC:~$ cd /mnt/c/redmine/apps/redmine/htdocs
PC:/mnt/c/redmine/apps/redmine/htdocs$ patch -p1 < patch/change_to_right_and_left_resizable_panel_v2.patch
patching file app/views/gantts/show.html.erb
show.html.erb
とgantt.js
が正しく修正されました。
Hunk #1 succeeded at 131 (offset -6 lines).
Hunk #2 succeeded at 138 (offset -6 lines).
Hunk #3 succeeded at 264 (offset -6 lines).
Hunk #4 succeeded at 361 (offset -6 lines).
patching file public/javascripts/gantt.js
Hunk #1 succeeded at 239 with fuzz 2 (offset 66 lines).
【2018/07/17追記】
下記サイトを知ったので試してみました。
Windows 10のコマンドプロンプトからWSL上のLinuxコマンドを呼び出す(バージョン1803対応版)
コマンドプロンプト上で先頭にWSLを付けてpatchコマンドが呼び出せました。
これは便利です。Git Bashよりいいのではないでしょうか。
C:\redmine>cd c:\redmine\apps\redmine\htdocs
c:\redmine\apps\redmine\htdocs>wsl patch -p1 < patch\change_to_right_and_left_resizable_panel_v2.patch
patching file app/views/gantts/show.html.erb
Hunk #1 succeeded at 131 (offset -6 lines).
Hunk #2 succeeded at 138 (offset -6 lines).
Hunk #3 succeeded at 264 (offset -6 lines).
Hunk #4 succeeded at 361 (offset -6 lines).
patching file public/javascripts/gantt.js
Hunk #1 succeeded at 239 with fuzz 2 (offset 66 lines).
パッチ適用結果
Bitnami Redmine Stack Manager
を起動してRedmineサービスを再起動します。
パッチの「ガントチャートの表示領域の幅をドラッグでリサイズ」が出来るようになりました。
他の修正パッチ
続けて残り2つの修正パッチをあててみました。
「show.html.erb.rej」ファイルが出来ました。これは適用できなかった箇所(reject)の差分ファイルです。
LinuxコマンドTips(109):【 patch 】コマンド――テキストファイルに差分を適用する(応用編その2)
--- app/views/gantts/show.html.erb
+++ app/views/gantts/show.html.erb
@@ -53,6 +53,15 @@
</label>
</fieldset>
</td>
+ <td>
+ <fieldset>
+ <legend><%= l(:field_assigned_to) %></legend>
+ <label for="draw_assigned_to_names">
+ <%= check_box 'query', 'draw_assigned_to_names', :id => 'draw_assigned_to_names' %>
+ <%= l(:label_display) %>
+ </label>
+ </fieldset>
+ </td>
</tr>
</table>
</div>
連続して修正パッチをあてるとズレがでますからね、他の箇所もあるかも知れません。
Githubに手修正したRedmineのガントチャートパッチファイルを置いておきました。
https://github.com/yaju/redmine_patch
最後に
コマンドプロンプトでpatchコマンドを使ってハングした時はどうしようかと思いましたが、Linux系の力をかりてどうにかなりました。
WSL(Windows Subsystem for Linux)のサブシステムは、いろいろ応用が効きそうな予感がしてきました。