diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index c29104216..e46497573 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -1,8 +1,28 @@ +require 'cgi' + class WikiController < ApplicationController + WIKI_OPTIONS = {:page_file_dir => '/', :ref => 'master'} + + load_and_authorize_resource :project + + before_filter :get_wiki + def index + @name = 'Home' + if page = @wiki.page(@name) + @page = page + @content = page.formatted_data + @editable = true + render :show + else + render :new + end end def show + @name = params[:id] + rev = params[:rev] ? params[:rev] : nil + end def edit @@ -15,5 +35,93 @@ class WikiController < ApplicationController end def create + @name = params[:name] + format = params[:format].intern + + begin + @wiki.write_page(@name, format, params[:content], commit_message) + redirect project_wiki_path(@project, @name) + rescue Gollum::DuplicatePageError => e + @message = "Duplicate page: #{@name}" + render :action => :new + end end + + def destroy + end + + def compare + @name = params[:id] + if request.post? + @versions = params[:versions] || [] + if @versions.size < 2 + redirect_to history_project_wiki_path(@project, CGI.escape(@name)) + else + redirect_to compare_versions_project_wiki_path(@project, CGI.escape(@name), + sprintf('%s...%s', @versions.last, @versions.first)) + end + elsif request.get? + @versions = params[:versions].split(/\.{2,3}/) + @page = @wiki.page(@name) + diffs = @wiki.repo.diff(@versions.first, @versions.last, @page.path) + @diff = diffs.first + render :compare + else + redirect_to project_wiki_path(@project, CGI.escape(@name)) + end + end + + def revert + @name = params[:id] + @page = @wiki.page(@name) + sha1 = params[:sha1] + sha2 = params[:sha2] + + if @wiki.revert_page(@page, sha1, sha2, commit_message) + redirect_to project_wiki_path(@project, "#{CGI.escape(@name)}") + else + sha2, sha1 = sha1, "#{sha1}^" if !sha2 + @versions = [sha1, sha2] + diffs = @wiki.repo.diff(@versions.first, @versions.last, @page.path) + @diff = diffs.first + @message = "The patch does not apply." + render :compare + end + end + + def preview + @name = 'Preview' + @page = @wiki.preview_page(@name, params[:content], params[:format]) + @content = @page.formatted_data + @editable = false + render :show + end + + def history + @name = params[:name] + @page = @wiki.page(@name) + @versions = @page.versions :page => params[:page] #try to use will_paginate + end + + def search + @query = params[:q] + @results = @wiki.search @query + @name = @query + end + + def pages + @results = @wiki.pages + @ref = @wiki.ref + end + + protected + + def get_wiki + @wiki = Gollum::Wiki.new(@project.wiki_path, WIKI_OPTIONS.merge(:base_path => project_wiki_path(@project))) + end + + def commit_message + { :message => params[:message] } + end end + diff --git a/config/routes.rb b/config/routes.rb index 9f47fd115..857cbfd1a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -86,6 +86,24 @@ Rosa::Application.routes.draw do resources :projects do resource :repo, :controller => "git/repositories", :only => [:show] + resources :wiki do + collection do +# Uncomment if gollum can revert page without name +# match 'revert/:sha1/:sha2' => 'wiki#revert', :as => :revert, :via => :get, :constrains => {:sha1 => /[0-9a-f]{40}/, :sha2 => /[0-9a-f]{40}/} + + post :preview + get :search + get :pages + end + member do + match 'revert/:sha1/:sha2' => 'wiki#revert', :as => :revert_page, :via => :get + match ':rev' => 'wiki#show', :as => :versioned, :via => :get + + get :history + post :compare + match 'compare/*versions' => 'wiki#compare', :as => :compare_versions, :via => :get + end + end resources :build_lists, :only => [:index, :show] do collection do get :recent