summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/tree_controller.rb49
-rw-r--r--app/models/tree.rb10
2 files changed, 56 insertions, 3 deletions
diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb
new file mode 100644
index 00000000000..15bbb1a3c77
--- /dev/null
+++ b/app/controllers/tree_controller.rb
@@ -0,0 +1,49 @@
+# Controller for viewing a repository's file structure
+class TreeController < ApplicationController
+ # Thrown when given an invalid path
+ class InvalidPathError < StandardError; end
+
+ include RefExtractor
+
+ layout "project"
+
+ before_filter :project
+
+ # Authorize
+ before_filter :add_project_abilities
+ before_filter :authorize_read_project!
+ before_filter :authorize_code_access!
+ before_filter :require_non_empty_project
+
+ before_filter :define_tree_vars
+
+ def show
+ respond_to do |format|
+ format.html
+ # Disable cache so browser history works
+ format.js { no_cache_headers }
+ end
+ end
+
+ private
+
+ def define_tree_vars
+ @ref, @path = extract_ref(params[:id])
+
+ @id = File.join(@ref, @path)
+ @repo = @project.repo
+ @commit = CommitDecorator.decorate(@project.commit(@ref))
+
+ @tree = Tree.new(@commit.tree, @project, @ref, @path.gsub(/^\//, ''))
+ @tree = TreeDecorator.new(@tree)
+
+ raise InvalidPathError if @tree.invalid?
+
+ @hex_path = Digest::SHA1.hexdigest(@path)
+
+ @history_path = project_tree_path(@project, @id)
+ @logs_path = logs_file_project_ref_path(@project, @ref, @path)
+ rescue NoMethodError, InvalidPathError
+ not_found!
+ end
+end
diff --git a/app/models/tree.rb b/app/models/tree.rb
index d65e50ab817..88e8f2f4663 100644
--- a/app/models/tree.rb
+++ b/app/models/tree.rb
@@ -1,5 +1,5 @@
class Tree
- include Linguist::BlobHelper
+ include Linguist::BlobHelper
attr_accessor :path, :tree, :project, :ref
delegate :contents,
@@ -14,8 +14,8 @@ class Tree
to: :tree
def initialize(raw_tree, project, ref = nil, path = nil)
- @project, @ref, @path = project, ref, path,
- @tree = if path
+ @project, @ref, @path = project, ref, path
+ @tree = if path.present?
raw_tree / path.dup.force_encoding('ascii-8bit')
else
raw_tree
@@ -26,6 +26,10 @@ class Tree
tree.is_a?(Grit::Blob)
end
+ def invalid?
+ tree.nil?
+ end
+
def empty?
data.blank?
end