diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb index ac1c4bc7fd3f2c7ab0cf84cd7bc22dfa16865de1..1bb21857dcf31f6b25062464921b3b16f61188a0 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -2,6 +2,7 @@ class Projects::ForksController < Projects::ApplicationController include ContinueParams + include RendersMemberAccess # Authorize before_action :whitelist_query_limiting, only: [:create] @@ -11,14 +12,16 @@ class Projects::ForksController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def index - base_query = project.forks.includes(:creator) + @total_forks_count = project.forks.size + @public_forks_count = project.forks.public_only.size + @private_forks_count = @total_forks_count - project.forks.public_and_internal_only.size + @internal_forks_count = @total_forks_count - @public_forks_count - @private_forks_count - forks = ForkProjectsFinder.new(project, params: params.merge(search: params[:filter_projects]), current_user: current_user).execute - @total_forks_count = base_query.size - @private_forks_count = @total_forks_count - forks.size - @public_forks_count = @total_forks_count - @private_forks_count + @forks = ForkProjectsFinder.new(project, params: params.merge(search: params[:filter_projects]), current_user: current_user).execute + @forks = @forks.includes(:route, :creator, :group, namespace: [:route, :owner]) + .page(params[:page]) - @forks = forks.page(params[:page]) + prepare_projects_for_rendering(@forks) respond_to do |format| format.html diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml index 0397a7034c780019f6ff073adfeb0701272c2924..8384561891ad2e09478f0c65accc627e065bba7b 100644 --- a/app/views/projects/forks/index.html.haml +++ b/app/views/projects/forks/index.html.haml @@ -1,6 +1,6 @@ .top-area .nav-text - - full_count_title = "#{@public_forks_count} public and #{@private_forks_count} private" + - full_count_title = "#{@public_forks_count} public, #{@internal_forks_count} internal, and #{@private_forks_count} private" #{pluralize(@total_forks_count, 'fork')}: #{full_count_title} .nav-controls diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml index bb05658c719844c68eb326bc02987fdf568a4f89..d70a1631010ad21fb09e1dd5ebd90e465020e05e 100644 --- a/app/views/shared/projects/_list.html.haml +++ b/app/views/shared/projects/_list.html.haml @@ -42,12 +42,6 @@ avatar: avatar, stars: stars, css_class: css_class, ci: ci, use_creator_avatar: use_creator_avatar, forks: forks, show_last_commit_as_description: show_last_commit_as_description, user: user, merge_requests: merge_requests, issues: issues, pipeline_status: pipeline_status, compact_mode: compact_mode - - - if @private_forks_count && @private_forks_count > 0 - %li.project-row.private-forks-notice - = icon('lock fw', base: 'circle', class: 'fa-lg private-fork-icon') - %strong= pluralize(@private_forks_count, 'private fork') - %span  you have no access to. = paginate_collection(projects, remote: remote) unless skip_pagination - else - if @contributed_projects diff --git a/spec/controllers/projects/forks_controller_spec.rb b/spec/controllers/projects/forks_controller_spec.rb index 5ac5279e997ec0964238e3df4d3982e4d1486e2e..80b5eb9a7ee7620ebfa52fcc7b41af37d182b000 100644 --- a/spec/controllers/projects/forks_controller_spec.rb +++ b/spec/controllers/projects/forks_controller_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' describe Projects::ForksController do let(:user) { create(:user) } let(:project) { create(:project, :public, :repository) } - let(:forked_project) { Projects::ForkService.new(project, user).execute } + let(:forked_project) { Projects::ForkService.new(project, user, name: 'Some name').execute } let(:group) { create(:group) } before do @@ -13,11 +13,12 @@ describe Projects::ForksController do end describe 'GET index' do - def get_forks + def get_forks(search: nil) get :index, params: { namespace_id: project.namespace, - project_id: project + project_id: project, + search: search } end @@ -31,6 +32,41 @@ describe Projects::ForksController do expect(assigns[:forks]).to be_present end + + it 'forks counts are correct' do + get_forks + + expect(assigns[:total_forks_count]).to eq(1) + expect(assigns[:public_forks_count]).to eq(1) + expect(assigns[:internal_forks_count]).to eq(0) + expect(assigns[:private_forks_count]).to eq(0) + end + + context 'after search' do + it 'forks counts are correct' do + get_forks(search: 'Non-matching query') + + expect(assigns[:total_forks_count]).to eq(1) + expect(assigns[:public_forks_count]).to eq(1) + expect(assigns[:internal_forks_count]).to eq(0) + expect(assigns[:private_forks_count]).to eq(0) + end + end + end + + context 'when fork is internal' do + before do + forked_project.update(visibility_level: Project::INTERNAL, group: group) + end + + it 'forks counts are correct' do + get_forks + + expect(assigns[:total_forks_count]).to eq(1) + expect(assigns[:public_forks_count]).to eq(0) + expect(assigns[:internal_forks_count]).to eq(1) + expect(assigns[:private_forks_count]).to eq(0) + end end context 'when fork is private' do @@ -38,12 +74,25 @@ describe Projects::ForksController do forked_project.update(visibility_level: Project::PRIVATE, group: group) end - it 'is not be visible for non logged in users' do + shared_examples 'forks counts' do + it 'forks counts are correct' do + get_forks + + expect(assigns[:total_forks_count]).to eq(1) + expect(assigns[:public_forks_count]).to eq(0) + expect(assigns[:internal_forks_count]).to eq(0) + expect(assigns[:private_forks_count]).to eq(1) + end + end + + it 'is not visible for non logged in users' do get_forks expect(assigns[:forks]).to be_blank end + include_examples 'forks counts' + context 'when user is logged in' do before do sign_in(project.creator) @@ -67,6 +116,8 @@ describe Projects::ForksController do expect(assigns[:forks]).to be_present end + + include_examples 'forks counts' end context 'when user is a member of the Group' do @@ -79,6 +130,8 @@ describe Projects::ForksController do expect(assigns[:forks]).to be_present end + + include_examples 'forks counts' end end end diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index 2aed402652bfc7ff4b7eafe98b241d5ab4c5ccbf..6792a6e2af05f2ba3a9cff2cac95980567cbb785 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -121,7 +121,6 @@ describe 'Project fork' do end expect(page).not_to have_content("#{another_project_fork.namespace.human_name} / #{another_project_fork.name}") - expect(page).to have_content("1 private fork") end end