First attempt at an "import wiki" script (causes regexp stack overflows in RedCloth 2 on Win32; reason unknown)
This commit is contained in:
parent
9f90f083d7
commit
c1b04185a6
85
script/import_wiki.rb
Normal file
85
script/import_wiki.rb
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
require 'optparse'
|
||||||
|
|
||||||
|
puts 'Instiki import'
|
||||||
|
puts
|
||||||
|
|
||||||
|
ARGV << '-t' << 'tmp-instiki' << '/rails.zip'
|
||||||
|
|
||||||
|
IMPORT_OPTIONS = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
argv_before_parsing_by_import = ARGV.dup
|
||||||
|
|
||||||
|
ARGV.options do |opts|
|
||||||
|
script_name = File.basename($0)
|
||||||
|
opts.banner = "Usage: ruby #{script_name} [options] [import file]"
|
||||||
|
|
||||||
|
opts.separator ''
|
||||||
|
|
||||||
|
opts.on('-w', '--web-address',
|
||||||
|
'Web address to import '
|
||||||
|
) { IMPORT_OPTIONS[:web] }
|
||||||
|
opts.on('-t', '--storage=storage', String,
|
||||||
|
'Makes Instiki use the specified directory for storage.',
|
||||||
|
'Default: ./storage/[port]') { |IMPORT_OPTIONS[:storage]| }
|
||||||
|
|
||||||
|
opts.separator ''
|
||||||
|
|
||||||
|
opts.on('-h', '--help',
|
||||||
|
'Show this help message.') { puts opts; exit }
|
||||||
|
|
||||||
|
opts.parse!
|
||||||
|
end
|
||||||
|
|
||||||
|
raise 'Please specify the import file' if ARGV.empty?
|
||||||
|
import_file = ARGV.last
|
||||||
|
raise "Import file not found: #{import_file}" unless File.file?(import_file)
|
||||||
|
raise "Can not read import file: #{import_file}" unless File.readable?(import_file)
|
||||||
|
|
||||||
|
raise 'Please specify the storage path' unless IMPORT_OPTIONS[:storage]
|
||||||
|
|
||||||
|
INSTIKI_BATCH_JOB = true
|
||||||
|
ARGV.clear
|
||||||
|
argv_before_parsing_by_import.each { |arg| ARGV << arg }
|
||||||
|
|
||||||
|
load "#{File.dirname(__FILE__)}/server"
|
||||||
|
|
||||||
|
wiki = WikiService.instance
|
||||||
|
|
||||||
|
web_address = IMPORT_OPTIONS[:web]
|
||||||
|
|
||||||
|
if web_address.nil?
|
||||||
|
if wiki.webs.empty?
|
||||||
|
puts "Instiki storage at #{IMPORT_OPTIONS[:storage]} is new (no webs)."
|
||||||
|
puts "Creating a new web named 'wiki', without a password"
|
||||||
|
web = wiki.create_web('Wiki', 'wiki')
|
||||||
|
elsif wiki.webs.values.size == 1
|
||||||
|
web = wiki.webs.values.first
|
||||||
|
puts "Instiki storage at #{IMPORT_OPTIONS[:storage]} contains one web, '#{web.address}'."
|
||||||
|
puts "Pages are imported into this web"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
web = wiki.webs[web_address]
|
||||||
|
if web.nil?
|
||||||
|
raise "Instiki storage at #{IMPORT_OPTIONS[:storage]} has no web named '#{web_address}'"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
zip = Zip::ZipInputStream.open(import_file)
|
||||||
|
|
||||||
|
while (entry = zip.get_next_entry) do
|
||||||
|
ext_length = File.extname(entry.name).length
|
||||||
|
page_name = entry.name[0..-(ext_length + 1)]
|
||||||
|
page_content = entry.get_input_stream.read
|
||||||
|
|
||||||
|
puts "Processing page '#{page_name}'"
|
||||||
|
|
||||||
|
if wiki.read_page(web_address, page_name)
|
||||||
|
wiki.revise_page(web.address, page_name, page_content, Time.now, 'Importer')
|
||||||
|
else
|
||||||
|
wiki.write_page(web.address, page_name, page_content, Time.now, 'Importer')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Import finished"
|
Loading…
Reference in a new issue