diff --git a/app/assets/javascripts/tree.js.coffee b/app/assets/javascripts/tree.js.coffee index 47d49abc7a5..37adef70f35 100644 --- a/app/assets/javascripts/tree.js.coffee +++ b/app/assets/javascripts/tree.js.coffee @@ -17,23 +17,21 @@ $ -> "ajax:beforeSend": -> $('.tree_progress').addClass("loading") "ajax:complete": -> $('.tree_progress').removeClass("loading") -# Maintain forward/back history while browsing the file tree + # Maintain forward/back history while browsing the file tree + ((window) -> + History = window.History + $ = window.jQuery + document = window.document -((window) -> - History = window.History - $ = window.jQuery - document = window.document + # Check to see if History.js is enabled for our Browser + unless History.enabled + return false - # Check to see if History.js is enabled for our Browser - unless History.enabled - return false + $('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live 'click', (e) -> + History.pushState(null, null, $(@).attr('href')) + return false - $ -> - $('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live 'click', (e) -> - History.pushState(null, null, $(@).attr('href')) - return false - - History.Adapter.bind window, 'statechange', -> - state = History.getState() - window.ajaxGet(state.url) -)(window) + History.Adapter.bind window, 'statechange', -> + state = History.getState() + window.ajaxGet(state.url) + )(window) diff --git a/app/decorators/tree_decorator.rb b/app/decorators/tree_decorator.rb index eb3859a990e..c12227afb5d 100644 --- a/app/decorators/tree_decorator.rb +++ b/app/decorators/tree_decorator.rb @@ -8,14 +8,14 @@ class TreeDecorator < ApplicationDecorator #parts = parts[0...-1] if is_blob? - yield(h.link_to("..", "#", remote: true)) if parts.count > max_links + yield(h.link_to("..", "#")) if parts.count > max_links parts.each do |part| part_path = File.join(part_path, part) unless part_path.empty? part_path = part if part_path.empty? next unless parts.last(2).include?(part) if parts.count > max_links - yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path)), remote: true)) + yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path)))) end end end diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index 4fe87a25554..0f2b695e0ad 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -67,4 +67,29 @@ module TreeHelper can?(current_user, :push_code, @project) end end + + # Breadcrumb links for a Project and, if applicable, a tree path + def breadcrumbs + return unless @project && @ref + + # Add the root project link and the arrow icon + crumbs = content_tag(:li) do + content_tag(:span, nil, class: 'arrow') + + link_to(@project.name, project_commits_path(@project, @ref)) + end + + if @path + parts = @path.split('/') + + parts.each_with_index do |part, i| + crumbs += content_tag(:span, '/', class: 'divider') + crumbs += content_tag(:li) do + # The text is just the individual part, but the link needs all the parts before it + link_to part, project_commits_path(@project, tree_join(@ref, parts[0..i].join('/'))) + end + end + end + + crumbs.html_safe + end end diff --git a/app/views/commits/show.html.haml b/app/views/commits/show.html.haml index ac0636382f5..9451a038df0 100644 --- a/app/views/commits/show.html.haml +++ b/app/views/commits/show.html.haml @@ -2,14 +2,7 @@ - if @path.present? %ul.breadcrumb - %li - %span.arrow - = link_to project_commits_path(@project) do - = @project.name - %span.divider - \/ - %li - %a{href: "#"}= @path.split("/").join(" / ") + = breadcrumbs %div{id: dom_id(@project)} #commits_list= render "commits" diff --git a/features/project/commits/commits.feature b/features/project/commits/commits.feature index df795ef71e6..f5a11048b2a 100644 --- a/features/project/commits/commits.feature +++ b/features/project/commits/commits.feature @@ -19,3 +19,7 @@ Feature: Project Browse commits Given I visit compare refs page And I fill compare fields with refs Then I see compared refs + + Scenario: I browse commits for a specific path + Given I visit my project's commits page for a specific path + Then I see breadcrumb links diff --git a/features/steps/project/project_browse_commits.rb b/features/steps/project/project_browse_commits.rb index cb5cabe98b3..036b6297337 100644 --- a/features/steps/project/project_browse_commits.rb +++ b/features/steps/project/project_browse_commits.rb @@ -42,4 +42,13 @@ class ProjectBrowseCommits < Spinach::FeatureSteps page.should have_content "Commits (1)" page.should have_content "Showing 2 changed files" end + + Then 'I see breadcrumb links' do + page.should have_selector('ul.breadcrumb') + page.should have_selector('ul.breadcrumb span.divider', count: 3) + page.should have_selector('ul.breadcrumb a', count: 4) + + find('ul.breadcrumb li:first a')['href'].should match(/#{@project.path}\/commits\/master\z/) + find('ul.breadcrumb li:last a')['href'].should match(%r{master/app/models/project\.rb\z}) + end end diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index 21936f19f47..5ce419d395d 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -121,6 +121,10 @@ module SharedPaths visit project_commits_path(@project, @project.root_ref, {limit: 5}) end + Given "I visit my project's commits page for a specific path" do + visit project_commits_path(@project, @project.root_ref + "/app/models/project.rb", {limit: 5}) + end + Given "I visit my project's network page" do # Stub GraphCommit max_size to speed up test (10 commits vs. 650) Gitlab::GraphCommit.stub(max_count: 10)