diff --git a/app/controllers/file_controller.rb b/app/controllers/file_controller.rb
index daa08b49..808322ed 100644
--- a/app/controllers/file_controller.rb
+++ b/app/controllers/file_controller.rb
@@ -94,9 +94,15 @@ class FileController < ApplicationController
page_content = entry.get_input_stream.read
logger.info "Processing page '#{page_name}'"
begin
- if @wiki.read_page(@web.address, page_name)
- logger.info "Page '#{page_name}' already exists. Adding a new revision to it."
- wiki.revise_page(@web.address, page_name, page_content, Time.now, @author)
+ existing_page = @wiki.read_page(@web.address, page_name)
+ if existing_page
+ if existing_page.content == page_content
+ logger.info "Page '#{page_name}' with the same content already exists. Skipping."
+ next
+ else
+ logger.info "Page '#{page_name}' already exists. Adding a new revision to it."
+ wiki.revise_page(@web.address, page_name, page_content, Time.now, @author)
+ end
else
wiki.write_page(@web.address, page_name, page_content, Time.now, @author)
end
diff --git a/app/models/page.rb b/app/models/page.rb
index e827fd51..717bfe83 100644
--- a/app/models/page.rb
+++ b/app/models/page.rb
@@ -21,7 +21,7 @@ class Page
raise Instiki::ValidationError.new(
"You have tried to save page '#{name}' without changing its content")
end
-
+
# A user may change a page, look at it and make some more changes - several times.
# Not to record every such iteration as a new revision, if the previous revision was done
# by the same author, not more than 30 minutes ago, then update the last revision instead of
@@ -33,8 +33,14 @@ class Page
else
@revisions << Revision.new(self, @revisions.length, content, created_at, author)
end
+
+ self.revisions.last.force_rendering
+ # at this point the page may not be inserted in the web yet, and therefore
+ # references to the page itself are rendered as "unresolved". Clearing the cache allows
+ # the page to re-render itself once again, hopefully _after_ it is inserted in the web
+ self.revisions.last.clear_display_cache
- web.refresh_pages_with_references(name) if @revisions.length == 1
+ web.refresh_pages_with_references(@name) if @revisions.length == 1
end
def rollback(revision_number, created_at, author_ip = nil)
@@ -79,14 +85,16 @@ class Page
web.make_link(author, nil, options)
end
- private
- def continous_revision?(created_at, author)
- @revisions.last.author == author && @revisions.last.created_at + 30.minutes > created_at
- end
- # Forward method calls to the current revision, so the page responds to all revision calls
- def method_missing(method_symbol)
- revisions.last.send(method_symbol)
- end
+ private
+
+ def continous_revision?(created_at, author)
+ @revisions.last.author == author && @revisions.last.created_at + 30.minutes > created_at
+ end
+
+ # Forward method calls to the current revision, so the page responds to all revision calls
+ def method_missing(method_symbol)
+ revisions.last.send(method_symbol)
+ end
end
diff --git a/app/models/revision.rb b/app/models/revision.rb
index d9b3f000..95e7cb81 100644
--- a/app/models/revision.rb
+++ b/app/models/revision.rb
@@ -79,5 +79,21 @@ class Revision
def display_content_for_export
WikiContent.new(self, {:mode => :export} )
end
+
+ def force_rendering
+ begin
+ display_content
+ rescue Exception => e
+ ApplicationController.logger.error "Failed rendering page #{@name}"
+ ApplicationController.logger.error e
+ message = e.message.gsub(/\n/, '
')
+ # substitute content with an error message
+ content = <<-EOL
+
Markup engine has failed to render this page, raising the following error:
+#{message}
+ EOL + raise e + end + end end