# Controller for viewing a file's blame
class BlameController < ApplicationController
- # Thrown when given an invalid path
- class InvalidPathError < StandardError; end
include RefExtractor
before_filter :authorize_code_access!
before_filter :require_non_empty_project
- before_filter :define_tree_vars
+ before_filter :assign_ref_vars
def show
+ @repo = @project.repo
@blame = Grit::Blob.blame(@repo, @commit.id, @path)
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)
- @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
before_filter :authorize_code_access!
before_filter :require_non_empty_project
- before_filter :define_tree_vars
+ before_filter :assign_ref_vars
def show
if @tree.is_blob?
not_found!
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)
- @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
before_filter :authorize_code_access!
before_filter :require_non_empty_project
- before_filter :define_tree_vars
+ before_filter :assign_ref_vars
def show
+ @hex_path = Digest::SHA1.hexdigest(@path)
+
+ @history_path = project_tree_path(@project, @id)
+ @logs_path = logs_file_project_ref_path(@project, @ref, @path)
+
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
= render "head"
-#tree-holder= render partial: "tree", locals: {repo: @repo, commit: @commit, tree: @tree}
+#tree-holder= render partial: "tree", locals: {commit: @commit, tree: @tree}
:javascript
$(function() {
:plain
// Load Files list
- $("#tree-holder").html("#{escape_javascript(render(partial: "tree", locals: {repo: @repo, commit: @commit, tree: @tree}))}");
+ $("#tree-holder").html("#{escape_javascript(render(partial: "tree", locals: {commit: @commit, tree: @tree}))}");
$("#tree-content-holder").show("slide", { direction: "right" }, 150);
$('.project-refs-form #path').val("#{@path}");
pair
end
+
+ # Assigns common instance variables for views working with Git tree-ish objects
+ #
+ # Assignments are:
+ #
+ # - @id - A string representing the joined ref and path
+ # - @ref - A string representing the ref (e.g., the branch, tag, or commit SHA)
+ # - @path - A string representing the filesystem path
+ # - @commit - A CommitDecorator representing the commit from the given ref
+ # - @tree - A TreeDecorator representing the tree at the given ref/path
+ #
+ # Automatically renders `not_found!` if a valid tree could not be resolved
+ # (e.g., when a user inserts an invalid path or ref).
+ def assign_ref_vars
+ @ref, @path = extract_ref(params[:id])
+
+ @id = File.join(@ref, @path)
+
+ @commit = CommitDecorator.decorate(@project.commit(@ref))
+
+ @tree = Tree.new(@commit.tree, @project, @ref, @path)
+ @tree = TreeDecorator.new(@tree)
+
+ raise InvalidPathError if @tree.invalid?
+ rescue NoMethodError, InvalidPathError
+ not_found!
+ end
end