From c4b1a5f5ea338d9be6b24f29a562b567b3c2598b Mon Sep 17 00:00:00 2001
From: Marin Jankovski <marin@gitlab.com>
Date: Mon, 28 Apr 2014 16:22:31 +0200
Subject: [PATCH] Allow nested files in wiki.

---
 app/models/project_wiki.rb              |  9 ++++++++-
 app/models/wiki_page.rb                 | 11 ++++++++++-
 app/views/projects/wikis/_new.html.haml |  2 +-
 config/routes.rb                        |  2 +-
 4 files changed, 20 insertions(+), 4 deletions(-)

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..c95b82734ab 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -175,8 +175,17 @@ class WikiPage
   end
 
   def save(method, *args)
+
     if valid? && wiki.send(method, *args)
-      @page = wiki.wiki.paged(title)
+
+      page_details = if method == :update_page
+                       @page.path
+                     else
+                       title
+                     end
+
+      page_title, page_dir = wiki.page_title_and_dir(page_details)
+      @page = wiki.wiki.paged(page_title, page_dir)
 
       set_attributes
 
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 f23542cc893..3e32068d8f7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -204,7 +204,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'
-- 
GitLab