Commit e33cbb9b authored by Robert Speicher's avatar Robert Speicher

Add TreeController and spec

parent 884eb732
# 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
class Tree class Tree
include Linguist::BlobHelper include Linguist::BlobHelper
attr_accessor :path, :tree, :project, :ref attr_accessor :path, :tree, :project, :ref
delegate :contents, delegate :contents,
...@@ -14,8 +14,8 @@ class Tree ...@@ -14,8 +14,8 @@ class Tree
to: :tree to: :tree
def initialize(raw_tree, project, ref = nil, path = nil) def initialize(raw_tree, project, ref = nil, path = nil)
@project, @ref, @path = project, ref, path, @project, @ref, @path = project, ref, path
@tree = if path @tree = if path.present?
raw_tree / path.dup.force_encoding('ascii-8bit') raw_tree / path.dup.force_encoding('ascii-8bit')
else else
raw_tree raw_tree
...@@ -26,6 +26,10 @@ class Tree ...@@ -26,6 +26,10 @@ class Tree
tree.is_a?(Grit::Blob) tree.is_a?(Grit::Blob)
end end
def invalid?
tree.nil?
end
def empty? def empty?
data.blank? data.blank?
end end
......
require 'spec_helper'
describe TreeController do
let(:project) { create(:project) }
let(:user) { create(:user) }
before do
sign_in(user)
project.add_access(user, :read, :admin)
project.stub(:branches).and_return(['master', 'foo/bar/baz'])
project.stub(:tags).and_return(['v1.0.0', 'v2.0.0'])
controller.instance_variable_set(:@project, project)
end
describe "GET show" do
# Make sure any errors accessing the tree in our views bubble up to this spec
render_views
before { get :show, project_id: project.code, id: id }
context "valid branch, no path" do
let(:id) { 'master' }
it { should respond_with(:success) }
end
context "valid branch, valid path" do
let(:id) { 'master/README.md' }
it { should respond_with(:success) }
end
context "valid branch, invalid path" do
let(:id) { 'master/invalid-path.rb' }
it { should respond_with(:not_found) }
end
context "invalid branch, valid path" do
let(:id) { 'invalid-branch/README.md' }
it { should respond_with(:not_found) }
end
end
end
...@@ -28,6 +28,7 @@ RSpec.configure do |config| ...@@ -28,6 +28,7 @@ RSpec.configure do |config|
config.include LoginHelpers, type: :request config.include LoginHelpers, type: :request
config.include GitoliteStub config.include GitoliteStub
config.include FactoryGirl::Syntax::Methods config.include FactoryGirl::Syntax::Methods
config.include Devise::TestHelpers, type: :controller
# If you're not using ActiveRecord, or you'd prefer not to run each of your # If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false # examples within a transaction, remove the following line or assign false
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment