Hudsonにへっぽこパッチをあてて,ファイル名が日本語でも文字化けしないでZIPアーカイブできるようにした

えー,JDK付属のZipOutputStream/ZipEntryはファイル名をUTF-8で見るので,ファイル名に日本語使っているとロクな事がありません。


ということを昔やった仕事で知っていたので,こんなパッチあててみた。
見ての通り,JDKの代わりにAntのZipライブラリを使って,エンコードのデフォルトエンコードを仕込んだだけ。

Index: core/src/main/java/hudson/FilePath.java
===================================================================
--- core/src/main/java/hudson/FilePath.java	(revision 1.45)
+++ core/src/main/java/hudson/FilePath.java	Mon Mar 31 22:54:38 JST 2008
@@ -22,6 +22,8 @@
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.tar.TarEntry;
 import org.apache.tools.tar.TarOutputStream;
+import org.apache.tools.zip.ZipOutputStream;
+import org.apache.tools.zip.ZipEntry;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -50,8 +52,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
 import java.util.zip.GZIPOutputStream;
 import java.util.zip.GZIPInputStream;
 
@@ -208,6 +208,7 @@
                 buf = new byte[8192];
 
                 ZipOutputStream zip = new ZipOutputStream(out);
+                zip.setEncoding(System.getProperty("file.encoding"));
                 scan(f,zip,"");
                 zip.close();
                 return null;
@@ -255,6 +256,7 @@
                 byte[] buf = new byte[8192];
 
                 ZipOutputStream zip = new ZipOutputStream(out);
+                zip.setEncoding(System.getProperty("file.encoding"));
                 for( String entry : glob(dir,glob) ) {
                     zip.putNextEntry(new ZipEntry(dir.getName()+'/'+entry));
                     FileInputStream in = new FileInputStream(new File(dir,entry));

これで一応,Hudson on Windowsでも,日本語のファイル名を文字化けせずにZIP化することができるよ。
ただ,Windows以外のプラットフォームで動かしている場合,こんなパッチで十分なのかどうかはわからん。ちなみに,Hudson on OSXの場合は,こんなパッチあてなくても文字化けはしない(OSXファイルシステム自体がUTF-8だからだろう)。

Hudsonにへっぽこパッチをあてて,TinyMCEを組み込んでみた

Hudsonの「説明を記入」はなかなか便利なんだけど,素のテキストエリアで使い勝手がイマイチだったので,TinyMCEを組み込んでみた。

組み込み方

  • TinyMCEを '$HUDSON_HOME/main/war/resources/scripts' に放り込む。
  • あと,こんなパッチあててビルドする(つってもコンパイル不要なんで,実行環境に直接あててもいい)。
Index: core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly
===================================================================
--- core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly	Thu Apr 03 11:39:23 JST 2008
+++ core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly	Thu Apr 03 11:39:23 JST 2008
@@ -4,7 +4,7 @@
 <j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:f="/lib/form" xmlns:l="/lib/layout">
   <l:ajax>
     <form action="submitDescription" method="post">
-      <f:textarea name="description" value="${it.description}" />
+      <f:textarea name="description" id="description_editor" value="${it.description}" />
       <div align="right">
         <f:submit value="Submit" />
       </div>


Index: core/src/main/resources/lib/layout/layout.jelly
===================================================================
--- core/src/main/resources/lib/layout/layout.jelly	Thu Apr 03 11:02:26 JST 2008
+++ core/src/main/resources/lib/layout/layout.jelly	Thu Apr 03 11:02:26 JST 2008
@@ -63,7 +63,8 @@
     </j:if>
 
     <script src="${resURL}/scripts/hudson-behavior.js" type="text/javascript"></script>
+    <script src="${resURL}/scripts/tiny_mce/tiny_mce.js" type="text/javascript"></script>
-    
+
     <link rel="stylesheet" href="${resURL}/scripts/yui/container/assets/container.css" type="text/css"/>
     <link rel="stylesheet" href="${resURL}/scripts/yui/assets/skins/sam/skin.css" type="text/css" />
     <link rel="stylesheet" href="${resURL}/scripts/yui/button/assets/skins/sam/button.css" type="text/css" />


Index: war/resources/scripts/hudson-behavior.js
===================================================================
--- war/resources/scripts/hudson-behavior.js	Thu Apr 03 11:47:33 JST 2008
+++ war/resources/scripts/hudson-behavior.js	Thu Apr 03 11:47:33 JST 2008
@@ -447,6 +447,19 @@
           onComplete : function(x) {
             d.innerHTML = x.responseText;
             Behaviour.applySubtree(d);
+            tinyMCE.init({
+              mode : "exact",
+              elements : "description_editor",
+              theme : "advanced",
+              theme_advanced_toolbar_location : "top",
+              theme_advanced_toolbar_align : "left",
+              plugins : "table,contextmenu,searchreplace",
+              theme_advanced_layout_manager : "SimpleLayout",
+              theme_advanced_buttons1 : "search,replace,separator,bold,italic,insertdate,underline,strikethrough,separator,bullist,numlist,outdent,indent,formatselect,separator,hr,table,link,unlink,separator,cleanup,help,code",
+              theme_advanced_buttons2 : "",
+              theme_advanced_buttons3 : ""
+
+            });
             d.getElementsByTagName("TEXTAREA")[0].focus();
           }
         }

参考リンク


リサイズのハンドルが効かないとか,まだ調整の余地はあるけど,当初の目的は果たしたからもういいや(tinyMCE.init()のオプション,お好みで調整してちょ)。
WYSIWYGで編集できるんで便利なんだけど,TinyMCEってGPL(もしくはLGPL)なのね。できてから気付いたんで,ガッカリした。:-(


ps.
それはそうと,Hudsonの「説明を記入」はホントウに便利だよ。
よくやるのは,プロジェクトページにTODOメモっとくのと,失敗ビルドんときに何でコケたのかメモるのに使ってる(ついでに,「Keep this build forever」でビルド自体も保存しとく)。

IDEAのMavenサポートのありがたみがわからんなら,Hudsonプロジェクトをマウントしてみるといい

って自分に言ってんだけどね。:-P


是が非でもMavenizeしてみたいとは思わんけど,Mavenizeされたプロジェクトを開くのに,これほど適したIDEもそうないと改めて思った次第であります。
感心したところで言えば,POM直接開けるってのと,"Run/Debug Configurations"に"Maven"があるってことね。


後者は,"hudson:run"ゴールを設定しておけばデバッガ起動も楽々さ(YourKitも楽勝です)。
って笑っちまうぞ,コノヤロウ。:-D
#直接は関係ないけど,コード探索すんのホントウに便利ね。> IDEA