Commit fae6eb63535f6136704365692f4c34ccfd6eba67

Authored by Dmitriy Zaporozhets
2 parents 71678f08 1bd28994

Merge branch 'wiki-refactoring' into 'master'

Wiki refactoring

Better names for variables and classes
app/controllers/projects/wikis_controller.rb
  1 +require 'project_wiki'
  2 +
1 3 class Projects::WikisController < Projects::ApplicationController
2 4 before_filter :authorize_read_wiki!
3 5 before_filter :authorize_write_wiki!, only: [:edit, :create, :history]
4 6 before_filter :authorize_admin_wiki!, only: :destroy
5   - before_filter :load_gollum_wiki
  7 + before_filter :load_project_wiki
6 8  
7 9 def pages
8   - @wiki_pages = @gollum_wiki.pages
  10 + @wiki_pages = @project_wiki.pages
9 11 end
10 12  
11 13 def show
12   - @wiki = @gollum_wiki.find_page(params[:id], params[:version_id])
  14 + @page = @project_wiki.find_page(params[:id], params[:version_id])
13 15  
14   - if @wiki
  16 + if @page
15 17 render 'show'
16 18 else
17 19 return render('empty') unless can?(current_user, :write_wiki, @project)
18   - @wiki = WikiPage.new(@gollum_wiki)
19   - @wiki.title = params[:id]
  20 + @page = WikiPage.new(@project_wiki)
  21 + @page.title = params[:id]
20 22  
21 23 render 'edit'
22 24 end
23 25 end
24 26  
25 27 def edit
26   - @wiki = @gollum_wiki.find_page(params[:id])
  28 + @page = @project_wiki.find_page(params[:id])
27 29 end
28 30  
29 31 def update
30   - @wiki = @gollum_wiki.find_page(params[:id])
  32 + @page = @project_wiki.find_page(params[:id])
31 33  
32 34 return render('empty') unless can?(current_user, :write_wiki, @project)
33 35  
34   - if @wiki.update(content, format, message)
35   - redirect_to [@project, @wiki], notice: 'Wiki was successfully updated.'
  36 + if @page.update(content, format, message)
  37 + redirect_to [@project, @page], notice: 'Wiki was successfully updated.'
36 38 else
37 39 render 'edit'
38 40 end
39 41 end
40 42  
41 43 def create
42   - @wiki = WikiPage.new(@gollum_wiki)
  44 + @page = WikiPage.new(@project_wiki)
43 45  
44   - if @wiki.create(wiki_params)
45   - redirect_to project_wiki_path(@project, @wiki), notice: 'Wiki was successfully updated.'
  46 + if @page.create(wiki_params)
  47 + redirect_to project_wiki_path(@project, @page), notice: 'Wiki was successfully updated.'
46 48 else
47 49 render action: "edit"
48 50 end
49 51 end
50 52  
51 53 def history
52   - @wiki = @gollum_wiki.find_page(params[:id])
  54 + @page = @project_wiki.find_page(params[:id])
53 55  
54   - redirect_to(project_wiki_path(@project, :home), notice: "Page not found") unless @wiki
  56 + unless @page
  57 + redirect_to(project_wiki_path(@project, :home), notice: "Page not found")
  58 + end
55 59 end
56 60  
57 61 def destroy
58   - @wiki = @gollum_wiki.find_page(params[:id])
59   - @wiki.delete if @wiki
  62 + @page = @project_wiki.find_page(params[:id])
  63 + @page.delete if @page
  64 +
60 65 redirect_to project_wiki_path(@project, :home), notice: "Page was successfully deleted"
61 66 end
62 67  
... ... @@ -65,12 +70,12 @@ class Projects::WikisController &lt; Projects::ApplicationController
65 70  
66 71 private
67 72  
68   - def load_gollum_wiki
69   - @gollum_wiki = GollumWiki.new(@project, current_user)
  73 + def load_project_wiki
  74 + @project_wiki = ProjectWiki.new(@project, current_user)
70 75  
71 76 # Call #wiki to make sure the Wiki Repo is initialized
72   - @gollum_wiki.wiki
73   - rescue GollumWiki::CouldNotCreateWikiError => ex
  77 + @project_wiki.wiki
  78 + rescue ProjectWiki::CouldNotCreateWikiError => ex
74 79 flash[:notice] = "Could not create Wiki Repository at this time. Please try again later."
75 80 redirect_to @project
76 81 return false
... ... @@ -91,5 +96,4 @@ class Projects::WikisController &lt; Projects::ApplicationController
91 96 def message
92 97 params[:wiki][:message]
93 98 end
94   -
95 99 end
... ...
app/models/gollum_wiki.rb
... ... @@ -1,120 +0,0 @@
1   -class GollumWiki
2   - include Gitlab::ShellAdapter
3   -
4   - MARKUPS = {
5   - "Markdown" => :markdown,
6   - "RDoc" => :rdoc
7   - }
8   -
9   - class CouldNotCreateWikiError < StandardError; end
10   -
11   - # Returns a string describing what went wrong after
12   - # an operation fails.
13   - attr_reader :error_message
14   -
15   - def initialize(project, user = nil)
16   - @project = project
17   - @user = user
18   - end
19   -
20   - def path
21   - @project.path + '.wiki'
22   - end
23   -
24   - def path_with_namespace
25   - @project.path_with_namespace + ".wiki"
26   - end
27   -
28   - def url_to_repo
29   - gitlab_shell.url_to_repo(path_with_namespace)
30   - end
31   -
32   - def ssh_url_to_repo
33   - url_to_repo
34   - end
35   -
36   - def http_url_to_repo
37   - [Gitlab.config.gitlab.url, "/", path_with_namespace, ".git"].join('')
38   - end
39   -
40   - # Returns the Gollum::Wiki object.
41   - def wiki
42   - @wiki ||= begin
43   - Gollum::Wiki.new(path_to_repo)
44   - rescue Gollum::NoSuchPathError
45   - create_repo!
46   - end
47   - end
48   -
49   - def empty?
50   - pages.empty?
51   - end
52   -
53   - # Returns an Array of Gitlab WikiPage instances or an
54   - # empty Array if this Wiki has no pages.
55   - def pages
56   - wiki.pages.map { |page| WikiPage.new(self, page, true) }
57   - end
58   -
59   - # Finds a page within the repository based on a tile
60   - # or slug.
61   - #
62   - # title - The human readable or parameterized title of
63   - # the page.
64   - #
65   - # Returns an initialized WikiPage instance or nil
66   - def find_page(title, version = nil)
67   - if page = wiki.page(title, version)
68   - WikiPage.new(self, page, true)
69   - else
70   - nil
71   - end
72   - end
73   -
74   - def create_page(title, content, format = :markdown, message = nil)
75   - commit = commit_details(:created, message, title)
76   -
77   - wiki.write_page(title, format, content, commit)
78   - rescue Gollum::DuplicatePageError => e
79   - @error_message = "Duplicate page: #{e.message}"
80   - return false
81   - end
82   -
83   - def update_page(page, content, format = :markdown, message = nil)
84   - commit = commit_details(:updated, message, page.title)
85   -
86   - wiki.update_page(page, page.name, format, content, commit)
87   - end
88   -
89   - def delete_page(page, message = nil)
90   - wiki.delete_page(page, commit_details(:deleted, message, page.title))
91   - end
92   -
93   - private
94   -
95   - def create_repo!
96   - if init_repo(path_with_namespace)
97   - Gollum::Wiki.new(path_to_repo)
98   - else
99   - raise CouldNotCreateWikiError
100   - end
101   - end
102   -
103   - def init_repo(path_with_namespace)
104   - gitlab_shell.add_repository(path_with_namespace)
105   - end
106   -
107   - def commit_details(action, message = nil, title = nil)
108   - commit_message = message || default_message(action, title)
109   -
110   - {email: @user.email, name: @user.name, message: commit_message}
111   - end
112   -
113   - def default_message(action, title)
114   - "#{@user.username} #{action} page: #{title}"
115   - end
116   -
117   - def path_to_repo
118   - @path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git")
119   - end
120   -end
app/models/project_wiki.rb 0 → 100644
... ... @@ -0,0 +1,120 @@
  1 +class ProjectWiki
  2 + include Gitlab::ShellAdapter
  3 +
  4 + MARKUPS = {
  5 + "Markdown" => :markdown,
  6 + "RDoc" => :rdoc
  7 + }
  8 +
  9 + class CouldNotCreateWikiError < StandardError; end
  10 +
  11 + # Returns a string describing what went wrong after
  12 + # an operation fails.
  13 + attr_reader :error_message
  14 +
  15 + def initialize(project, user = nil)
  16 + @project = project
  17 + @user = user
  18 + end
  19 +
  20 + def path
  21 + @project.path + '.wiki'
  22 + end
  23 +
  24 + def path_with_namespace
  25 + @project.path_with_namespace + ".wiki"
  26 + end
  27 +
  28 + def url_to_repo
  29 + gitlab_shell.url_to_repo(path_with_namespace)
  30 + end
  31 +
  32 + def ssh_url_to_repo
  33 + url_to_repo
  34 + end
  35 +
  36 + def http_url_to_repo
  37 + [Gitlab.config.gitlab.url, "/", path_with_namespace, ".git"].join('')
  38 + end
  39 +
  40 + # Returns the Gollum::Wiki object.
  41 + def wiki
  42 + @wiki ||= begin
  43 + Gollum::Wiki.new(path_to_repo)
  44 + rescue Gollum::NoSuchPathError
  45 + create_repo!
  46 + end
  47 + end
  48 +
  49 + def empty?
  50 + pages.empty?
  51 + end
  52 +
  53 + # Returns an Array of Gitlab WikiPage instances or an
  54 + # empty Array if this Wiki has no pages.
  55 + def pages
  56 + wiki.pages.map { |page| WikiPage.new(self, page, true) }
  57 + end
  58 +
  59 + # Finds a page within the repository based on a tile
  60 + # or slug.
  61 + #
  62 + # title - The human readable or parameterized title of
  63 + # the page.
  64 + #
  65 + # Returns an initialized WikiPage instance or nil
  66 + def find_page(title, version = nil)
  67 + if page = wiki.page(title, version)
  68 + WikiPage.new(self, page, true)
  69 + else
  70 + nil
  71 + end
  72 + end
  73 +
  74 + def create_page(title, content, format = :markdown, message = nil)
  75 + commit = commit_details(:created, message, title)
  76 +
  77 + wiki.write_page(title, format, content, commit)
  78 + rescue Gollum::DuplicatePageError => e
  79 + @error_message = "Duplicate page: #{e.message}"
  80 + return false
  81 + end
  82 +
  83 + def update_page(page, content, format = :markdown, message = nil)
  84 + commit = commit_details(:updated, message, page.title)
  85 +
  86 + wiki.update_page(page, page.name, format, content, commit)
  87 + end
  88 +
  89 + def delete_page(page, message = nil)
  90 + wiki.delete_page(page, commit_details(:deleted, message, page.title))
  91 + end
  92 +
  93 + private
  94 +
  95 + def create_repo!
  96 + if init_repo(path_with_namespace)
  97 + Gollum::Wiki.new(path_to_repo)
  98 + else
  99 + raise CouldNotCreateWikiError
  100 + end
  101 + end
  102 +
  103 + def init_repo(path_with_namespace)
  104 + gitlab_shell.add_repository(path_with_namespace)
  105 + end
  106 +
  107 + def commit_details(action, message = nil, title = nil)
  108 + commit_message = message || default_message(action, title)
  109 +
  110 + {email: @user.email, name: @user.name, message: commit_message}
  111 + end
  112 +
  113 + def default_message(action, title)
  114 + "#{@user.username} #{action} page: #{title}"
  115 + end
  116 +
  117 + def path_to_repo
  118 + @path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git")
  119 + end
  120 +end
... ...
app/models/wiki_page.rb
... ... @@ -19,7 +19,7 @@ class WikiPage
19 19 validates :title, presence: true
20 20 validates :content, presence: true
21 21  
22   - # The Gitlab GollumWiki instance.
  22 + # The Gitlab ProjectWiki instance.
23 23 attr_reader :wiki
24 24  
25 25 # The raw Gollum::Page instance.
... ... @@ -118,7 +118,7 @@ class WikiPage
118 118 # :content - The raw markup content.
119 119 # :format - Optional symbol representing the
120 120 # content format. Can be any type
121   - # listed in the GollumWiki::MARKUPS
  121 + # listed in the ProjectWiki::MARKUPS
122 122 # Hash.
123 123 # :message - Optional commit message to set on
124 124 # the new page.
... ... @@ -135,7 +135,7 @@ class WikiPage
135 135 #
136 136 # new_content - The raw markup content to replace the existing.
137 137 # format - Optional symbol representing the content format.
138   - # See GollumWiki::MARKUPS Hash for available formats.
  138 + # See ProjectWiki::MARKUPS Hash for available formats.
139 139 # message - Optional commit message to set on the new version.
140 140 #
141 141 # Returns the String SHA1 of the newly created page
... ... @@ -181,5 +181,4 @@ class WikiPage
181 181 end
182 182 @persisted
183 183 end
184   -
185 184 end
... ...
app/services/projects/create_service.rb
... ... @@ -74,8 +74,8 @@ module Projects
74 74 if @project.wiki_enabled?
75 75 begin
76 76 # force the creation of a wiki,
77   - GollumWiki.new(@project, @project.owner).wiki
78   - rescue GollumWiki::CouldNotCreateWikiError => ex
  77 + ProjectWiki.new(@project, @project.owner).wiki
  78 + rescue ProjectWiki::CouldNotCreateWikiError => ex
79 79 # Prevent project observer crash
80 80 # if failed to create wiki
81 81 nil
... ...
app/views/projects/wikis/_form.html.haml
1   -= form_for [@project, @wiki], method: @wiki.persisted? ? :put : :post, html: { class: 'form-horizontal' } do |f|
2   - -if @wiki.errors.any?
  1 += form_for [@project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal' } do |f|
  2 + -if @page.errors.any?
3 3 #error_explanation
4   - %h2= "#{pluralize(@wiki.errors.count, "error")} prohibited this wiki from being saved:"
  4 + %h2= "#{pluralize(@page.errors.count, "error")} prohibited this wiki from being saved:"
5 5 %ul
6   - - @wiki.errors.full_messages.each do |msg|
  6 + - @page.errors.full_messages.each do |msg|
7 7 %li= msg
8 8  
9   - = f.hidden_field :title, value: @wiki.title
  9 + = f.hidden_field :title, value: @page.title
10 10 .form-group
11 11 = f.label :format, class: 'control-label'
12 12 .col-sm-10
13   - = f.select :format, options_for_select(GollumWiki::MARKUPS, {selected: @wiki.format}), {}, class: "form-control"
  13 + = f.select :format, options_for_select(ProjectWiki::MARKUPS, {selected: @page.format}), {}, class: "form-control"
14 14  
15 15 .row
16 16 .col-sm-2
... ... @@ -31,9 +31,9 @@
31 31 .col-sm-10= f.text_field :message, class: 'form-control', rows: 18
32 32  
33 33 .form-actions
34   - - if @wiki && @wiki.persisted?
  34 + - if @page && @page.persisted?
35 35 = f.submit 'Save changes', class: "btn-save btn"
36   - = link_to "Cancel", project_wiki_path(@project, @wiki), class: "btn btn-cancel"
  36 + = link_to "Cancel", project_wiki_path(@project, @page), class: "btn btn-cancel"
37 37 - else
38 38 = f.submit 'Create page', class: "btn-create btn"
39 39 = link_to "Cancel", project_wiki_path(@project, :home), class: "btn btn-cancel"
... ...
app/views/projects/wikis/_main_links.html.haml
1 1 %span.pull-right
2   - - if (@wiki && @wiki.persisted?)
3   - = link_to history_project_wiki_path(@project, @wiki), class: "btn btn-grouped" do
  2 + - if (@page && @page.persisted?)
  3 + = link_to history_project_wiki_path(@project, @page), class: "btn btn-grouped" do
4 4 Page History
5 5 - if can?(current_user, :write_wiki, @project)
6   - = link_to edit_project_wiki_path(@project, @wiki), class: "btn btn-grouped" do
  6 + = link_to edit_project_wiki_path(@project, @page), class: "btn btn-grouped" do
7 7 %i.icon-edit
8 8 Edit
... ...
app/views/projects/wikis/edit.html.haml
... ... @@ -3,11 +3,11 @@
3 3 = render 'main_links'
4 4 %h3.page-title
5 5 Editing -
6   - %span.light #{@wiki.title.titleize}
  6 + %span.light #{@page.title.titleize}
7 7 %hr
8 8 = render 'form'
9 9  
10 10 .pull-right
11   - - if @wiki.persisted? && can?(current_user, :admin_wiki, @project)
12   - = link_to project_wiki_path(@project, @wiki), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-small btn-remove" do
  11 + - if @page.persisted? && can?(current_user, :admin_wiki, @project)
  12 + = link_to project_wiki_path(@project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-small btn-remove" do
13 13 Delete this page
... ...
app/views/projects/wikis/git_access.html.haml
... ... @@ -3,10 +3,10 @@
3 3 .col-sm-6
4 4 %h3.page-title
5 5 Git access for
6   - %strong= @gollum_wiki.path_with_namespace
  6 + %strong= @project_wiki.path_with_namespace
7 7  
8 8 .col-sm-6
9   - = render "shared/clone_panel", project: @gollum_wiki
  9 + = render "shared/clone_panel", project: @project_wiki
10 10  
11 11 .git-empty
12 12 %fieldset
... ... @@ -18,8 +18,8 @@
18 18 %legend Clone Your Wiki:
19 19 %pre.dark
20 20 :preserve
21   - git clone #{ content_tag(:span, default_url_to_repo(@gollum_wiki), class: 'clone')}
22   - cd #{@gollum_wiki.path}
  21 + git clone #{ content_tag(:span, default_url_to_repo(@project_wiki), class: 'clone')}
  22 + cd #{@project_wiki.path}
23 23  
24 24 %legend Start Gollum And Edit Locally:
25 25 %pre.dark
... ...
app/views/projects/wikis/history.html.haml
1 1 = render 'nav'
2 2 %h3.page-title
3 3 %span.light History for
4   - = link_to @wiki.title.titleize, project_wiki_path(@project, @wiki)
  4 + = link_to @page.title.titleize, project_wiki_path(@project, @page)
5 5  
6 6 %table.table
7 7 %thead
... ... @@ -12,11 +12,11 @@
12 12 %th Last updated
13 13 %th Format
14 14 %tbody
15   - - @wiki.versions.each do |version|
  15 + - @page.versions.each do |version|
16 16 - commit = version
17 17 %tr
18 18 %td
19   - = link_to project_wiki_path(@project, @wiki, version_id: commit.id) do
  19 + = link_to project_wiki_path(@project, @page, version_id: commit.id) do
20 20 = commit.short_id
21 21 %td
22 22 = commit_author_link(commit, avatar: true, size: 24)
... ... @@ -26,4 +26,4 @@
26 26 #{time_ago_with_tooltip(version.date)}
27 27 %td
28 28 %strong
29   - = @wiki.page.wiki.page(@wiki.page.name, commit.id).try(:format)
  29 + = @page.page.wiki.page(@page.page.name, commit.id).try(:format)
... ...
app/views/projects/wikis/show.html.haml
1 1 = render 'nav'
2 2 %h3.page-title
3   - = @wiki.title.titleize
  3 + = @page.title.titleize
4 4 = render 'main_links'
5   -- if @wiki.historical?
  5 +- if @page.historical?
6 6 .warning_message
7 7 This is an old version of this page.
8   - You can view the #{link_to "most recent version", project_wiki_path(@project, @wiki)} or browse the #{link_to "history", history_project_wiki_path(@project, @wiki)}.
  8 + You can view the #{link_to "most recent version", project_wiki_path(@project, @page)} or browse the #{link_to "history", history_project_wiki_path(@project, @page)}.
9 9  
10 10 %hr
11 11  
12 12 .wiki-holder
13 13 .wiki
14 14 = preserve do
15   - = render_wiki_content(@wiki)
  15 + = render_wiki_content(@page)
16 16  
17 17 %hr
18 18  
19 19 .wiki-last-edit-by
20   - Last edited by #{commit_author_link(@wiki.commit, avatar: true, size: 16)} #{time_ago_with_tooltip(@wiki.commit.created_at)}
  20 + Last edited by #{commit_author_link(@page.commit, avatar: true, size: 16)} #{time_ago_with_tooltip(@page.commit.created_at)}
... ...
features/steps/project/wiki.rb
1   -class ProjectWiki < Spinach::FeatureSteps
  1 +class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
2 2 include SharedAuthentication
3 3 include SharedProject
4 4 include SharedNote
... ... @@ -16,7 +16,7 @@ class ProjectWiki &lt; Spinach::FeatureSteps
16 16 end
17 17  
18 18 Given 'I create the Wiki Home page' do
19   - fill_in "Content", with: '[link test](test)'
  19 + fill_in "wiki_content", with: '[link test](test)'
20 20 click_on "Create page"
21 21 end
22 22  
... ... @@ -87,6 +87,6 @@ class ProjectWiki &lt; Spinach::FeatureSteps
87 87 end
88 88  
89 89 def wiki
90   - @gollum_wiki = GollumWiki.new(project, current_user)
  90 + @project_wiki = ProjectWiki.new(project, current_user)
91 91 end
92 92 end
... ...
lib/backup/repository.rb
... ... @@ -24,7 +24,7 @@ module Backup
24 24 puts "[FAILED]".red
25 25 end
26 26  
27   - wiki = GollumWiki.new(project)
  27 + wiki = ProjectWiki.new(project)
28 28  
29 29 if File.exists?(path_to_repo(wiki))
30 30 print " * #{wiki.path_with_namespace} ... "
... ... @@ -59,7 +59,7 @@ module Backup
59 59 puts "[FAILED]".red
60 60 end
61 61  
62   - wiki = GollumWiki.new(project)
  62 + wiki = ProjectWiki.new(project)
63 63  
64 64 if File.exists?(path_to_bundle(wiki))
65 65 print " * #{wiki.path_with_namespace} ... "
... ...
lib/redcarpet/render/gitlab_html.rb
... ... @@ -60,6 +60,8 @@ class Redcarpet::Render::GitlabHTML &lt; Redcarpet::Render::HTML
60 60 end
61 61  
62 62 def is_wiki?
63   - @template.instance_variable_get("@wiki")
  63 + if @template.instance_variable_get("@project_wiki")
  64 + @template.instance_variable_get("@page")
  65 + end
64 66 end
65 67 end
... ...
spec/models/gollum_wiki_spec.rb
... ... @@ -1,211 +0,0 @@
1   -require "spec_helper"
2   -
3   -describe GollumWiki do
4   -
5   - def remove_temp_repo(path)
6   - FileUtils.rm_rf path
7   - end
8   -
9   - def commit_details
10   - commit = {name: user.name, email: user.email, message: "test commit"}
11   - end
12   -
13   - def create_page(name, content)
14   - subject.wiki.write_page(name, :markdown, content, commit_details)
15   - end
16   -
17   - def destroy_page(page)
18   - subject.wiki.delete_page(page, commit_details)
19   - end
20   -
21   - let(:project) { create(:project) }
22   - let(:repository) { project.repository }
23   - let(:user) { project.owner }
24   - let(:gitlab_shell) { Gitlab::Shell.new }
25   -
26   - subject { GollumWiki.new(project, user) }
27   -
28   - before do
29   - create_temp_repo(subject.send(:path_to_repo))
30   - end
31   -
32   - describe "#path_with_namespace" do
33   - it "returns the project path with namespace with the .wiki extension" do
34   - subject.path_with_namespace.should == project.path_with_namespace + ".wiki"
35   - end
36   - end
37   -
38   - describe "#url_to_repo" do
39   - it "returns the correct ssh url to the repo" do
40   - subject.url_to_repo.should == gitlab_shell.url_to_repo(subject.path_with_namespace)
41   - end
42   - end
43   -
44   - describe "#ssh_url_to_repo" do
45   - it "equals #url_to_repo" do
46   - subject.ssh_url_to_repo.should == subject.url_to_repo
47   - end
48   - end
49   -
50   - describe "#http_url_to_repo" do
51   - it "provides the full http url to the repo" do
52   - gitlab_url = Gitlab.config.gitlab.url
53   - repo_http_url = "#{gitlab_url}/#{subject.path_with_namespace}.git"
54   - subject.http_url_to_repo.should == repo_http_url
55   - end
56   - end
57   -
58   - describe "#wiki" do
59   - it "contains a Gollum::Wiki instance" do
60   - subject.wiki.should be_a Gollum::Wiki
61   - end
62   -
63   - before do
64   - Gitlab::Shell.any_instance.stub(:add_repository) do
65   - create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
66   - end
67   - project.stub(:path_with_namespace).and_return("non-existant")
68   - end
69   -
70   - it "creates a new wiki repo if one does not yet exist" do
71   - wiki = GollumWiki.new(project, user)
72   - wiki.create_page("index", "test content").should_not == false
73   -
74   - FileUtils.rm_rf wiki.send(:path_to_repo)
75   - end
76   -
77   - it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
78   - GollumWiki.any_instance.stub(:init_repo).and_return(false)
79   - expect { GollumWiki.new(project, user).wiki }.to raise_exception(GollumWiki::CouldNotCreateWikiError)
80   - end
81   - end
82   -
83   - describe "#empty?" do
84   - context "when the wiki repository is empty" do
85   - before do
86   - Gitlab::Shell.any_instance.stub(:add_repository) do
87   - create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
88   - end
89   - project.stub(:path_with_namespace).and_return("non-existant")
90   - end
91   -
92   - its(:empty?) { should be_true }
93   - end
94   -
95   - context "when the wiki has pages" do
96   - before do
97   - create_page("index", "This is an awesome new Gollum Wiki")
98   - end
99   -
100   - its(:empty?) { should be_false }
101   - end
102   - end
103   -
104   - describe "#pages" do
105   - before do
106   - create_page("index", "This is an awesome new Gollum Wiki")
107   - @pages = subject.pages
108   - end
109   -
110   - after do
111   - destroy_page(@pages.first.page)
112   - end
113   -
114   - it "returns an array of WikiPage instances" do
115   - @pages.first.should be_a WikiPage
116   - end
117   -
118   - it "returns the correct number of pages" do
119   - @pages.count.should == 1
120   - end
121   - end
122   -
123   - describe "#find_page" do
124   - before do
125   - create_page("index page", "This is an awesome Gollum Wiki")
126   - end
127   -
128   - after do
129   - destroy_page(subject.pages.first.page)
130   - end
131   -
132   - it "returns the latest version of the page if it exists" do
133   - page = subject.find_page("index page")
134   - page.title.should == "index page"
135   - end
136   -
137   - it "returns nil if the page does not exist" do
138   - subject.find_page("non-existant").should == nil
139   - end
140   -
141   - it "can find a page by slug" do
142   - page = subject.find_page("index-page")
143   - page.title.should == "index page"
144   - end
145   -
146   - it "returns a WikiPage instance" do
147   - page = subject.find_page("index page")
148   - page.should be_a WikiPage
149   - end
150   - end
151   -
152   - describe "#create_page" do
153   - after do
154   - destroy_page(subject.pages.first.page)
155   - end
156   -
157   - it "creates a new wiki page" do
158   - subject.create_page("test page", "this is content").should_not == false
159   - subject.pages.count.should == 1
160   - end
161   -
162   - it "returns false when a duplicate page exists" do
163   - subject.create_page("test page", "content")
164   - subject.create_page("test page", "content").should == false
165   - end
166   -
167   - it "stores an error message when a duplicate page exists" do
168   - 2.times { subject.create_page("test page", "content") }
169   - subject.error_message.should =~ /Duplicate page:/
170   - end
171   -
172   - it "sets the correct commit message" do
173   - subject.create_page("test page", "some content", :markdown, "commit message")
174   - subject.pages.first.page.version.message.should == "commit message"
175   - end
176   - end
177   -
178   - describe "#update_page" do
179   - before do
180   - create_page("update-page", "some content")
181   - @gollum_page = subject.wiki.paged("update-page")
182   - subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
183   - @page = subject.pages.first.page
184   - end
185   -
186   - after do
187   - destroy_page(@page)
188   - end
189   -
190   - it "updates the content of the page" do
191   - @page.raw_data.should == "some other content"
192   - end
193   -
194   - it "sets the correct commit message" do
195   - @page.version.message.should == "updated page"
196   - end
197   - end
198   -
199   - describe "#delete_page" do
200   - before do
201   - create_page("index", "some content")
202   - @page = subject.wiki.paged("index")
203   - end
204   -
205   - it "deletes the page" do
206   - subject.delete_page(@page)
207   - subject.pages.count.should == 0
208   - end
209   - end
210   -
211   -end
spec/models/project_wiki_spec.rb 0 → 100644
... ... @@ -0,0 +1,211 @@
  1 +require "spec_helper"
  2 +
  3 +describe ProjectWiki do
  4 +
  5 + def remove_temp_repo(path)
  6 + FileUtils.rm_rf path
  7 + end
  8 +
  9 + def commit_details
  10 + commit = {name: user.name, email: user.email, message: "test commit"}
  11 + end
  12 +
  13 + def create_page(name, content)
  14 + subject.wiki.write_page(name, :markdown, content, commit_details)
  15 + end
  16 +
  17 + def destroy_page(page)
  18 + subject.wiki.delete_page(page, commit_details)
  19 + end
  20 +
  21 + let(:project) { create(:project) }
  22 + let(:repository) { project.repository }
  23 + let(:user) { project.owner }
  24 + let(:gitlab_shell) { Gitlab::Shell.new }
  25 +
  26 + subject { ProjectWiki.new(project, user) }
  27 +
  28 + before do
  29 + create_temp_repo(subject.send(:path_to_repo))
  30 + end
  31 +
  32 + describe "#path_with_namespace" do
  33 + it "returns the project path with namespace with the .wiki extension" do
  34 + subject.path_with_namespace.should == project.path_with_namespace + ".wiki"
  35 + end
  36 + end
  37 +
  38 + describe "#url_to_repo" do
  39 + it "returns the correct ssh url to the repo" do
  40 + subject.url_to_repo.should == gitlab_shell.url_to_repo(subject.path_with_namespace)
  41 + end
  42 + end
  43 +
  44 + describe "#ssh_url_to_repo" do
  45 + it "equals #url_to_repo" do
  46 + subject.ssh_url_to_repo.should == subject.url_to_repo
  47 + end
  48 + end
  49 +
  50 + describe "#http_url_to_repo" do
  51 + it "provides the full http url to the repo" do
  52 + gitlab_url = Gitlab.config.gitlab.url
  53 + repo_http_url = "#{gitlab_url}/#{subject.path_with_namespace}.git"
  54 + subject.http_url_to_repo.should == repo_http_url
  55 + end
  56 + end
  57 +
  58 + describe "#wiki" do
  59 + it "contains a Gollum::Wiki instance" do
  60 + subject.wiki.should be_a Gollum::Wiki
  61 + end
  62 +
  63 + before do
  64 + Gitlab::Shell.any_instance.stub(:add_repository) do
  65 + create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
  66 + end
  67 + project.stub(:path_with_namespace).and_return("non-existant")
  68 + end
  69 +
  70 + it "creates a new wiki repo if one does not yet exist" do
  71 + wiki = ProjectWiki.new(project, user)
  72 + wiki.create_page("index", "test content").should_not == false
  73 +
  74 + FileUtils.rm_rf wiki.send(:path_to_repo)
  75 + end
  76 +
  77 + it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
  78 + ProjectWiki.any_instance.stub(:init_repo).and_return(false)
  79 + expect { ProjectWiki.new(project, user).wiki }.to raise_exception(ProjectWiki::CouldNotCreateWikiError)
  80 + end
  81 + end
  82 +
  83 + describe "#empty?" do
  84 + context "when the wiki repository is empty" do
  85 + before do
  86 + Gitlab::Shell.any_instance.stub(:add_repository) do
  87 + create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
  88 + end
  89 + project.stub(:path_with_namespace).and_return("non-existant")
  90 + end
  91 +
  92 + its(:empty?) { should be_true }
  93 + end
  94 +
  95 + context "when the wiki has pages" do
  96 + before do
  97 + create_page("index", "This is an awesome new Gollum Wiki")
  98 + end
  99 +
  100 + its(:empty?) { should be_false }
  101 + end
  102 + end
  103 +
  104 + describe "#pages" do
  105 + before do
  106 + create_page("index", "This is an awesome new Gollum Wiki")
  107 + @pages = subject.pages
  108 + end
  109 +
  110 + after do
  111 + destroy_page(@pages.first.page)
  112 + end
  113 +
  114 + it "returns an array of WikiPage instances" do
  115 + @pages.first.should be_a WikiPage
  116 + end
  117 +
  118 + it "returns the correct number of pages" do
  119 + @pages.count.should == 1
  120 + end
  121 + end
  122 +
  123 + describe "#find_page" do
  124 + before do
  125 + create_page("index page", "This is an awesome Gollum Wiki")
  126 + end
  127 +
  128 + after do
  129 + destroy_page(subject.pages.first.page)
  130 + end
  131 +
  132 + it "returns the latest version of the page if it exists" do
  133 + page = subject.find_page("index page")
  134 + page.title.should == "index page"
  135 + end
  136 +
  137 + it "returns nil if the page does not exist" do
  138 + subject.find_page("non-existant").should == nil
  139 + end
  140 +
  141 + it "can find a page by slug" do
  142 + page = subject.find_page("index-page")
  143 + page.title.should == "index page"
  144 + end
  145 +
  146 + it "returns a WikiPage instance" do
  147 + page = subject.find_page("index page")
  148 + page.should be_a WikiPage
  149 + end
  150 + end
  151 +
  152 + describe "#create_page" do
  153 + after do
  154 + destroy_page(subject.pages.first.page)
  155 + end
  156 +
  157 + it "creates a new wiki page" do
  158 + subject.create_page("test page", "this is content").should_not == false
  159 + subject.pages.count.should == 1
  160 + end
  161 +
  162 + it "returns false when a duplicate page exists" do
  163 + subject.create_page("test page", "content")
  164 + subject.create_page("test page", "content").should == false
  165 + end
  166 +
  167 + it "stores an error message when a duplicate page exists" do
  168 + 2.times { subject.create_page("test page", "content") }
  169 + subject.error_message.should =~ /Duplicate page:/
  170 + end
  171 +
  172 + it "sets the correct commit message" do
  173 + subject.create_page("test page", "some content", :markdown, "commit message")
  174 + subject.pages.first.page.version.message.should == "commit message"
  175 + end
  176 + end
  177 +
  178 + describe "#update_page" do
  179 + before do
  180 + create_page("update-page", "some content")
  181 + @gollum_page = subject.wiki.paged("update-page")
  182 + subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
  183 + @page = subject.pages.first.page
  184 + end
  185 +
  186 + after do
  187 + destroy_page(@page)
  188 + end
  189 +
  190 + it "updates the content of the page" do
  191 + @page.raw_data.should == "some other content"
  192 + end
  193 +
  194 + it "sets the correct commit message" do
  195 + @page.version.message.should == "updated page"
  196 + end
  197 + end
  198 +
  199 + describe "#delete_page" do
  200 + before do
  201 + create_page("index", "some content")
  202 + @page = subject.wiki.paged("index")
  203 + end
  204 +
  205 + it "deletes the page" do
  206 + subject.delete_page(@page)
  207 + subject.pages.count.should == 0
  208 + end
  209 + end
  210 +
  211 +end
... ...
spec/models/wiki_page_spec.rb
... ... @@ -22,7 +22,7 @@ describe WikiPage do
22 22 let(:project) { create(:project) }
23 23 let(:repository) { project.repository }
24 24 let(:user) { project.owner }
25   - let(:wiki) { GollumWiki.new(project, user) }
  25 + let(:wiki) { ProjectWiki.new(project, user) }
26 26  
27 27 subject { WikiPage.new(wiki) }
28 28  
... ...
spec/services/projects/create_service_spec.rb
... ... @@ -42,7 +42,7 @@ describe Projects::CreateService do
42 42 context 'wiki_enabled true creates wiki repository directory' do
43 43 before do
44 44 @project = create_project(@user, @opts)
45   - @path = GollumWiki.new(@project, @user).send(:path_to_repo)
  45 + @path = ProjectWiki.new(@project, @user).send(:path_to_repo)
46 46 end
47 47  
48 48 it { File.exists?(@path).should be_true }
... ... @@ -52,7 +52,7 @@ describe Projects::CreateService do
52 52 before do
53 53 @opts.merge!(wiki_enabled: false)
54 54 @project = create_project(@user, @opts)
55   - @path = GollumWiki.new(@project, @user).send(:path_to_repo)
  55 + @path = ProjectWiki.new(@project, @user).send(:path_to_repo)
56 56 end
57 57  
58 58 it { File.exists?(@path).should be_false }
... ...
spec/support/test_env.rb
... ... @@ -52,7 +52,7 @@ module TestEnv
52 52 def setup_stubs()
53 53 # Use tmp dir for FS manipulations
54 54 repos_path = testing_path()
55   - GollumWiki.any_instance.stub(:init_repo) do |path|
  55 + ProjectWiki.any_instance.stub(:init_repo) do |path|
56 56 create_temp_repo(File.join(repos_path, "#{path}.git"))
57 57 end
58 58  
... ...