summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-05-06 10:21:05 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-05-06 10:21:05 +0000
commite640481625a0d9076572b9431052a179a606e716 (patch)
tree225b516e27f4e0c888ae0e4cff01904384e3f525
parent478d6bd479bd1d25b8b7716b4badcbedacc8bcbf (diff)
parent00cd3ecc44a6c6d29565c95cd5173c8e5de35537 (diff)
downloadgitlab-ce-e640481625a0d9076572b9431052a179a606e716.tar.gz
Merge branch 'files_in_wiki' into 'master'
Add support to show files from wiki repository on wiki pages
-rw-r--r--app/controllers/projects/wikis_controller.rb13
-rw-r--r--app/models/project_wiki.rb9
-rw-r--r--app/models/wiki_page.rb16
-rw-r--r--app/views/projects/wikis/_new.html.haml2
-rw-r--r--config/routes.rb2
-rw-r--r--features/project/wiki.feature17
-rw-r--r--features/steps/project/wiki.rb39
7 files changed, 92 insertions, 6 deletions
diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb
index bcd9e0d5219..496064c9a65 100644
--- a/app/controllers/projects/wikis_controller.rb
+++ b/app/controllers/projects/wikis_controller.rb
@@ -12,9 +12,22 @@ class Projects::WikisController < Projects::ApplicationController
def show
@page = @project_wiki.find_page(params[:id], params[:version_id])
+ gollum_wiki = @project_wiki.wiki
+ file = gollum_wiki.file(params[:id], gollum_wiki.ref, true)
if @page
render 'show'
+ elsif file
+ if file.on_disk?
+ send_file file.on_disk_path, disposition: 'inline'
+ else
+ send_data(
+ file.raw_data,
+ type: file.mime_type,
+ disposition: 'inline',
+ filename: file.name
+ )
+ end
else
return render('empty') unless can?(current_user, :write_wiki, @project)
@page = WikiPage.new(@project_wiki)
diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb
index 163302a18f7..08a52782475 100644
--- a/app/models/project_wiki.rb
+++ b/app/models/project_wiki.rb
@@ -64,7 +64,8 @@ class ProjectWiki
#
# Returns an initialized WikiPage instance or nil
def find_page(title, version = nil)
- if page = wiki.page(title, version)
+ page_title, page_dir = page_title_and_dir(title)
+ if page = wiki.page(page_title, version, page_dir)
WikiPage.new(self, page, true)
else
nil
@@ -90,6 +91,12 @@ class ProjectWiki
wiki.delete_page(page, commit_details(:deleted, message, page.title))
end
+ def page_title_and_dir(title)
+ title_array = title.split("/")
+ title = title_array.pop
+ [title.gsub(/\.[^.]*$/, ""), title_array.join("/")]
+ end
+
private
def create_repo!
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 76f311ed0b4..b8a0a9eb58b 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -175,14 +175,24 @@ class WikiPage
end
def save(method, *args)
- if valid? && wiki.send(method, *args)
- @page = wiki.wiki.paged(title)
+ project_wiki = wiki
+ if valid? && project_wiki.send(method, *args)
+
+ page_details = if method == :update_page
+ @page.path
+ else
+ title
+ end
+
+ page_title, page_dir = project_wiki.page_title_and_dir(page_details)
+ gollum_wiki = project_wiki.wiki
+ @page = gollum_wiki.paged(page_title, page_dir)
set_attributes
@persisted = true
else
- errors.add(:base, wiki.error_message) if wiki.error_message
+ errors.add(:base, project_wiki.error_message) if project_wiki.error_message
@persisted = false
end
@persisted
diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml
index 8cb7fa8aa0b..1ce292a02df 100644
--- a/app/views/projects/wikis/_new.html.haml
+++ b/app/views/projects/wikis/_new.html.haml
@@ -9,6 +9,6 @@
%span Page slug
= text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => project_wikis_path(@project)
%p.hint
- Please don't use spaces and slashes
+ Please don't use spaces.
.modal-footer
= link_to 'Build', '#', class: 'build-new-wiki btn btn-create'
diff --git a/config/routes.rb b/config/routes.rb
index 910c9ec2393..7a33686b810 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -206,7 +206,7 @@ Gitlab::Application.routes.draw do
end
end
- resources :wikis, only: [:show, :edit, :destroy, :create], constraints: {id: /[a-zA-Z.0-9_\-]+/} do
+ resources :wikis, only: [:show, :edit, :destroy, :create], constraints: {id: /[a-zA-Z.0-9_\-\/]+/} do
collection do
get :pages
put ':id' => 'wikis#update'
diff --git a/features/project/wiki.feature b/features/project/wiki.feature
index 90eb2b79c66..41c51f2c42e 100644
--- a/features/project/wiki.feature
+++ b/features/project/wiki.feature
@@ -45,3 +45,20 @@ Feature: Project Wiki
And I browse to that Wiki page
And I click on the "Pages" button
Then I should see the existing page in the pages list
+
+ Scenario: Image in wiki repo shown on the page
+ Given I have an existing Wiki page with images linked on page
+ And I browse to wiki page with images
+ Then Image should be shown on the page
+
+ Scenario: File does not exist in wiki repo
+ Given I have an existing Wiki page with images linked on page
+ And I browse to wiki page with images
+ And I click on image link
+ Then I should see the new wiki page form
+
+ Scenario: File exists in wiki repo
+ Given I have an existing Wiki page with images linked on page
+ And I browse to wiki page with images
+ And I click on existing image link
+ Then I should see the image from wiki repo
diff --git a/features/steps/project/wiki.rb b/features/steps/project/wiki.rb
index a819ee37d7f..3244a5a05af 100644
--- a/features/steps/project/wiki.rb
+++ b/features/steps/project/wiki.rb
@@ -86,6 +86,45 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
page.should have_content @page.title
end
+ Given 'I have an existing Wiki page with images linked on page' do
+ wiki.create_page("pictures", "Look at this [image](image.jpg)\n\n ![image](image.jpg)", :markdown, "first commit")
+ @wiki_page = wiki.find_page("pictures")
+ end
+
+ And 'I browse to wiki page with images' do
+ visit project_wiki_path(project, @wiki_page)
+ end
+
+ And 'I click on existing image link' do
+ file = Gollum::File.new(wiki.wiki)
+ Gollum::Wiki.any_instance.stub(:file).with("image.jpg", "master", true).and_return(file)
+ Gollum::File.any_instance.stub(:mime_type).and_return("image/jpeg")
+ page.should have_link('image', href: "image.jpg")
+ click_on "image"
+ end
+
+ Then 'I should see the image from wiki repo' do
+ url = URI.parse(current_url)
+ url.path.should match("wikis/image.jpg")
+ page.should_not have_xpath('/html') # Page should render the image which means there is no html involved
+ end
+
+ Then 'Image should be shown on the page' do
+ page.should have_xpath("//img[@src=\"image.jpg\"]")
+ end
+
+ And 'I click on image link' do
+ page.should have_link('image', href: "image.jpg")
+ click_on "image"
+ end
+
+ Then 'I should see the new wiki page form' do
+ url = URI.parse(current_url)
+ url.path.should match("wikis/image.jpg")
+ page.should have_content('New Wiki Page')
+ page.should have_content('Editing - image.jpg')
+ end
+
def wiki
@project_wiki = ProjectWiki.new(project, current_user)
end