2011年11月19日土曜日

pythonのzipimportは古いzip形式を受け付けないっぽい

何処かで誰かが悩んでいるかもしれない。書いておこう。

gitを使ってて気づいたのですが、git archiveで出力したzipはzipimport出来ません。

具体的には、
git archive --format zipは、Zip Archive data, at least v1.0らしい。
同じ内訳のファイルを、zipコマンドラインで圧縮すると、v2.0になるらしい。

前者は、zipimport出来ません。v2.0でなければ受け付けないようです。

一度 v1.0で作ったファイルは、zipコマンドラインは極力v1.0のまま出力するっぽい。

言い換えると、v1.0からv2.0への変換はやや面倒かも知れない。様ですね。
一旦展開して再圧縮すればもちろん出来ますが、それは「変換」ではないので。

一方、mercurial のarchiveは、v2.0っぽいです。mercurial自身がpythonなので、python自身に都合がよいzipが出来上がるでしょう。掲題の問題に全く気づきませんでしたよ。

そしたらgitは?
ソースを眺めては見ましたが、どうやらzipを直接実装しちゃってる様です。
http://git.kernel.org/?p=git/git.git;a=blob;f=archive-zip.c
これをv2.0対応するのはちょっと骨が折れそうだ。

そういやgithub.comのzipダウンロードはどうなってるのか?と思ったらv1.0でした。
似たようなことをする人は気を付けましょう。

mercurialは?
http://selenic.com/hg/file/e7119b091809/mercurial/archival.py
やっぱりよく判りません:(