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