Skip to content

Commit

Permalink
Merge pull request #1105 from kmuto/init-from-net
Browse files Browse the repository at this point in the history
review-initへのアーカイブロード展開の機能の追加
  • Loading branch information
takahashim authored Oct 15, 2018
2 parents 1849917 + f4735ad commit 915a811
Showing 1 changed file with 70 additions and 2 deletions.
72 changes: 70 additions & 2 deletions lib/review/init.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

require 'fileutils'
require 'optparse'
require 'net/http'
require 'tempfile'
require 'review'

module ReVIEW
Expand Down Expand Up @@ -38,6 +40,7 @@ def execute(*args)
generate_rakefile(dir)
generate_gemfile(dir)
generate_doc(dir) unless @without_doc
download_and_extract_archive(dir, @archive) if @archive
end
end

Expand All @@ -58,12 +61,15 @@ def parse_options(args)
opts.on('--latex-template name', 'specify LaTeX template name. (default: review-jsbook)') do |tname|
@template = tname
end
opts.on('', '--epub-version VERSION', 'define EPUB version') do |version|
opts.on('', '--epub-version VERSION', 'define EPUB version.') do |version|
@epub_version = version
end
opts.on('', '--without-doc', "don't generate doc files") do
opts.on('', '--without-doc', "don't generate doc files.") do
@without_doc = true
end
opts.on('-p', '--package archivefile', 'extract from local or network archive.') do |archive|
@archive = archive
end

begin
opts.parse!(args)
Expand Down Expand Up @@ -190,5 +196,67 @@ def generate_doc(dir)
md_files = Dir.glob(@review_dir + '/doc/*.md').map.to_a
FileUtils.cp md_files, docdir
end

def download_and_extract_archive(dir, filename)
begin
require 'zip'
rescue LoadError
@logger.error 'extracting needs rubyzip.'
exit 1
end

if filename =~ %r{\Ahttps?://}
begin
@logger.info "Downloading from #{filename}"
zipdata = Net::HTTP.get(URI.parse(filename))
rescue StandardError => err
@logger.error "Failed to download #{filename}: #{err.message}"
exit 1
end

begin
f = Tempfile.new('reviewinit')
zipfilename = f.path
f.write zipdata
f.close

extract_archive(dir, zipfilename, filename)
ensure
f.unlink
end
else
unless File.readable?(filename)
@logger.error "Failed to open #{filename}"
exit 1
end
extract_archive(dir, filename, filename)
end
end

def extract_archive(dir, filename, originalfilename)
made = nil
begin
Zip::File.open(filename) do |zip|
zip.each do |entry|
fname = entry.name.gsub('\\', '/')
if fname =~ /__MACOSX/ || fname =~ /\.DS_Store/
next
end

if fname =~ %r{\A/} || fname =~ /\.\./ # simple fool proof
made = nil
break
end

# `true' means override
entry.extract(File.join(dir, fname)) { true }
end
made = true
end
raise Zip::Error unless made
rescue Zip::Error => err
@logger.error "#{originalfilename} seems invalid or broken zip file: #{err.message}"
end
end
end
end

0 comments on commit 915a811

Please sign in to comment.