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