summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/helpers/application_helper.rb10
-rw-r--r--app/helpers/tree_helper.rb28
-rw-r--r--app/models/tree.rb20
-rw-r--r--app/views/projects/edit_tree/preview.html.haml2
-rw-r--r--app/views/projects/tree/_readme.html.haml9
-rw-r--r--lib/gitlab/markdown_helper.rb25
-rw-r--r--spec/helpers/tree_helper_spec.rb16
-rw-r--r--spec/lib/gitlab/gitlab_markdown_helper_spec.rb28
8 files changed, 94 insertions, 44 deletions
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c3d89eb1b82..cc49b89191b 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -222,6 +222,16 @@ module ApplicationHelper
def render_markup(file_name, file_content)
GitHub::Markup.render(file_name, file_content).html_safe
+ rescue RuntimeError
+ simple_format(file_content)
+ end
+
+ def markup?(filename)
+ Gitlab::MarkdownHelper.markup?(filename)
+ end
+
+ def gitlab_markdown?(filename)
+ Gitlab::MarkdownHelper.gitlab_markdown?(filename)
end
def spinner(text = nil, visible = false)
diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb
index bde2a60faa9..d815257a4e3 100644
--- a/app/helpers/tree_helper.rb
+++ b/app/helpers/tree_helper.rb
@@ -21,6 +21,16 @@ module TreeHelper
tree.html_safe
end
+ def render_readme(readme)
+ if gitlab_markdown?(readme.name)
+ preserve(markdown(readme.data))
+ elsif markup?(readme.name)
+ render_markup(readme.name, readme.data)
+ else
+ simple_format(readme.data)
+ end
+ end
+
# Return an image icon depending on the file type
#
# type - String type of the tree item; either 'folder' or 'file'
@@ -38,24 +48,6 @@ module TreeHelper
"file_#{hexdigest(content.name)}"
end
- # Public: Determines if a given filename is compatible with GitHub::Markup.
- #
- # filename - Filename string to check
- #
- # Returns boolean
- def markup?(filename)
- filename.downcase.end_with?(*%w(.textile .rdoc .org .creole .wiki .mediawiki
- .rst .adoc .asciidoc .asc))
- end
-
- def gitlab_markdown?(filename)
- filename.downcase.end_with?(*%w(.mdown .md .markdown))
- end
-
- def plain_text_readme? filename
- filename =~ /^README(.txt)?$/i
- end
-
# Simple shortcut to File.join
def tree_join(*args)
File.join(*args)
diff --git a/app/models/tree.rb b/app/models/tree.rb
index ac2183be44b..07c9a825e24 100644
--- a/app/models/tree.rb
+++ b/app/models/tree.rb
@@ -1,4 +1,6 @@
class Tree
+ include Gitlab::MarkdownHelper
+
attr_accessor :entries, :readme, :contribution_guide
def initialize(repository, sha, path = '/')
@@ -6,7 +8,23 @@ class Tree
git_repo = repository.raw_repository
@entries = Gitlab::Git::Tree.where(git_repo, sha, path)
- if readme_tree = @entries.find(&:readme?)
+ available_readmes = @entries.select(&:readme?)
+
+ if available_readmes.count > 0
+ # If there is more than 1 readme in tree, find readme which is supported
+ # by markup renderer.
+ if available_readmes.length > 1
+ supported_readmes = available_readmes.select do |readme|
+ gitlab_markdown?(readme.name) || markup?(readme.name)
+ end
+
+ # Take the first supported readme, or the first available readme, if we
+ # don't support any of them
+ readme_tree = supported_readmes.first || available_readmes.first
+ else
+ readme_tree = available_readmes.first
+ end
+
readme_path = path == '/' ? readme_tree.name : File.join(path, readme_tree.name)
@readme = Gitlab::Git::Blob.find(git_repo, sha, readme_path)
end
diff --git a/app/views/projects/edit_tree/preview.html.haml b/app/views/projects/edit_tree/preview.html.haml
index 340f68cc05c..87ce5dc31d3 100644
--- a/app/views/projects/edit_tree/preview.html.haml
+++ b/app/views/projects/edit_tree/preview.html.haml
@@ -6,7 +6,7 @@
= markdown(@content)
- elsif markup?(@blob.name)
.file-content.wiki
- = raw GitHub::Markup.render(@blob.name, @content)
+ = raw render_markup(@blob.name, @content)
- else
.file-content.code
- unless @diff.empty?
diff --git a/app/views/projects/tree/_readme.html.haml b/app/views/projects/tree/_readme.html.haml
index c066b7102fd..9d0292059d6 100644
--- a/app/views/projects/tree/_readme.html.haml
+++ b/app/views/projects/tree/_readme.html.haml
@@ -3,11 +3,4 @@
%i.icon-file
= readme.name
.wiki
- - if gitlab_markdown?(readme.name)
- = preserve do
- = markdown(readme.data)
- - elsif plain_text_readme?(readme.name)
- %pre.clean
- = readme.data
- - elsif markup?(readme.name)
- = render_markup(readme.name, readme.data)
+ = render_readme(readme)
diff --git a/lib/gitlab/markdown_helper.rb b/lib/gitlab/markdown_helper.rb
new file mode 100644
index 00000000000..abed12fe570
--- /dev/null
+++ b/lib/gitlab/markdown_helper.rb
@@ -0,0 +1,25 @@
+module Gitlab
+ module MarkdownHelper
+ module_function
+
+ # Public: Determines if a given filename is compatible with GitHub::Markup.
+ #
+ # filename - Filename string to check
+ #
+ # Returns boolean
+ def markup?(filename)
+ filename.downcase.end_with?(*%w(.textile .rdoc .org .creole .wiki
+ .mediawiki .rst .adoc .asciidoc .asc))
+ end
+
+ # Public: Determines if a given filename is compatible with
+ # GitLab-flavored Markdown.
+ #
+ # filename - Filename string to check
+ #
+ # Returns boolean
+ def gitlab_markdown?(filename)
+ filename.downcase.end_with?(*%w(.mdown .md .markdown))
+ end
+ end
+end
diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb
deleted file mode 100644
index 872dc2ebf31..00000000000
--- a/spec/helpers/tree_helper_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-require 'spec_helper'
-
-describe TreeHelper do
- describe '#markup?' do
- %w(textile rdoc org creole wiki mediawiki
- rst adoc asciidoc asc).each do |type|
- it "returns true for #{type} files" do
- markup?("README.#{type}").should be_true
- end
- end
-
- it "returns false when given a non-markup filename" do
- markup?('README.rb').should_not be_true
- end
- end
-end
diff --git a/spec/lib/gitlab/gitlab_markdown_helper_spec.rb b/spec/lib/gitlab/gitlab_markdown_helper_spec.rb
new file mode 100644
index 00000000000..540618a5603
--- /dev/null
+++ b/spec/lib/gitlab/gitlab_markdown_helper_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe Gitlab::MarkdownHelper do
+ describe '#markup?' do
+ %w(textile rdoc org creole wiki
+ mediawiki rst adoc asciidoc asc).each do |type|
+ it "returns true for #{type} files" do
+ Gitlab::MarkdownHelper.markup?("README.#{type}").should be_true
+ end
+ end
+
+ it 'returns false when given a non-markup filename' do
+ Gitlab::MarkdownHelper.markup?('README.rb').should_not be_true
+ end
+ end
+
+ describe '#gitlab_markdown?' do
+ %w(mdown md markdown).each do |type|
+ it "returns true for #{type} files" do
+ Gitlab::MarkdownHelper.gitlab_markdown?("README.#{type}").should be_true
+ end
+ end
+
+ it 'returns false when given a non-markdown filename' do
+ Gitlab::MarkdownHelper.gitlab_markdown?('README.rb').should_not be_true
+ end
+ end
+end