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だからだろう)。