diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb
index 63b3a988..65a67aa6 100644
--- a/app/controllers/wiki_controller.rb
+++ b/app/controllers/wiki_controller.rb
@@ -5,6 +5,9 @@ require 'zip/zip'
class WikiController < ApplicationController
+ # TODO implement cache sweeping
+ caches_page :show
+
layout 'default', :except => [:rss_feed, :rss_with_content, :rss_with_headlines, :tex, :export_tex, :export_html]
def index
diff --git a/config/environments/production.rb b/config/environments/production.rb
index e5b18783..80c7661f 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,4 +1,3 @@
Dependencies.mechanism = :require
ActionController::Base.consider_all_requests_local = false
-ActionController::Base.perform_caching = false
-
+ActionController::Base.perform_caching = true
diff --git a/lib/chunks/include.rb b/lib/chunks/include.rb
index 370093cc..90dc02a7 100644
--- a/lib/chunks/include.rb
+++ b/lib/chunks/include.rb
@@ -22,16 +22,17 @@ class Include < WikiChunk::WikiReference
private
def get_unmask_text_avoiding_recursion_loops
- if refpage then
- refpage.clear_display_cache
- if refpage.wiki_includes.include?(@content.page_name)
+ if refpage
+ # TODO This way of instantiating a renderer is ugly.
+ renderer = PageRenderer.new(refpage.current_revision)
+ if renderer.wiki_includes.include?(@content.page_name)
# this will break the recursion
@content.delete_chunk(self)
return "Recursive include detected; #{@page_name} --> #{@content.page_name} " +
"--> #{@page_name}\n"
else
- @content.merge_chunks(refpage.display_content)
- return refpage.display_content.pre_rendered
+ @content.merge_chunks(renderer.display_content)
+ return renderer.display_content.pre_rendered
end
else
return "Could not include #{@page_name}\n"
diff --git a/lib/chunks/wiki.rb b/lib/chunks/wiki.rb
index 840f644a..07d74600 100644
--- a/lib/chunks/wiki.rb
+++ b/lib/chunks/wiki.rb
@@ -16,7 +16,7 @@ module WikiChunk
# the referenced page
def refpage
- @content.web.pages[@page_name]
+ @content.web.page(@page_name)
end
end
@@ -45,11 +45,6 @@ module WikiChunk
end
end
- # the referenced page
- def refpage
- @content.web.pages[@page_name]
- end
-
def textile_url?
not @textile_link_suffix.nil?
end
diff --git a/script/import_storage b/script/import_storage
index 2659defd..c257004f 100755
--- a/script/import_storage
+++ b/script/import_storage
@@ -5,6 +5,7 @@ require 'optparse'
OPTIONS = {
:instiki_root => nil,
:storage => nil,
+ :database => 'mysql'
}
ARGV.options do |opts|
@@ -38,6 +39,12 @@ ARGV.options do |opts|
OPTIONS[:outfile] = outfile
end
+ opts.on("-d", "--database {mysql|sqlite|postgres}", String,
+ "Target database (they have slightly different syntax)",
+ "default: mysql") do |database|
+ OPTIONS[:database] = database
+ end
+
opts.separator ""
opts.on_tail("-h", "--help",
@@ -95,15 +102,29 @@ class Revision
end
end
+class Time
+ def ansi
+ strftime('%Y-%m-%d %H:%M:%S')
+ end
+end
+
def sql_insert(table, hash)
output = "INSERT INTO #{table} ("
output << hash.keys.join(", ")
output << ") VALUES ('"
- output << hash.values.map{|v| v.to_s.gsub("'", "\\\\'")}.join("', '")
-
+ output << hash.values.map do |v|
+ case OPTIONS[:database]
+ when 'mysql', 'postgres'
+ v.to_s.gsub("'", "\\\\'")
+ when 'sqlite'
+ v.to_s.gsub("'", "''")
+ else
+ raise "Unsupported database option #{OPTIONS[:database]}"
+ end
+ end.join("', '")
output << "');"
- return output
+ output
end
WikiService.storage_path = OPTIONS[:storage]
@@ -125,34 +146,36 @@ File.open(OPTIONS[:outfile], 'w') { |outfile|
:max_upload_size => web.max_upload_size,
:safe_mode => web.safe_mode,
:brackets_only => web.brackets_only,
+ :created_at => web.pages.values.map { |p| p.revisions.first.created_at }.min.ansi,
+ :updated_at => web.pages.values.map { |p| p.revisions.last.created_at }.max.ansi
})
puts "Web #{web_name} has #{web.pages.keys.size} pages"
web.pages.each_pair do |page_name, page|
outfile.puts sql_insert(:pages, {
- :id => page.object_id,
- :web_id => web.object_id,
- :locked_by => page.locked_by,
- :name => page.name
+ :id => page.object_id,
+ :web_id => web.object_id,
+ :locked_by => page.locked_by,
+ :name => page.name,
+ :created_at => page.revisions.first.created_at.ansi,
+ :updated_at => page.revisions.last.created_at.ansi
})
puts " Page #{page_name} has #{page.revisions.size} revisions"
page.revisions.each_with_index do |rev, i|
+
outfile.puts sql_insert(:revisions, {
- :id => rev.object_id,
- :page_id => page.object_id,
- :content => rev.content,
- :author => rev.author,
- :ip => '0.0.0.0',
+ :id => rev.object_id,
+ :page_id => page.object_id,
+ :content => rev.content,
+ :author => rev.author.to_s,
+ :ip => (rev.author.is_a?(Author) ? rev.author.ip : 'N/A'),
+ :created_at => rev.created_at.ansi,
+ :updated_at => rev.created_at.ansi,
+ :revised_at => rev.created_at.ansi
})
- puts " Revision #{i} created at #{rev.created_at}"
+ puts " Revision #{i} created at #{rev.created_at.ansi}"
end
end
end
-
- ['webs', 'pages', 'revisions'].each do |table|
- outfile.puts "UPDATE #{table} SET created_at = NOW();"
- outfile.puts "UPDATE #{table} SET updated_at = NOW();"
- end
- outfile.puts "UPDATE revisions SET revised_at = NOW();"
}
diff --git a/test/watir/e2e.rb b/test/watir/e2e.rb
index 4aeaf109..95c43d6a 100644
--- a/test/watir/e2e.rb
+++ b/test/watir/e2e.rb
@@ -6,6 +6,11 @@ require 'rexml/document'
INSTIKI_ROOT = File.expand_path(File.dirname(__FILE__) + "/../..")
require(File.expand_path(File.dirname(__FILE__) + "/../../config/environment"))
+# TODO Create tests for:
+# * exporting HTML
+# * exporting markup
+# * include tag
+
# Use instiki/../watir, if such a directory exists; This can be a CVS HEAD version of Watir.
# Otherwise Watir has to be installed in ruby/lib.
$:.unshift INSTIKI_ROOT + '/../watir' if File.exists?(INSTIKI_ROOT + '/../watir/watir.rb')