Skip to content
Snippets Groups Projects
Commit e33cbb9b authored by Robert Speicher's avatar Robert Speicher
Browse files

Add TreeController and spec

parent 884eb732
No related branches found
No related tags found
1 merge request!1568Routing overhaul
# 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
include Linguist::BlobHelper
include Linguist::BlobHelper
attr_accessor :path, :tree, :project, :ref
 
delegate :contents,
Loading
Loading
@@ -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
Loading
Loading
@@ -26,6 +26,10 @@ class Tree
tree.is_a?(Grit::Blob)
end
 
def invalid?
tree.nil?
end
def empty?
data.blank?
end
Loading
Loading
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
Loading
Loading
@@ -28,6 +28,7 @@ RSpec.configure do |config|
config.include LoginHelpers, type: :request
config.include GitoliteStub
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
# examples within a transaction, remove the following line or assign false
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment