Shift_JIS なファイル名を含む Zip ファイルを解凍する unzip パッケージの作り方

ネタ元: Shift_JISなファイル名を含むZipファイルを解凍する

try:
    out.write(f.read(member))
finally:
    out.close()

1行でファイルを read して write しつつ、諸々は例外で引っ掛ければ良いでしょ、と言うコードがおもしろいです(^ ^;;

また、本文を読んでいると、unzip-ja なるパッケージがあるそうなので、探してみました。

Re: [opensuse-ja] Re: [opensuse-ja] unzipの 文字化け

ここで紹介されているパッチを適用して、CentOS 5.3 で unzip-ja なるパッケージを作ってみます。個人的な意見なのですが、パッケージ名を unzip-ja とするのはあまりよろしくありません。というのは、別パッケージ扱いになるので、ソースを完全に別管理にする意図も含めてしまいます(メンテナンスのことを考えた場合のお話ですが)。もしくは、コマンド名を unzip-ja に変更して、全く別コマンドとして扱いたいのであれば、パッケージ名を変更するのも理解できます。
しかしながら、紹介されているパッチがどのようなものか全く見ていませんが、本来は、オリジナルの動作に影響を与えない(互換性を確保した)パッチを作成して、unzip の別リリースバージョンとして提供するのが理想的です。そして、良いものであれば upstream にマージするように働きかければ良いと思います。

閑話休題。従って、正しくは CentOS 5.3 の unzip-ja でなく、unzip の ja リリースの作成方法です。

# lsb_release -a
LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.3 (Final)
Release:        5.3
Codename:       Final

ソースとパッチをダウンロードします
# wget http://mirror.centos.org/centos/5/os/SRPMS/unzip-5.52-3.el5.src.rpm
# wget 'http://ebuild.gentoo.gr.jp/open.php?mode=download&type=files&cat=app-arch&app=unzip&arg=unzip-5.52-ubuntuja.patch&visible=' -O unzip-5.52-sjis.patch
# ls
unzip-5.52-3.el5.src.rpm  unzip-5.52-sjis.patch

ビルドするために、環境を整えます
# rpm -ivh unzip-5.52-3.el5.src.rpm                     
# cp -p unzip-5.52-sjis.patch /usr/src/redhat/SOURCES/
# cd /usr/src/redhat/SPECS/   
# cp -p unzip.spec unzip.spec.orig
# vi unzip.spec
# diff -ur unzip.spec.orig unzip.spec
--- unzip.spec.orig     2009-06-28 10:27:48.000000000 +0900
+++ unzip.spec  2009-06-28 10:32:00.000000000 +0900
@@ -1,7 +1,7 @@
 Summary: A utility for unpacking zip files.
 Name: unzip
 Version: 5.52
-Release: 3%{?dist}
+Release: 3%{?dist}.1ja
 License: BSD
 Group: Applications/Archiving
 Source: ftp://ftp.info-zip.org/pub/infozip/src/unzip552.tar.gz
@@ -14,6 +14,7 @@
 Patch9: unzip-5.52-long-filename.patch
 Patch10: unzip-5.52-open.patch
 Patch11: unzip-5.52-ret.patch
+Patch12: unzip-5.52-sjis.patch
 URL: http://www.info-zip.org/pub/infozip/UnZip.html
 BuildRoot: %{_tmppath}/%{name}-%{version}-root

@@ -39,6 +40,7 @@
 %patch9 -p1 -b .lfn
 %patch10 -p1 -b .open
 %patch11 -p1 -b .ret
+%patch12 -p1 -b .sjis
 ln -s unix/Makefile Makefile

 %build
@@ -59,6 +61,9 @@
 %{_mandir}/*/*

# rpmbuild -ba unzip.spec
# rpm -q unzip
unzip-5.52-3.el5
# rpm -Uvh ../RPMS/i386/unzip-5.52-3.1ja.i386.rpm
準備中...                ########################################### [100%]
   1:unzip                  ########################################### [100%]
# rpm -q unzip
unzip-5.52-3.1ja

ここで作成した src.rpm は以下になります。

unzip-5.52-3.1ja.src.rpm

動作検証をしてみます。Windows7 RC で日本語のディレクトリに日本語のファイルを作成し、Windows の圧縮機能を使って Zip ファイルを作成します。それから、その Zip ファイルを unzip コマンドで解凍してみます。

Shift_JIS パッチの適用前。

# unzip SJISエンコードされたアーカイブ.zip
Archive:  SJISエンコードされたアーカイブ.zip
 extracting: SJIS�+�G���R�[�h�������f�B���N�g��/SJIS�+�G���R�[�h�������t�@�C���+.txt
# ls -lR
.:
合計 8
 drwxr-xr-x 2 root root 4096 2009-06-28 11:38 SJIS?+?G???R?[?h???????f?B???N?g??
 -rwxr--r-- 1 root root  240 2009-06-28 10:39 SJISエンコードされたアーカイブ.zip

./SJIS?+?G???R?[?h???????f?B???N?g??:
合計 0
 -rw-r--r-- 1 root root 0 2009-06-28 10:35 SJIS?+?G???R?[?h???????t?@?C???+.txt

Shift_JIS パッチ適用後。

# unzip SJISエンコードされたアーカイブ.zip
Archive:  SJISエンコードされたアーカイブ.zip
 extracting: SJISエンコードされたディレクトリ/SJISエンコードされたファイル名.txt
# ls -lR
.:
合計 8
 -rwxr--r-- 1 root root  240  6月 28 11:40 SJISエンコードされたアーカイブ.zip
 drwxr-xr-x 2 root root 4096  6月 28 11:40 SJISエンコードされたディレクトリ

./SJISエンコードされたディレクトリ:
合計 0
 -rw-r--r-- 1 root root 0  6月 28 10:35 SJISエンコードされたファイル名.txt