Skip to content
Snippets Groups Projects
Commit 29be4e0f authored by wendy0402's avatar wendy0402
Browse files

Allow wiki pages to be renamed in the UI

parent 43c01547
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -113,10 +113,10 @@ class ProjectWiki
return false
end
 
def update_page(page, content, format = :markdown, message = nil)
def update_page(page, content:, title: nil, format: :markdown, message: nil)
commit = commit_details(:updated, message, page.title)
 
wiki.update_page(page, page.name, format.to_sym, content, commit)
wiki.update_page(page, title || page.name, format.to_sym, content, commit)
 
update_project_activity
end
Loading
Loading
Loading
Loading
@@ -180,31 +180,50 @@ class WikiPage
#
# Returns the String SHA1 of the newly created page
# or False if the save was unsuccessful.
def create(attr = {})
@attributes.merge!(attr)
def create(attrs = {})
@attributes.merge!(attrs)
 
save :create_page, title, content, format, message
save(page_details: title) do
wiki.create_page(title, content, format, message)
end
end
 
# Updates an existing Wiki Page, creating a new version.
#
# new_content - The raw markup content to replace the existing.
# format - Optional symbol representing the content format.
# See ProjectWiki::MARKUPS Hash for available formats.
# message - Optional commit message to set on the new version.
# last_commit_sha - Optional last commit sha to validate the page unchanged.
# attrs - Hash of attributes to be updated on the page.
# :content - The raw markup content to replace the existing.
# :format - Optional symbol representing the content format.
# See ProjectWiki::MARKUPS Hash for available formats.
# :message - Optional commit message to set on the new version.
# :last_commit_sha - Optional last commit sha to validate the page unchanged.
# :title - The Title to replace existing title
#
# Returns the String SHA1 of the newly created page
# or False if the save was unsuccessful.
def update(new_content, format: :markdown, message: nil, last_commit_sha: nil)
@attributes[:content] = new_content
@attributes[:format] = format
def update(attrs = {})
last_commit_sha = attrs.delete(:last_commit_sha)
if last_commit_sha && last_commit_sha != self.last_commit_sha
raise PageChangedError.new("You are attempting to update a page that has changed since you started editing it.")
end
 
save :update_page, @page, content, format, message
attrs.slice!(:content, :format, :message, :title)
@attributes.merge!(attrs)
page_details =
if title.present? && @page.title != title
title
else
@page.url_path
end
save(page_details: page_details) do
wiki.update_page(
@page,
content: content,
format: format,
message: attrs[:message],
title: title
)
end
end
 
# Destroys the Wiki Page.
Loading
Loading
@@ -236,30 +255,19 @@ class WikiPage
attributes[:format] = @page.format
end
 
def save(method, *args)
saved = false
def save(page_details:)
return unless valid?
 
project_wiki = wiki
if valid? && project_wiki.send(method, *args)
page_details = if method == :update_page
# Use url_path instead of path to omit format extension
@page.url_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)
unless yield
errors.add(:base, wiki.error_message)
return false
end
 
set_attributes
page_title, page_dir = wiki.page_title_and_dir(page_details)
gollum_wiki = wiki.wiki
@page = gollum_wiki.paged(page_title, page_dir)
 
@persisted = true
saved = true
else
errors.add(:base, project_wiki.error_message) if project_wiki.error_message
end
saved
set_attributes
@persisted = errors.blank?
end
end
module WikiPages
class UpdateService < WikiPages::BaseService
def execute(page)
if page.update(@params[:content], format: @params[:format], message: @params[:message], last_commit_sha: @params[:last_commit_sha])
if page.update(@params)
execute_hooks(page, 'update')
end
 
Loading
Loading
Loading
Loading
@@ -3,9 +3,12 @@
= form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form common-note-form prepend-top-default js-quick-submit' } do |f|
= form_errors(@page)
 
= f.hidden_field :title, value: @page.title
- if @page.persisted?
= f.hidden_field :last_commit_sha, value: @page.last_commit_sha
.form-group
.col-sm-12= f.label :title, class: 'control-label-full-width'
.col-sm-12= f.text_field :title, class: 'form-control', value: @page.title
.form-group
.col-sm-12= f.label :format, class: 'control-label-full-width'
.col-sm-12
Loading
Loading
---
title: Allow wiki pages to be renamed in the UI
merge_request: 10069
author: wendy0402
Loading
Loading
@@ -63,7 +63,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
end
 
step 'That page has two revisions' do
@page.update("new content", message: "second commit")
@page.update(content: "new content", message: "second commit")
end
 
step 'I click the History button' do
Loading
Loading
Loading
Loading
@@ -55,7 +55,7 @@ feature 'Projects > Wiki > User updates wiki page' do
scenario 'page has been updated since the user opened the edit page' do
click_link 'Edit'
 
wiki_page.update('Update')
wiki_page.update(content: 'Update')
 
click_button 'Save changes'
 
Loading
Loading
Loading
Loading
@@ -223,7 +223,12 @@ describe ProjectWiki do
before do
create_page("update-page", "some content")
@gollum_page = subject.wiki.paged("update-page")
subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
subject.update_page(
@gollum_page,
content: "some other content",
format: :markdown,
message: "updated page"
)
@page = subject.pages.first.page
end
 
Loading
Loading
@@ -240,7 +245,12 @@ describe ProjectWiki do
end
 
it 'updates project activity' do
subject.update_page(@gollum_page, 'Yet more content', :markdown, 'Updated page again')
subject.update_page(
@gollum_page,
content: 'Yet more content',
format: :markdown,
message: 'Updated page again'
)
 
project.reload
 
Loading
Loading
Loading
Loading
@@ -178,12 +178,12 @@ describe WikiPage do
end
 
it "updates the content of the page" do
@page.update("new content")
@page.update(content: "new content")
@page = wiki.find_page(title)
end
 
it "returns true" do
expect(@page.update("more content")).to be_truthy
expect(@page.update(content: "more content")).to be_truthy
end
end
end
Loading
Loading
@@ -195,29 +195,42 @@ describe WikiPage do
end
 
after do
destroy_page("Update")
destroy_page(@page.title)
end
 
context "with valid attributes" do
it "updates the content of the page" do
@page.update("new content")
new_content = "new content"
@page.update(content: new_content)
@page = wiki.find_page("Update")
expect(@page.content).to eq("new content")
end
it "updates the title of the page" do
new_title = "Index v.1.2.4"
@page.update(title: new_title)
@page = wiki.find_page(new_title)
expect(@page.title).to eq(new_title)
end
 
it "returns true" do
expect(@page.update("more content")).to be_truthy
expect(@page.update(content: "more content")).to be_truthy
end
end
 
context 'with same last commit sha' do
it 'returns true' do
expect(@page.update('more content', last_commit_sha: @page.last_commit_sha)).to be_truthy
expect(@page.update(content: 'more content', last_commit_sha: @page.last_commit_sha)).to be_truthy
end
end
 
context 'with different last commit sha' do
it 'raises exception' do
expect { @page.update('more content', last_commit_sha: 'xxx') }.to raise_error(WikiPage::PageChangedError)
expect { @page.update(content: 'more content', last_commit_sha: 'xxx') }.to raise_error(WikiPage::PageChangedError)
end
end
end
Loading
Loading
@@ -249,7 +262,7 @@ describe WikiPage do
end
 
it "returns an array of all commits for the page" do
3.times { |i| @page.update("content #{i}") }
3.times { |i| @page.update(content: "content #{i}") }
expect(@page.versions.count).to eq(4)
end
end
Loading
Loading
@@ -294,7 +307,7 @@ describe WikiPage do
before do
create_page('Update', 'content')
@page = wiki.find_page('Update')
3.times { |i| @page.update("content #{i}") }
3.times { |i| @page.update(content: "content #{i}") }
end
 
after do
Loading
Loading
@@ -338,7 +351,7 @@ describe WikiPage do
end
 
it 'returns false for updated wiki page' do
updated_wiki_page = original_wiki_page.update("Updated content")
updated_wiki_page = original_wiki_page.update(content: "Updated content")
expect(original_wiki_page).not_to eq(updated_wiki_page)
end
end
Loading
Loading
@@ -360,7 +373,7 @@ describe WikiPage do
it 'is changed after page updated' do
last_commit_sha_before_update = @page.last_commit_sha
 
@page.update("new content")
@page.update(content: "new content")
@page = wiki.find_page("Update")
 
expect(@page.last_commit_sha).not_to eq last_commit_sha_before_update
Loading
Loading
Loading
Loading
@@ -9,7 +9,8 @@ describe WikiPages::UpdateService do
{
content: 'New content for wiki page',
format: 'markdown',
message: 'New wiki message'
message: 'New wiki message',
title: 'New Title'
}
end
 
Loading
Loading
@@ -27,6 +28,7 @@ describe WikiPages::UpdateService do
expect(updated_page.message).to eq(opts[:message])
expect(updated_page.content).to eq(opts[:content])
expect(updated_page.format).to eq(opts[:format].to_sym)
expect(updated_page.title).to eq(opts[:title])
end
 
it 'executes webhooks' do
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment