OSDN Git Service

DRY up Blame, Blob and Tree controllers
authorRobert Speicher <rspeicher@gmail.com>
Mon, 17 Sep 2012 18:24:31 +0000 (14:24 -0400)
committerRobert Speicher <rspeicher@gmail.com>
Wed, 26 Sep 2012 20:32:22 +0000 (16:32 -0400)
app/controllers/blame_controller.rb
app/controllers/blob_controller.rb
app/controllers/tree_controller.rb
app/views/tree/show.html.haml
app/views/tree/show.js.haml
lib/ref_extractor.rb

index d159a83..dd5be6d 100644 (file)
@@ -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
index bb05128..58e70bc 100644 (file)
@@ -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
index 15bbb1a..e0dd8f8 100644 (file)
@@ -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
index 181be64..d95f90e 100644 (file)
@@ -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() {
index 3d0215f..174e3e0 100644 (file)
@@ -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}");
 
index d7d446b..b9c0291 100644 (file)
@@ -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