Compare commits

...

13 Commits

Author SHA1 Message Date
bootstraponline ce6b0ac095 v2.1.7 2012-08-25 19:21:13 -06:00
bootstraponline 420bb06988 Fix create test. 2012-08-25 18:58:20 -06:00
bootstraponline 20566f8acf Fix #484 2012-08-25 18:54:07 -06:00
bootstraponline 1d5f69704a Clean paths so they start with one slash. 2012-08-25 18:41:13 -06:00
bootstraponline 0da664299e Fix edit. 2012-08-24 13:47:17 -06:00
bootstraponline 6e8fb2b457 Disable exact on edit for now. 2012-08-24 13:38:34 -06:00
bootstraponline d1c72a4ff3 Fix #483 and #481
Exact matching of requested pages

- /page is no longer the same as /a/page
- Deleting /page only deletes /page (before it would delete /a/page instead of /page)
- Edit currently breaks the unit tests if exact matching is enabled
- Fix redirect on create
- Add @giga's checked_dir = '' fix https://github.com/giga/gollum/commit/936958b47324a09c683cb90a2560484b47e09529
- Fix create unit test
2012-08-24 13:35:37 -06:00
bootstraponline 0bf05392e4 Redirect to correct path. #481 2012-08-24 12:26:59 -06:00
bootstraponline 7ecef0c045 Fix #479 2012-08-23 14:11:28 -06:00
bootstraponline 33ca329253 Handle nil slash. 2012-08-23 12:30:08 -06:00
bootstraponline 01fa4770cb Fix page lookup. #473 2012-08-23 12:16:40 -06:00
bootstraponline b76257c49c Restore foward slash. 2012-08-23 11:59:56 -06:00
bootstraponline e2fbf22f38 Fix #473. 2012-08-23 11:51:20 -06:00
9 changed files with 70 additions and 31 deletions
+2 -2
View File
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
s.required_ruby_version = ">= 1.8.7" s.required_ruby_version = ">= 1.8.7"
s.name = 'gollum' s.name = 'gollum'
s.version = '2.1.6' s.version = '2.1.7'
s.date = '2012-08-23' s.date = '2012-08-25'
s.rubyforge_project = 'gollum' s.rubyforge_project = 'gollum'
s.summary = "A simple, Git-powered wiki." s.summary = "A simple, Git-powered wiki."
+1 -1
View File
@@ -22,7 +22,7 @@ require File.expand_path('../gollum/tex', __FILE__)
require File.expand_path('../gollum/web_sequence_diagram', __FILE__) require File.expand_path('../gollum/web_sequence_diagram', __FILE__)
module Gollum module Gollum
VERSION = '2.1.6' VERSION = '2.1.7'
def self.assets_path def self.assets_path
::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__)) ::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__))
+23 -14
View File
@@ -90,19 +90,26 @@ module Precious
redirect File.join(settings.wiki_options[:base_path].to_s, 'Home') redirect File.join(settings.wiki_options[:base_path].to_s, 'Home')
end end
# Removes all slashes from the start of string.
def clean_url url
return url if url.nil?
url.gsub('%2F','/').gsub(/^\/+/,'')
end
# path is set to name if path is nil. # path is set to name if path is nil.
# if path is 'a/b' and a and b are dirs, then # if path is 'a/b' and a and b are dirs, then
# path must have a trailing slash 'a/b/' or # path must have a trailing slash 'a/b/' or
# extract_path will trim path to 'a' # extract_path will trim path to 'a'
# name, path, version # name, path, version
def wiki_page( name, path = nil, version = nil) def wiki_page(name, path = nil, version = nil, exact = true)
path = name if path.nil? path = name if path.nil?
name = extract_name(name) name = extract_name(name)
path = extract_path(path) path = extract_path(path)
path = '/' if exact && path.nil?
wiki = wiki_new wiki = wiki_new
OpenStruct.new(:wiki => wiki, :page => wiki.paged(name, path, version), OpenStruct.new(:wiki => wiki, :page => wiki.paged(name, path, exact, version),
:name => name, :path => path) :name => name, :path => path)
end end
@@ -141,14 +148,14 @@ module Precious
end end
post '/edit/*' do post '/edit/*' do
wikip = wiki_page(CGI.unescape(params[:page]), sanitize_empty_params(params[:path])) path = '/' + clean_url(sanitize_empty_params(params[:path])).to_s
path = wikip.path page_name = CGI.unescape(params[:page])
wiki = wikip.wiki wiki = wiki_new
page = wikip.page page = wiki.paged(page_name, path, exact = true)
rename = params[:rename].to_url if params[:rename] rename = params[:rename].to_url if params[:rename]
name = rename || page.name name = rename || page.name
committer = Gollum::Committer.new(wiki, commit_message) committer = Gollum::Committer.new(wiki, commit_message)
commit = {:committer => committer} commit = {:committer => committer}
update_wiki_page(wiki, page, params[:content], commit, name, params[:format]) update_wiki_page(wiki, page, params[:content], commit, name, params[:format])
update_wiki_page(wiki, page.header, params[:header], commit) if params[:header] update_wiki_page(wiki, page.header, params[:header], commit) if params[:header]
@@ -187,6 +194,7 @@ module Precious
post '/create' do post '/create' do
name = params[:page].to_url name = params[:page].to_url
path = sanitize_empty_params(params[:path]) path = sanitize_empty_params(params[:path])
path = '' if path.nil?
format = params[:format].intern format = params[:format].intern
# write_page is not directory aware so use wiki_options to emulate dir support. # write_page is not directory aware so use wiki_options to emulate dir support.
@@ -195,8 +203,7 @@ module Precious
begin begin
wiki.write_page(name, format, params[:content], commit_message) wiki.write_page(name, format, params[:content], commit_message)
page = wiki.page(name) redirect to("/#{clean_url(CGI.escape(::File.join(path,name)))}")
redirect to("/#{page.escaped_url_path}") unless page.nil?
rescue Gollum::DuplicatePageError => e rescue Gollum::DuplicatePageError => e
@message = "Duplicate page: #{e.message}" @message = "Duplicate page: #{e.message}"
mustache :error mustache :error
@@ -341,7 +348,9 @@ module Precious
path = extract_path(fullpath) path = extract_path(fullpath)
wiki = wiki_new wiki = wiki_new
if page = wiki.paged(name, path) path = '/' if path.nil?
if page = wiki.paged(name, path, exact = true)
@page = page @page = page
@name = name @name = name
@editable = true @editable = true
@@ -354,7 +363,7 @@ module Precious
file.raw_data file.raw_data
else else
page_path = [path, name].compact.join('/') page_path = [path, name].compact.join('/')
redirect to("/create/#{encodeURIComponent(page_path).gsub('%2F','/')}") redirect to("/create/#{clean_url(encodeURIComponent(page_path))}")
end end
end end
@@ -99,13 +99,21 @@ $.save = function( commitMessage ) {
var msg = defaultCommitMessage(); var msg = defaultCommitMessage();
var newLocation = baseUrl; var newLocation = baseUrl;
function clean( str ) {
return str.replace(/^\/+/g, '/');
}
// 'a%2Fb' => a/b // 'a%2Fb' => a/b
if (pathName) { if ( pathName ) {
newLocation += '/' + unescape(pathName); pathName = unescape( pathName );
newLocation += '/' + pathName;
pathName = pathName + '/'; // pathName must end with / pathName = pathName + '/'; // pathName must end with /
pathName = clean( pathName );
} }
newLocation += '/' + pageName; newLocation += '/' + pageName;
newLocation = clean( newLocation );
// if &create=true then handle create instead of edit. // if &create=true then handle create instead of edit.
if ( create ) { if ( create ) {
+13 -3
View File
@@ -228,7 +228,7 @@ module Gollum
if is_preformatted?(data, id) if is_preformatted?(data, id)
data.gsub!(id, "[[#{tag}]]") data.gsub!(id, "[[#{tag}]]")
else else
data.gsub!(id, process_tag(tag)) data.gsub!(id, process_tag(tag).gsub('%2F', '/'))
end end
end end
data data
@@ -441,13 +441,23 @@ module Gollum
# Find a page from a given cname. If the page has an anchor (#) and has # Find a page from a given cname. If the page has an anchor (#) and has
# no match, strip the anchor and try again. # no match, strip the anchor and try again.
# #
# cname - The String canonical page name. # cname - The String canonical page name including path.
# #
# Returns a Gollum::Page instance if a page is found, or an Array of # Returns a Gollum::Page instance if a page is found, or an Array of
# [Gollum::Page, String extra] if a page without the extra anchor data # [Gollum::Page, String extra] if a page without the extra anchor data
# is found. # is found.
def find_page_from_name(cname) def find_page_from_name(cname)
if page = @wiki.page(cname) slash = cname.rindex('/')
unless slash.nil?
name = cname[slash+1..-1]
path = cname[0..slash]
page = @wiki.paged(name, path)
else
page = @wiki.paged(cname, '/')
end
if page
return page return page
end end
if pos = cname.index('#') if pos = cname.index('#')
+6 -4
View File
@@ -327,7 +327,7 @@ module Gollum
# Returns the String canonical name. # Returns the String canonical name.
def self.cname(name, char_white_sub = '-', char_other_sub = '-') def self.cname(name, char_white_sub = '-', char_other_sub = '-')
name.respond_to?(:gsub) ? name.respond_to?(:gsub) ?
name.gsub(%r{\s},char_white_sub).gsub(%r{[/<>+]}, char_other_sub) : name.gsub(%r{\s},char_white_sub).gsub(%r{[<>+]}, char_other_sub) :
'' ''
end end
@@ -372,9 +372,9 @@ module Gollum
# version - The String version ID to find. # version - The String version ID to find.
# #
# Returns a Gollum::Page or nil if the page could not be found. # Returns a Gollum::Page or nil if the page could not be found.
def find(name, version, dir = nil) def find(name, version, dir = nil, exact = false)
map = @wiki.tree_map_for(version.to_s) map = @wiki.tree_map_for(version.to_s)
if page = find_page_in_tree(map, name, dir) if page = find_page_in_tree(map, name, dir, exact)
page.version = version.is_a?(Grit::Commit) ? page.version = version.is_a?(Grit::Commit) ?
version : @wiki.commit_for(version) version : @wiki.commit_for(version)
page.historical = page.version.to_s == version.to_s page.historical = page.version.to_s == version.to_s
@@ -391,12 +391,14 @@ module Gollum
# to be in. The string should # to be in. The string should
# #
# Returns a Gollum::Page or nil if the page could not be found. # Returns a Gollum::Page or nil if the page could not be found.
def find_page_in_tree(map, name, checked_dir = nil) def find_page_in_tree(map, name, checked_dir = nil, exact = false)
return nil if !map || name.to_s.empty? return nil if !map || name.to_s.empty?
if checked_dir = BlobEntry.normalize_dir(checked_dir) if checked_dir = BlobEntry.normalize_dir(checked_dir)
checked_dir.downcase! checked_dir.downcase!
end end
checked_dir = '' if exact && checked_dir.nil?
map.each do |entry| map.each do |entry|
next if entry.name.to_s.empty? next if entry.name.to_s.empty?
next unless checked_dir.nil? || entry.dir.downcase == checked_dir next unless checked_dir.nil? || entry.dir.downcase == checked_dir
+4 -4
View File
@@ -196,9 +196,9 @@ module Gollum
# dir - The directory String relative to the repo. # dir - The directory String relative to the repo.
# #
# Returns a Gollum::Page or nil if no matching page was found. # Returns a Gollum::Page or nil if no matching page was found.
def page(name, version = @ref, dir = nil) def page(name, version = @ref, dir = nil, exact = false)
version = @ref if version.nil? version = @ref if version.nil?
@page_class.new(self).find(name, version, dir) @page_class.new(self).find(name, version, dir, exact)
end end
# Public: Convenience method instead of calling page(name, nil, dir). # Public: Convenience method instead of calling page(name, nil, dir).
@@ -208,8 +208,8 @@ module Gollum
# dir - The directory String relative to the repo. # dir - The directory String relative to the repo.
# #
# Returns a Gollum::Page or nil if no matching page was found. # Returns a Gollum::Page or nil if no matching page was found.
def paged(name, dir = nil, version = @ref) def paged(name, dir = nil, exact = false, version = @ref)
page(name, version, dir) page(name, version, dir, exact)
end end
# Public: Get the static file for a given name. # Public: Get the static file for a given name.
+9
View File
@@ -50,6 +50,14 @@ context "Frontend" do
assert_not_equal page_1.version.sha, page_2.version.sha assert_not_equal page_1.version.sha, page_2.version.sha
end end
test "edit page with slash" do
page_1 = @wiki.page('A')
post "/edit/A", :content => 'abc', :page => 'A', :path => '/////',
:format => page_1.format, :message => 'def'
follow_redirect!
assert last_response.ok?
end
test "edits page header footer and sidebar" do test "edits page header footer and sidebar" do
commits = @wiki.repo.commits('master').size commits = @wiki.repo.commits('master').size
page_1 = @wiki.page('A') page_1 = @wiki.page('A')
@@ -176,6 +184,7 @@ context "Frontend" do
name = "A" name = "A"
post "/create", :content => 'abc', :page => name, post "/create", :content => 'abc', :page => name,
:format => 'markdown', :message => 'def' :format => 'markdown', :message => 'def'
follow_redirect!
assert last_response.ok? assert last_response.ok?
@wiki.clear_cache @wiki.clear_cache
+2 -1
View File
@@ -99,7 +99,8 @@ context "Page" do
test "cname" do test "cname" do
assert_equal "Foo", Gollum::Page.cname("Foo") assert_equal "Foo", Gollum::Page.cname("Foo")
assert_equal "Foo-Bar", Gollum::Page.cname("Foo Bar") assert_equal "Foo-Bar", Gollum::Page.cname("Foo Bar")
assert_equal "Foo---Bar", Gollum::Page.cname("Foo / Bar") # / is now a directory delimiter so it must be preserved
assert_equal "Foo-/-Bar", Gollum::Page.cname("Foo / Bar")
assert_equal "José", Gollum::Page.cname("José") assert_equal "José", Gollum::Page.cname("José")
assert_equal "モルドール", Gollum::Page.cname("モルドール") assert_equal "モルドール", Gollum::Page.cname("モルドール")
end end