Redmine XLS Export Pluginの競合

年頭にXLS Export Pluginのフォーラムで、チケットリストのQUICKリンクでzipファイルが正しく作られないという問題が報告されてました。

調べてみると拡張子はzipなんだけど、実際にはxlsファイルだと判明。。。
ソースを追っていくと以下の部分が該当箇所。
export_nameには出力するファイル名と拡張子が入っています。issues_xlsはxlsファイルの内容で、zipの場合はこの後にrubyzipを使ってzipファイルにする処理があります。
export_name[1] == 'zip'trueだけど、Zip::ZipOutputStream::write_bufferfalseの場合は、現象が起きるルートになります。
issues_xls=issues_to_xls2(@issues, @project, @query, @settings)
    return issues_xls unless export_name[1] == 'zip' && defined?(Zip::ZipOutputStream::write_buffer)


Zip::ZipOutputStream::write_bufferがない?

rubyzipをrequireしているのにZip::ZipOutputStream::write_bufferがないってどういうこと?
いろいろ調べていくと、Redmine DMSF Pluginが入っている場合に起きる事が判明。
DMSF Pluginではrubyzipではなくzipbundlerでインストールしていました

これによってrubyzipzipの両方がgemに入っている状態になります。
どちらのプラグインも、以下のようにしてロードしています。
require 'zip/zip'

しかし、ロードパスの優先順位の関係でzipのほうがrubyzipよりも先に見つかるので、zipがrequireされます。
そして、zipにはZip::ZipOutputStream::write_bufferが含まれていない、というのが原因でした。


調査と対応

XLS Export Pluginだけrubyzipを呼び出す方法とかないのかな?と、いろいろ調べてみたんですが分からず。
rubyzipzipでdiffをとるとrubyzipのほうが包含しているようにみえたので、DMSF Pluginにrubyzip使ってもらえないかとPull-Requestしたら取り込んでもらえました。
いっけんらくちゃくw

#でも、そもそもZip::ZipOutputStream::write_bufferが無い場合にzip拡張子で出すという処理自体にも問題があると思うんですが。。。


コメント

Amazon ad