Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows環境でEPUBのコンテンツ生成パスがおかしくなる #1011

Closed
kmuto opened this issue May 15, 2018 · 5 comments
Closed

Windows環境でEPUBのコンテンツ生成パスがおかしくなる #1011

kmuto opened this issue May 15, 2018 · 5 comments

Comments

@kmuto
Copy link
Owner

kmuto commented May 15, 2018

#1008 (comment)

@kmuto
Copy link
Owner Author

kmuto commented May 15, 2018

状況からするとこのあたり。

    def export_zip_rubyzip(epubfile)
      Dir.chdir(tmpdir) do
        Zip::OutputStream.open(epubfile) do |epub|
          root_pathname = Pathname.new(tmpdir)
          epub.put_next_entry('mimetype', nil, nil, Zip::Entry::STORED)
          epub << 'application/epub+zip'

          export_zip_rubyzip_addpath(epub, File.join(tmpdir, 'META-INF'), root_pathname)
          export_zip_rubyzip_addpath(epub, File.join(tmpdir, 'OEBPS'), root_pathname)
          if @config['zip_addpath'].present?
            export_zip_rubyzip_addpath(epub, File.join(tmpdir, @config['zip_addpath']), root_pathname)
          end
        end
      end
    end

    def export_zip_rubyzip_addpath(epub, dirname, rootdir)
      Dir[File.join(dirname, '**', '**')].each do |path|
        next if File.directory?(path)
        relpath = Pathname.new(path).relative_path_from(rootdir)

chdirで入ってカレントになっているはずなのに、relative_path_fromでなぜか../..みたいになってしまう?

ただ、手元のWindows+Ruby 2.5では問題ないので、バージョンなのか環境なのかよくわかりません。

@mitsuo0114
Copy link
Contributor

mitsuo0114 commented May 22, 2019

Windows7で再現されました。

    def export_zip_rubyzip_addpath(epub, dirname, rootdir)
      Dir[File.join(dirname, '**', '**')].each do |path|
        next if File.directory?(path)
        relpath = Pathname.new(path).relative_path_from(rootdir)

ここのpathとrootdir、アウトプットのrelpathを確認したところ、以下のようにWindowsのパスのショートネームとロングネームが混ざっており、relpathが共通パスを検出できなくなっているようです。

path:
C:/Users/takahiro.a.ono/AppData/Local/Temp/d20190522-13176-62lky7/OEBPS/titlepage.xhtml

rootdir
C:/Users/TAKAHI~1.ONO/AppData/Local/Temp/d20190522-13176-62lky7

relpath
../../../../../takahiro.a.ono/AppData/Local/Temp/d20190522-13176-62lky7/OEBPS/titlepage.xhtml

ruby上の解決案としては$SAFE = 1を設定するのがありそうですが、tmpdirの位置を変更するなども候補としては良さそうです。
https://docs.ruby-lang.org/ja/latest/method/Dir/s/tmpdir.html

@kmuto
Copy link
Owner Author

kmuto commented May 22, 2019

うーん、つらい…

本来Ruby Windows版のほうでカバーしてほしい事象なので、Re:VIEW側でOS分岐でなんとかするというのはあまりやりたくない気持ちです。

テンポラリな回避策としては、debug:trueにすれば一時フォルダの位置がプロジェクトフォルダ下になるので、発生しなくなる?

本質的な解決のほうは…tmpdirの位置を変えるというのは気乗りしないですね。Windowsだったら呼び出し前後でSAFE=1とする?(ということってできたっけかな…? 別のWindows Ruby実装ではまた違うみたいな可能性もありそうな。

@mitsuo0114
Copy link
Contributor

mitsuo0114 commented May 22, 2019

mitsuo0114@478f17f

tmpdirからDirで走査するときにショート=>ロング変換されてマッチングできないのが原因なので
tmpdirを生成する段階でロング変換をしてみました。
直し方は微妙ですが一応これで動きました。一つの修正候補としていただければ。

@kmuto
Copy link
Owner Author

kmuto commented May 22, 2019

ありがとうございます!
そもそもこのtmpdirのロジックがよくないのでいずれリファクタリングしようと思いますが、
ひとまずいただいたパッチを入れました(new_tmpdirは1行化しました)。

kmuto added a commit that referenced this issue May 22, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants