From ac97f7e9a2747d56e9e872706d3ab7f664b77dc1 Mon Sep 17 00:00:00 2001 From: Darren Oakley Date: Mon, 9 Jul 2012 10:41:51 +0100 Subject: [PATCH] Make the 'New Page' button create pages in sub directories if the user puts a slash in the path/page name. --- lib/gollum/frontend/app.rb | 19 ++++--- .../public/gollum/javascript/gollum.js | 19 +++---- test/test_app.rb | 51 ++----------------- 3 files changed, 27 insertions(+), 62 deletions(-) diff --git a/lib/gollum/frontend/app.rb b/lib/gollum/frontend/app.rb index 4e0cf4f9..77b31934 100644 --- a/lib/gollum/frontend/app.rb +++ b/lib/gollum/frontend/app.rb @@ -126,17 +126,21 @@ module Precious redirect "/#{page.escaped_url_path}" end - + get '/create/*' do - wiki = Gollum::Wiki.new(settings.gollum_path, settings.wiki_options) - @name = params[:splat].first - if wiki.page(@name) - redirect "/#{CGI.escape(@name)}" + @path = extract_path(params[:splat].first) + @name = extract_name(params[:splat].first) + wiki_options = settings.wiki_options.merge({ :page_file_dir => @path }) + wiki = Gollum::Wiki.new(settings.gollum_path, wiki_options) + + page = wiki.page(@name) + if page + redirect "/#{page.escaped_url_path}" else mustache :create end end - + post '/create' do name = params[:page] path = sanitize_empty_params(params[:path]) @@ -311,7 +315,8 @@ module Precious content_type file.mime_type file.raw_data else - redirect "/create/#{CGI.escape(name)}" + page_path = [path, name].compact.join('/') + redirect "/create/#{CGI.escape(page_path).gsub('%2F','/')}" end end diff --git a/lib/gollum/frontend/public/gollum/javascript/gollum.js b/lib/gollum/frontend/public/gollum/javascript/gollum.js index 3c614dd3..c7ac1fb7 100755 --- a/lib/gollum/frontend/public/gollum/javascript/gollum.js +++ b/lib/gollum/frontend/public/gollum/javascript/gollum.js @@ -101,27 +101,28 @@ $(document).ready(function() { $('#minibutton-new-page').removeClass('jaws'); $('#minibutton-new-page').click(function(e) { e.preventDefault(); + + var path = $(this).data('path'); + if (path) { + path = path + '/'; + } + $.GollumDialog.init({ title: 'Create New Page', fields: [ { id: 'name', name: 'Page Name', - type: 'text' + type: 'text', + defaultValue: path || '' } ], OK: function( res ) { var name = 'New Page'; if ( res['name'] ) { - var name = res['name']; + name = res['name']; } - - var url = ''; - var path = $('#minibutton-new-page').data('path'); - if (path) { - url += '/' + encodeURIComponent(path) - } - window.location = url + '/' + encodeURIComponent(name); + window.location = '/' + encodeURIComponent(name); } }); }); diff --git a/test/test_app.rb b/test/test_app.rb index 5ae94cf7..cf60576d 100644 --- a/test/test_app.rb +++ b/test/test_app.rb @@ -116,12 +116,6 @@ context "Frontend" do assert_equal 'http://example.org/Title-with-spaces', last_response.headers['Location'] get "/Title-with-spaces" assert_match /abc/, last_response.body - - post "/create", :content => 'ghi', :page => 'Title/with/slashes', - :format => 'markdown', :message => 'bar' - assert_equal 'http://example.org/Title-with-slashes', last_response.headers['Location'] - get "/Title-with-slashes" - assert_match /ghi/, last_response.body end test "redirects to create on non-existant page" do @@ -138,7 +132,7 @@ context "Frontend" do follow_redirect! assert_equal "/create/#{name}", last_request.fullpath assert last_response.ok? - end + end test "create redirects to page if already exists" do name = "A" @@ -147,7 +141,7 @@ context "Frontend" do assert_equal "/#{name}", last_request.fullpath assert last_response.ok? end - + test "guards against creation of existing page" do name = "A" post "/create", :content => 'abc', :page => name, @@ -216,41 +210,6 @@ context "Frontend" do end end -# WTF? Surely this test is wrong... -# In this test repo there is already a file called 'bar.md'. -# This SHOULD raise a Duplicate Page error, no? -# context "Frontend with page-file-dir" do -# include Rack::Test::Methods - -# setup do -# @path = cloned_testpath("examples/page_file_dir.git") -# @wiki = Gollum::Wiki.new(@path, { :page_file_dir => "docs" }) -# Precious::App.set(:gollum_path, @path) -# Precious::App.set(:wiki_options, { :page_file_dir => "docs" }) -# end - -# teardown do -# FileUtils.rm_rf(@path) -# end - -# test "open existing parent" do -# get "/" -# assert last_response.ok? - -# post "/create", :content => "asdf", :page => "bar", -# :format => 'markdown' -# follow_redirect! -# assert last_response.ok? - -# # Assert not match. -# assert_equal true, /Duplicate page/.match(last_response.body) == nil -# end - -# def app -# Precious::App -# end -# end - context "Frontend with lotr" do include Rack::Test::Methods @@ -320,10 +279,10 @@ context "Frontend with lotr" do get "/Mordor/Orc" assert_match /big smelly creatures/, last_response.body - post "/create", :content => 'really big smelly creatures', :page => 'Orc/Uruk-hai', + post "/create", :content => 'really big smelly creatures', :page => 'Uruk Hai', :path => 'Mordor', :format => 'markdown', :message => 'oooh, very scary' - assert_equal 'http://example.org/Mordor/Orc-Uruk-hai', last_response.headers['Location'] - get "/Mordor/Orc-Uruk-hai" + assert_equal 'http://example.org/Mordor/Uruk-Hai', last_response.headers['Location'] + get "/Mordor/Uruk-Hai" assert_match /really big smelly creatures/, last_response.body end