From b9d9ac82a9d650b659866ea26dcb4e7987f10381 Mon Sep 17 00:00:00 2001
From: Valery Sizov <valery@gitlab.com>
Date: Mon, 2 Feb 2015 21:30:11 -0800
Subject: [PATCH] Commit page: async load branches info

Conflicts:
	config/routes.rb
---
 app/controllers/projects/commit_controller.rb |  8 +++++--
 .../projects/commit/_commit_box.html.haml     | 23 +++++--------------
 app/views/projects/commit/branches.html.haml  | 16 +++++++++++++
 config/routes.rb                              |  8 +++++--
 spec/controllers/commit_controller_spec.rb    |  9 ++++++++
 5 files changed, 43 insertions(+), 21 deletions(-)
 create mode 100644 app/views/projects/commit/branches.html.haml

diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 470efbd2114..96a782bdf7a 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -11,8 +11,6 @@ class Projects::CommitController < Projects::ApplicationController
     return git_not_found! unless @commit
 
     @line_notes = @project.notes.for_commit_id(commit.id).inline
-    @branches = @project.repository.branch_names_contains(commit.id)
-    @tags = @project.repository.tag_names_contains(commit.id)
     @diffs = @commit.diffs
     @note = @project.build_commit_note(commit)
     @notes_count = @project.notes.for_commit_id(commit.id).count
@@ -31,6 +29,12 @@ class Projects::CommitController < Projects::ApplicationController
     end
   end
 
+  def branches
+    @branches = @project.repository.branch_names_contains(commit.id)
+    @tags = @project.repository.tag_names_contains(commit.id)
+    render layout: false
+  end
+
   def commit
     @commit ||= @project.repository.commit(params[:id])
   end
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index b41fb1437f2..dd28a35d41d 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -37,23 +37,8 @@
   - @commit.parents.each do |parent|
     = link_to parent.short_id, project_commit_path(@project, parent)
 
-.commit-info-row
-  - if @branches.any?
-    %span
-      - branch = commit_default_branch(@project, @branches)
-      = link_to(project_tree_path(@project, branch)) do
-        %span.label.label-gray
-          %i.fa.fa-code-fork
-          = branch
-      - if @branches.any? || @tags.any?
-        = link_to("#", class: "js-details-expand") do
-          %span.label.label-gray
-            \...
-        %span.js-details-content.hide
-          - if @branches.any?
-            = commit_branches_links(@project, @branches)
-          - if @tags.any?
-            = commit_tags_links(@project, @tags)
+.commit-info-row.branches
+  %i.fa.fa-spinner.fa-spin
 
 .commit-box
   %h3.commit-title
@@ -61,3 +46,7 @@
   - if @commit.description.present?
     %pre.commit-description
       = preserve(gfm(escape_once(@commit.description)))
+
+:coffeescript
+  $ ->
+    $(".commit-info-row.branches").load("#{branches_project_commit_path(@project, @commit.id)}")
\ No newline at end of file
diff --git a/app/views/projects/commit/branches.html.haml b/app/views/projects/commit/branches.html.haml
new file mode 100644
index 00000000000..b01e806210c
--- /dev/null
+++ b/app/views/projects/commit/branches.html.haml
@@ -0,0 +1,16 @@
+- if @branches.any?
+  %span
+    - branch = commit_default_branch(@project, @branches)
+    = link_to(project_tree_path(@project, branch)) do
+      %span.label.label-gray
+        %i.fa.fa-code-fork
+        = branch
+    - if @branches.any? || @tags.any?
+      = link_to("#", class: "js-details-expand") do
+        %span.label.label-gray
+          \...
+      %span.js-details-content.hide
+        - if @branches.any?
+          = commit_branches_links(@project, @branches)
+        - if @tags.any?
+          = commit_tags_links(@project, @tags)
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index a2d782cf633..512066e5d4e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -228,8 +228,12 @@ Gitlab::Application.routes.draw do
       resources :raw,       only: [:show], constraints: { id: /.+/ }
       resources :tree,      only: [:show], constraints: { id: /.+/, format: /(html|js)/ }
       resource  :avatar,    only: [:show, :destroy]
-      resources :commit,    only: [:show], constraints: { id: /[[:alnum:]]{6,40}/ }
-      resources :commits,   only: [:show], constraints: { id: /(?:[^.]|\.(?!atom$))+/, format: /atom/ }
+
+      resources :commit,    only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} do
+        get :branches, on: :member
+      end
+
+      resources :commits,   only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/}
       resources :compare,   only: [:index, :create]
       resources :blame,     only: [:show], constraints: { id: /.+/ }
       resources :network,   only: [:show], constraints: { id: /(?:[^.]|\.(?!json$))+/, format: /json/ }
diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb
index f5822157ea4..cd8b46d7672 100644
--- a/spec/controllers/commit_controller_spec.rb
+++ b/spec/controllers/commit_controller_spec.rb
@@ -70,4 +70,13 @@ describe Projects::CommitController do
       end
     end
   end
+
+  describe "#branches" do
+    it "contains branch and tags information" do
+      get :branches, project_id: project.to_param, id: commit.id
+
+      expect(assigns(:branches)).to include("master", "feature_conflict")
+      expect(assigns(:tags)).to include("v1.1.0")
+    end
+  end
 end
-- 
2.30.9