From 398ba6f1bb60f176444dedc7b26188e08b920f54 Mon Sep 17 00:00:00 2001
From: Robert Speicher <rspeicher@gmail.com>
Date: Mon, 17 Sep 2012 14:24:31 -0400
Subject: [PATCH] DRY up Blame, Blob and Tree controllers

---
 app/controllers/blame_controller.rb | 27 ++-------------------------
 app/controllers/blob_controller.rb  | 24 +-----------------------
 app/controllers/tree_controller.rb  | 29 ++++++-----------------------
 app/views/tree/show.html.haml       |  2 +-
 app/views/tree/show.js.haml         |  2 +-
 lib/ref_extractor.rb                | 27 +++++++++++++++++++++++++++
 6 files changed, 38 insertions(+), 73 deletions(-)

diff --git a/app/controllers/blame_controller.rb b/app/controllers/blame_controller.rb
index d159a83c8cb..dd5be6dcd58 100644
--- a/app/controllers/blame_controller.rb
+++ b/app/controllers/blame_controller.rb
@@ -1,7 +1,5 @@
 # Controller for viewing a file's blame
 class BlameController < ApplicationController
-  # Thrown when given an invalid path
-  class InvalidPathError < StandardError; end
 
   include RefExtractor
 
@@ -15,31 +13,10 @@ class BlameController < ApplicationController
   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
diff --git a/app/controllers/blob_controller.rb b/app/controllers/blob_controller.rb
index bb051281013..58e70bc9d04 100644
--- a/app/controllers/blob_controller.rb
+++ b/app/controllers/blob_controller.rb
@@ -16,7 +16,7 @@ class BlobController < ApplicationController
   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?
@@ -37,26 +37,4 @@ class BlobController < ApplicationController
       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
diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb
index 15bbb1a3c77..e0dd8f8beaf 100644
--- a/app/controllers/tree_controller.rb
+++ b/app/controllers/tree_controller.rb
@@ -15,35 +15,18 @@ class TreeController < ApplicationController
   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
diff --git a/app/views/tree/show.html.haml b/app/views/tree/show.html.haml
index 181be6426d4..d95f90e0b54 100644
--- a/app/views/tree/show.html.haml
+++ b/app/views/tree/show.html.haml
@@ -1,5 +1,5 @@
 = 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() {
diff --git a/app/views/tree/show.js.haml b/app/views/tree/show.js.haml
index 3d0215ff51f..174e3e03a52 100644
--- a/app/views/tree/show.js.haml
+++ b/app/views/tree/show.js.haml
@@ -1,6 +1,6 @@
 :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}");
 
diff --git a/lib/ref_extractor.rb b/lib/ref_extractor.rb
index d7d446b1e62..b9c0291761d 100644
--- a/lib/ref_extractor.rb
+++ b/lib/ref_extractor.rb
@@ -67,4 +67,31 @@ module RefExtractor
 
     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
-- 
GitLab