From b866cba7f57025dad9e0c8dc93716d22baa87206 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Fri, 2 Feb 2018 15:50:09 -0600 Subject: [PATCH 01/81] Add Auto DevOps and Kubernetes cluster button to project page --- app/assets/stylesheets/framework/buttons.scss | 13 + app/assets/stylesheets/framework/mobile.scss | 4 - app/assets/stylesheets/framework/sidebar.scss | 1 - .../stylesheets/framework/typography.scss | 2 +- .../stylesheets/framework/variables.scss | 6 +- app/assets/stylesheets/pages/projects.scss | 53 +-- app/helpers/projects_helper.rb | 214 ++++++++++++ .../projects/_stat_anchor_list.html.haml | 5 + .../projects/_stat_anchor_list_item.html.haml | 7 + app/views/projects/empty.html.haml | 55 +-- app/views/projects/show.html.haml | 60 +--- ...devops-and-clusters-button-to-projects.yml | 6 + spec/features/auto_deploy_spec.rb | 77 ----- ...eate_license_file_in_empty_project_spec.rb | 2 +- spec/features/projects/show_project_spec.rb | 317 ++++++++++++++++++ spec/features/tags/master_views_tags_spec.rb | 2 +- 16 files changed, 628 insertions(+), 196 deletions(-) create mode 100644 app/views/projects/_stat_anchor_list.html.haml create mode 100644 app/views/projects/_stat_anchor_list_item.html.haml create mode 100644 changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml delete mode 100644 spec/features/auto_deploy_spec.rb diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss index c4b046a6d68..6b89387ab5f 100644 --- a/app/assets/stylesheets/framework/buttons.scss +++ b/app/assets/stylesheets/framework/buttons.scss @@ -444,6 +444,19 @@ } } +.btn-missing { + color: $notes-light-color; + border: 1px dashed $border-gray-normal-dashed; + border-radius: $border-radius-default; + + &:hover, + &:active, + &:focus { + color: $notes-light-color; + background-color: $white-normal; + } +} + .btn-svg svg { @include btn-svg; } diff --git a/app/assets/stylesheets/framework/mobile.scss b/app/assets/stylesheets/framework/mobile.scss index a12f28efce6..8604e753c18 100644 --- a/app/assets/stylesheets/framework/mobile.scss +++ b/app/assets/stylesheets/framework/mobile.scss @@ -63,10 +63,6 @@ } } - .project-stats { - display: none; - } - .group-buttons { display: none; } diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index d61809cb0a4..d1d98270ad9 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -3,7 +3,6 @@ transition: padding $sidebar-transition-duration; .container-fluid { - background: $white-light; padding: 0 $gl-padding; &.container-blank { diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss index d0999e60e65..fef5a1f51fa 100644 --- a/app/assets/stylesheets/framework/typography.scss +++ b/app/assets/stylesheets/framework/typography.scss @@ -296,7 +296,7 @@ body { line-height: 1.3; font-size: 1.25em; font-weight: $gl-font-weight-bold; - margin: 12px 7px; + margin: 12px 0; } h1, diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 25ee081ea9c..945978d2f76 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -215,8 +215,8 @@ $tooltip-font-size: 12px; */ $gl-padding: 16px; $gl-padding-8: 8px; +$gl-padding-4: 4px; $gl-col-padding: 15px; -$gl-btn-padding: 10px; $gl-input-padding: 10px; $gl-vert-padding: 6px; $gl-padding-top: 10px; @@ -377,6 +377,10 @@ $inactive-badge-background: rgba(0, 0, 0, .08); $btn-active-gray: #ececec; $btn-active-gray-light: e4e7ed; $btn-white-active: #848484; +$gl-btn-padding: 10px; +$gl-btn-line-height: 16px; +$gl-btn-vert-padding: 8px; +$gl-btn-horz-padding: 12px; /* * Badges diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index bf41005b6d5..93d232149c1 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -678,6 +678,9 @@ a.deploy-project-label { } } +.project-empty-note-panel { + border-bottom: 1px solid $border-color; +} .project-stats { font-size: 0; @@ -686,11 +689,13 @@ a.deploy-project-label { border-bottom: 1px solid $border-color; .nav { - padding-top: 12px; - padding-bottom: 12px; + margin-top: $gl-padding-8; + margin-bottom: $gl-padding-8; > li { display: inline-block; + margin-top: $gl-padding-4; + margin-bottom: $gl-padding-4; &:not(:last-child) { margin-right: $gl-padding; @@ -704,36 +709,32 @@ a.deploy-project-label { float: right; } } + } - > a { - padding: 0; - background-color: transparent; - font-size: 14px; - line-height: 29px; - color: $notes-light-color; + .stat-text, + .stat-link { + padding: $gl-btn-vert-padding 0; + background-color: transparent; + font-size: $gl-font-size; + line-height: $gl-btn-line-height; + color: $notes-light-color; + } - &:hover, - &:focus { - color: $gl-text-color; - text-decoration: underline; - } + .stat-link { + &:hover, + &:focus { + color: $gl-text-color; + text-decoration: underline; } } - } - li.missing { - border: 1px dashed $border-gray-normal-dashed; - border-radius: $border-radius-default; - - a { - padding-left: 10px; - padding-right: 10px; - color: $notes-light-color; - display: block; + .btn { + padding: $gl-btn-vert-padding $gl-btn-horz-padding; + line-height: $gl-btn-line-height; } - &:hover { - background-color: $gray-normal; + .btn-missing { + @extend .btn-missing; } } } @@ -743,7 +744,7 @@ pre.light-well { } .git-empty { - margin: 0 7px 7px; + margin-bottom: 7px; h5 { color: $gl-text-color; diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 6512617a02d..0c64b8abec3 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -604,4 +604,218 @@ module ProjectsHelper project_find_file_path(@project, ref) end + + def can_current_user_push_code?(project) + project.empty_repo? ? can?(current_user, :push_code, project) : can_push_branch?(project, project.default_branch) + end + + def files_anchor_data(project) + { + enabled: true, + label: _('Files (%{human_size})') % { human_size: storage_counter(@project.statistics.total_repository_size) }, + link: project_tree_path(@project) + } + end + + def commits_anchor_data(project) + { + enabled: true, + label: n_('Commit (%{commit_count})', 'Commits (%{commit_count})', @project.statistics.commit_count) % { commit_count: number_with_delimiter(@project.statistics.commit_count) }, + link: project_commits_path(@project, current_ref) + } + end + + def branches_anchor_data(project) + { + enabled: true, + label: n_('Branch (%{branch_count})', 'Branches (%{branch_count})', @repository.branch_count) % { branch_count: number_with_delimiter(@repository.branch_count) }, + link: project_branches_path(@project) + } + end + + def tags_anchor_data(project) + { + enabled: true, + label: n_('Tag (%{tag_count})', 'Tags (%{tag_count})', @repository.tag_count) % { tag_count: number_with_delimiter(@repository.tag_count) }, + link: project_tags_path(@project) + } + end + + def new_file_anchor_data(project) + if current_user && can_current_user_push_code?(project) + { + enabled: false, + label: _('New file'), + link: project_new_blob_path(project, project.default_branch || 'master'), + class_modifier: 'new' + } + end + end + + def readme_anchor_data(project) + if current_user && can_current_user_push_code?(project) && project.repository.readme.blank? + { + enabled: false, + label: _('Add Readme'), + link: add_special_file_path(project, file_name: 'README.md') + } + elsif project.repository.readme.present? + { + enabled: true, + label: _('Readme'), + link: default_project_view != 'readme' ? readme_path(@project) : '#readme' + } + end + end + + def changelog_anchor_data(project) + if current_user && can_current_user_push_code?(project) && project.repository.changelog.blank? + { + enabled: false, + label: _('Add Changelog'), + link: add_special_file_path(project, file_name: 'CHANGELOG') + } + elsif project.repository.changelog.present? + { + enabled: true, + label: _('Changelog'), + link: changelog_path(project) + } + end + end + + def license_anchor_data(project) + if current_user && can_current_user_push_code?(project) && project.repository.license_blob.blank? + { + enabled: false, + label: _('Add License'), + link: add_special_file_path(project, file_name: 'LICENSE') + } + elsif project.repository.license_blob.present? + { + enabled: true, + label: license_short_name(project), + link: license_path(project) + } + end + end + + def contribution_guide_anchor_data(project) + if current_user && can_current_user_push_code?(project) && project.repository.contribution_guide.blank? + { + enabled: false, + label: _('Add Contribution guide'), + link: add_special_file_path(project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') + } + elsif project.repository.contribution_guide.present? + { + enabled: true, + label: _('Contribution guide'), + link: contribution_guide_path(@project) + } + end + end + + def autodevops_anchor_data(project, ignore_callout: false) + if current_user && can?(current_user, :admin_pipeline, project) && project.repository.gitlab_ci_yml.blank? && (ignore_callout || !show_auto_devops_callout?(project)) + { + enabled: project.auto_devops_enabled?, + label: project.auto_devops_enabled? ? _('Auto DevOps enabled') : _('Enable Auto DevOps'), + link: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings') + } + elsif project.auto_devops_enabled? + { + enabled: true, + label: _('Auto DevOps enabled'), + link: nil + } + end + end + + def kubernetes_cluster_anchor_data(project) + if current_user && can?(current_user, :create_cluster, project) + cluster_link = project.clusters.size == 1 ? project_cluster_path(project, project.clusters.first) : project_clusters_path(project) + + if project.clusters.empty? + cluster_link = new_project_cluster_path(project) + end + + { + enabled: !project.clusters.empty?, + label: project.clusters.empty? ? _('Add Kubernetes cluster') : n_('Kubernetes cluster', 'Kubernetes clusters', project.clusters.size), + link: cluster_link + } + end + end + + def gitlab_ci_anchor_data(project) + if current_user && can_current_user_push_code?(project) && project.repository.gitlab_ci_yml.blank? && !project.auto_devops_enabled? + { + enabled: false, + label: _('Set up CI/CD'), + link: add_special_file_path(project, file_name: '.gitlab-ci.yml') + } + elsif project.repository.gitlab_ci_yml.present? + { + enabled: true, + label: _('CI/CD configuration'), + link: ci_configuration_path(@project) + } + end + end + + def koding_anchor_data(project) + if current_user && can_current_user_push_code?(project) && koding_enabled? && project.repository.koding_yml.blank? + { + enabled: false, + label: _('Set up Koding'), + link: add_koding_stack_path(project) + } + end + end + + def empty_project_stat_anchor_items(project) + [ + autodevops_anchor_data(project, ignore_callout: true), + kubernetes_cluster_anchor_data(project) + ].compact.reject { |i| !i[:enabled] } + end + + def empty_project_stat_button_items(project) + [ + new_file_anchor_data(project), + readme_anchor_data(project), + license_anchor_data(project), + autodevops_anchor_data(project, ignore_callout: true), + kubernetes_cluster_anchor_data(project) + ].compact.reject { |i| i[:enabled] } + end + + def project_stat_anchor_items(project) + [ + files_anchor_data(project), + commits_anchor_data(project), + branches_anchor_data(project), + tags_anchor_data(project), + readme_anchor_data(project), + changelog_anchor_data(project), + license_anchor_data(project), + contribution_guide_anchor_data(project), + gitlab_ci_anchor_data(project), + autodevops_anchor_data(project), + kubernetes_cluster_anchor_data(project) + ].compact.reject { |i| !i[:enabled] } + end + + def project_stat_button_items(project) + [ + changelog_anchor_data(project), + license_anchor_data(project), + contribution_guide_anchor_data(project), + autodevops_anchor_data(project), + kubernetes_cluster_anchor_data(project), + gitlab_ci_anchor_data(project), + koding_anchor_data(project) + ].compact.reject { |i| i[:enabled] } + end end diff --git a/app/views/projects/_stat_anchor_list.html.haml b/app/views/projects/_stat_anchor_list.html.haml new file mode 100644 index 00000000000..9ca51f8d68c --- /dev/null +++ b/app/views/projects/_stat_anchor_list.html.haml @@ -0,0 +1,5 @@ +- anchors = local_assigns.fetch(:anchors, []) + +- if anchors.size > 0 + %ul.nav + = render partial: 'stat_anchor_list_item', collection: anchors, as: :anchor diff --git a/app/views/projects/_stat_anchor_list_item.html.haml b/app/views/projects/_stat_anchor_list_item.html.haml new file mode 100644 index 00000000000..404dd24599f --- /dev/null +++ b/app/views/projects/_stat_anchor_list_item.html.haml @@ -0,0 +1,7 @@ +%li + - if anchor[:link] + = link_to anchor[:link], class: anchor[:enabled] ? 'stat-link' : "btn btn-#{anchor[:class_modifier] || 'missing'}" do + = anchor[:label] + - else + %span.stat-text + = anchor[:label] diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index ab225796b12..01fb9dab313 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -5,38 +5,41 @@ = render "home_panel" -.row-content-block.second-block.center - %h4 - The repository for this project is empty +.project-empty-note-panel + %div{ class: [container_class, ("limit-container-width-sm" unless fluid_layout)] } + .prepend-top-20 + %h4 + = _('The repository for this project is empty') - - if can?(current_user, :push_code, @project) - %p - If you already have files you can push them using command line instructions below. - %p - Otherwise you can start with adding a - = succeed ',' do - = link_to "README", add_special_file_path(@project, file_name: 'README.md') - a - = succeed ',' do - = link_to "LICENSE", add_special_file_path(@project, file_name: 'LICENSE') - or a - = link_to '.gitignore', add_special_file_path(@project, file_name: '.gitignore') - to this project. - %p - You will need to be owner or have the master permission level for the initial push, as the master branch is automatically protected. - - - if show_auto_devops_callout?(@project) + - if can?(current_user, :push_code, @project) %p - - link = link_to(s_('AutoDevOps|Auto DevOps (Beta)'), project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings')) - = s_('AutoDevOps|You can activate %{link_to_settings} for this project.').html_safe % { link_to_settings: link } - %p= s_('AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration.') - %p= link_to _('New file'), project_new_blob_path(@project, @project.default_branch || 'master'), class: 'btn btn-new' + - link_to_cli = link_to _('command line instructions'), '#repo-command-line-instructions' + = _('If you already have files you can push them using the %{link_to_cli} below.').html_safe % { link_to_cli: link_to_cli } + %p + %em + - link_to_protected_branches = link_to _('Learn more about protected branches'), help_page_path('user/project/protected_branches') + = _('Note that the master branch is automatically protected. %{link_to_protected_branches}').html_safe % { link_to_protected_branches: link_to_protected_branches } + + %hr + %p + - link_to_auto_devops_settings = link_to(s_('AutoDevOps|enable Auto DevOps (Beta)'), project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings')) + - link_to_add_kubernetes_cluster = link_to(s_('AutoDevOps|add a Kubernetes cluster'), project_clusters_path(@project)) + = s_('AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}.').html_safe % { link_to_auto_devops_settings: link_to_auto_devops_settings, link_to_add_kubernetes_cluster: link_to_add_kubernetes_cluster } + + %hr + %p + = _('Otherwise it is recommended you start with one of the options below.') + .prepend-top-20 + +%nav.project-stats{ class: container_class } + = render 'stat_anchor_list', anchors: empty_project_stat_anchor_items(@project) + = render 'stat_anchor_list', anchors: empty_project_stat_button_items(@project) - if can?(current_user, :push_code, @project) - %div{ class: container_class } + %div{ class: [container_class, ("limit-container-width-sm" unless fluid_layout)] } .prepend-top-20 .empty_wrapper - %h3.page-title-empty + %h3#repo-command-line-instructions.page-title-empty Command line instructions .git-empty %fieldset diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 888d820b04e..3d23b19b815 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -14,65 +14,9 @@ - if can?(current_user, :download_code, @project) %nav.project-stats{ class: container_class } - %ul.nav - %li - = link_to project_tree_path(@project) do - #{_('Files')} (#{storage_counter(@project.statistics.total_repository_size)}) - %li - = link_to project_commits_path(@project, current_ref) do - #{n_('Commit', 'Commits', @project.statistics.commit_count)} (#{number_with_delimiter(@project.statistics.commit_count)}) - %li - = link_to project_branches_path(@project) do - #{n_('Branch', 'Branches', @repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)}) - %li - = link_to project_tags_path(@project) do - #{n_('Tag', 'Tags', @repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)}) + = render 'stat_anchor_list', anchors: project_stat_anchor_items(@project) + = render 'stat_anchor_list', anchors: project_stat_button_items(@project) - - if @repository.readme - %li - = link_to _('Readme'), - default_project_view != 'readme' ? readme_path(@project) : '#readme' - - - if @repository.changelog - %li - = link_to _('Changelog'), changelog_path(@project) - - - if @repository.license_blob - %li - = link_to license_short_name(@project), license_path(@project) - - - if @repository.contribution_guide - %li - = link_to _('Contribution guide'), contribution_guide_path(@project) - - - if @repository.gitlab_ci_yml - %li - = link_to _('CI/CD configuration'), ci_configuration_path(@project) - - - if current_user && can_push_branch?(@project, @project.default_branch) - - unless @repository.changelog - %li.missing - = link_to add_special_file_path(@project, file_name: 'CHANGELOG') do - #{ _('Add Changelog') } - - unless @repository.license_blob - %li.missing - = link_to add_special_file_path(@project, file_name: 'LICENSE') do - #{ _('Add License') } - - unless @repository.contribution_guide - %li.missing - = link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do - #{ _('Add Contribution guide') } - - unless @repository.gitlab_ci_yml - %li.missing - = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do - #{ _('Set up CI/CD') } - - if koding_enabled? && @repository.koding_yml.blank? - %li.missing - = link_to _('Set up Koding'), add_koding_stack_path(@project) - - if @repository.gitlab_ci_yml.blank? && @project.deployment_platform.present? - %li.missing - = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml', commit_message: 'Set up auto deploy', branch_name: 'auto-deploy', context: 'autodeploy') do - #{ _('Set up auto deploy') } %div{ class: [container_class, ("limit-container-width" unless fluid_layout)] } - if @project.archived? diff --git a/changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml b/changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml new file mode 100644 index 00000000000..5613b2af763 --- /dev/null +++ b/changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml @@ -0,0 +1,6 @@ +--- +title: Add a button on the project page to set up a Kubernetes cluster and enable + Auto DevOps +merge_request: 16900 +author: +type: added diff --git a/spec/features/auto_deploy_spec.rb b/spec/features/auto_deploy_spec.rb deleted file mode 100644 index 9aef68b7156..00000000000 --- a/spec/features/auto_deploy_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -require 'spec_helper' - -describe 'Auto deploy' do - let(:user) { create(:user) } - let(:project) { create(:project, :repository) } - - shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do - context 'when no deployment service is active' do - before do - trun_off - end - - it 'does not show a button to set up auto deploy' do - visit project_path(project) - expect(page).to have_no_content('Set up auto deploy') - end - end - - context 'when a deployment service is active' do - before do - trun_on - visit project_path(project) - end - - it 'shows a button to set up auto deploy' do - expect(page).to have_link('Set up auto deploy') - end - - it 'includes OpenShift as an available template', :js do - click_link 'Set up auto deploy' - click_button 'Apply a GitLab CI Yaml template' - - within '.gitlab-ci-yml-selector' do - expect(page).to have_content('OpenShift') - end - end - - it 'creates a merge request using "auto-deploy" branch', :js do - click_link 'Set up auto deploy' - click_button 'Apply a GitLab CI Yaml template' - within '.gitlab-ci-yml-selector' do - click_on 'OpenShift' - end - wait_for_requests - click_button 'Commit changes' - - expect(page).to have_content('New Merge Request From auto-deploy into master') - end - end - end - - context 'when user configured kubernetes from Integration > Kubernetes' do - before do - create :kubernetes_service, project: project - project.add_master(user) - sign_in user - end - - let(:trun_on) { project.deployment_platform.update!(active: true) } - let(:trun_off) { project.deployment_platform.update!(active: false) } - - it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes' - end - - context 'when user configured kubernetes from CI/CD > Clusters' do - before do - create(:cluster, :provided_by_gcp, projects: [project]) - project.add_master(user) - sign_in user - end - - let(:trun_on) { project.deployment_platform.cluster.update!(enabled: true) } - let(:trun_off) { project.deployment_platform.cluster.update!(enabled: false) } - - it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes' - end -end diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb index 8ac9821b879..7f1d1934103 100644 --- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb +++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb @@ -11,7 +11,7 @@ feature 'project owner sees a link to create a license file in empty project', : scenario 'project master creates a license file from a template' do visit project_path(project) - click_on 'LICENSE' + click_on 'Add License' expect(page).to have_content('New file') expect(current_path).to eq( diff --git a/spec/features/projects/show_project_spec.rb b/spec/features/projects/show_project_spec.rb index 0b94c9eae5d..f5f2bbb49e0 100644 --- a/spec/features/projects/show_project_spec.rb +++ b/spec/features/projects/show_project_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe 'Project show page', :feature do + include ProjectsHelper + context 'when project pending delete' do let(:project) { create(:project, :empty_repo, pending_delete: true) } @@ -17,4 +19,319 @@ describe 'Project show page', :feature do expect(page).to have_content("This project was scheduled for deletion, but failed with the following message: #{project.delete_error}") end end + + describe 'stat button existence' do + # For "New file", "Add License" functionality, + # see spec/features/projects/files/project_owner_creates_license_file_spec.rb + # see spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb + + let(:user) { create(:user) } + + describe 'empty project' do + let(:project) { create(:project, :public, :empty_repo) } + + describe 'as a normal user' do + before do + sign_in(user) + + visit project_path(project) + end + + it 'no Auto DevOps button if can not manage pipelines' do + page.within('.project-stats') do + expect(page).not_to have_link('Enable Auto DevOps') + expect(page).not_to have_link('Auto DevOps enabled') + end + end + + it '"Auto DevOps enabled" button not linked' do + project.create_auto_devops!(enabled: true) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_text('Auto DevOps enabled') + end + end + end + + describe 'as a master' do + before do + project.add_master(user) + sign_in(user) + + visit project_path(project) + end + + it '"New file" button linked to new file page' do + page.within('.project-stats') do + expect(page).to have_link('New file', href: project_new_blob_path(project, project.default_branch || 'master')) + end + end + + it '"Add Readme" button linked to new file populated for a readme' do + page.within('.project-stats') do + expect(page).to have_link('Add Readme', href: add_special_file_path(project, file_name: 'README.md')) + end + end + + it '"Add License" button linked to new file populated for a license' do + page.within('.project-stats') do + expect(page).to have_link('Add License', href: add_special_file_path(project, file_name: 'LICENSE')) + end + end + + describe 'Auto DevOps button' do + it '"Enable Auto DevOps" button linked to settings page' do + page.within('.project-stats') do + expect(page).to have_link('Enable Auto DevOps', href: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings')) + end + end + + it '"Auto DevOps enabled" anchor linked to settings page' do + project.create_auto_devops!(enabled: true) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_link('Auto DevOps enabled', href: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings')) + end + end + end + + describe 'Kubernetes cluster button' do + it '"Add Kubernetes cluster" button linked to clusters page' do + page.within('.project-stats') do + expect(page).to have_link('Add Kubernetes cluster', href: new_project_cluster_path(project)) + end + end + + it '"Kubernetes cluster" anchor linked to cluster page' do + cluster = create(:cluster, :provided_by_gcp, projects: [project]) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_link('Kubernetes cluster', href: project_cluster_path(project, cluster)) + end + end + end + end + end + + describe 'populated project' do + let(:project) { create(:project, :public, :repository) } + + describe 'as a normal user' do + before do + sign_in(user) + + visit project_path(project) + end + + it 'no Auto DevOps button if can not manage pipelines' do + page.within('.project-stats') do + expect(page).not_to have_link('Enable Auto DevOps') + expect(page).not_to have_link('Auto DevOps enabled') + end + end + + it '"Auto DevOps enabled" button not linked' do + project.create_auto_devops!(enabled: true) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_text('Auto DevOps enabled') + end + end + + it 'no Kubernetes cluster button if can not manage clusters' do + page.within('.project-stats') do + expect(page).not_to have_link('Add Kubernetes cluster') + expect(page).not_to have_link('Kubernetes cluster') + end + end + end + + describe 'as a master' do + before do + allow_any_instance_of(AutoDevopsHelper).to receive(:show_auto_devops_callout?).and_return(false) + project.add_master(user) + sign_in(user) + + visit project_path(project) + end + + it 'no "Add Changelog" button if the project already has a changelog' do + expect(project.repository.changelog).not_to be_nil + + page.within('.project-stats') do + expect(page).not_to have_link('Add Changelog') + end + end + + it 'no "Add License" button if the project already has a license' do + expect(project.repository.license_blob).not_to be_nil + + page.within('.project-stats') do + expect(page).not_to have_link('Add License') + end + end + + it 'no "Add Contribution guide" button if the project already has a contribution guide' do + expect(project.repository.contribution_guide).not_to be_nil + + page.within('.project-stats') do + expect(page).not_to have_link('Add Contribution guide') + end + end + + describe 'GitLab CI configuration button' do + it '"Set up CI/CD" button linked to new file populated for a .gitlab-ci.yml' do + expect(project.repository.gitlab_ci_yml).to be_nil + + page.within('.project-stats') do + expect(page).to have_link('Set up CI/CD', href: add_special_file_path(project, file_name: '.gitlab-ci.yml')) + end + end + + it 'no "Set up CI/CD" button if the project already has a .gitlab-ci.yml' do + Files::CreateService.new( + project, + project.creator, + start_branch: 'master', + branch_name: 'master', + commit_message: "Add .gitlab-ci.yml", + file_path: '.gitlab-ci.yml', + file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) + ).execute + + expect(project.repository.gitlab_ci_yml).not_to be_nil + + visit project_path(project) + + page.within('.project-stats') do + expect(page).not_to have_link('Set up CI/CD') + end + end + + it 'no "Set up CI/CD" button if the project has Auto DevOps enabled' do + project.create_auto_devops!(enabled: true) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).not_to have_link('Set up CI/CD') + end + end + end + + describe 'Auto DevOps button' do + it '"Enable Auto DevOps" button linked to settings page' do + page.within('.project-stats') do + expect(page).to have_link('Enable Auto DevOps', href: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings')) + end + end + + it '"Enable Auto DevOps" button linked to settings page' do + project.create_auto_devops!(enabled: true) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_link('Auto DevOps enabled', href: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings')) + end + end + + it 'no Auto DevOps button if Auto DevOps callout is shown' do + allow_any_instance_of(AutoDevopsHelper).to receive(:show_auto_devops_callout?).and_return(true) + + visit project_path(project) + + expect(page).to have_selector('.js-autodevops-banner') + + page.within('.project-stats') do + expect(page).not_to have_link('Enable Auto DevOps') + expect(page).not_to have_link('Auto DevOps enabled') + end + end + + it 'no "Enable Auto DevOps" button when .gitlab-ci.yml already exists' do + Files::CreateService.new( + project, + project.creator, + start_branch: 'master', + branch_name: 'master', + commit_message: "Add .gitlab-ci.yml", + file_path: '.gitlab-ci.yml', + file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) + ).execute + + expect(project.repository.gitlab_ci_yml).not_to be_nil + + visit project_path(project) + + page.within('.project-stats') do + expect(page).not_to have_link('Enable Auto DevOps') + expect(page).not_to have_link('Auto DevOps enabled') + end + end + end + + describe 'Kubernetes cluster button' do + it '"Add Kubernetes cluster" button linked to clusters page' do + page.within('.project-stats') do + expect(page).to have_link('Add Kubernetes cluster', href: new_project_cluster_path(project)) + end + end + + it '"Kubernetes cluster" button linked to cluster page' do + cluster = create(:cluster, :provided_by_gcp, projects: [project]) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_link('Kubernetes cluster', href: project_cluster_path(project, cluster)) + end + end + end + + describe '"Set up Koding" button' do + it 'no "Set up Koding" button if Koding disabled' do + stub_application_setting(koding_enabled?: false) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).not_to have_link('Set up Koding') + end + end + + it 'no "Set up Koding" button if the project already has a .koding.yml' do + stub_application_setting(koding_enabled?: true) + allow(Gitlab::CurrentSettings.current_application_settings).to receive(:koding_url).and_return('http://koding.example.com') + expect(project.repository.changelog).not_to be_nil + allow_any_instance_of(Repository).to receive(:koding_yml).and_return(project.repository.changelog) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).not_to have_link('Set up Koding') + end + end + + it '"Set up Koding" button linked to new file populated for a .koding.yml' do + stub_application_setting(koding_enabled?: true) + + visit project_path(project) + + page.within('.project-stats') do + expect(page).to have_link('Set up Koding', href: add_koding_stack_path(project)) + end + end + end + end + end + end end diff --git a/spec/features/tags/master_views_tags_spec.rb b/spec/features/tags/master_views_tags_spec.rb index 4662367d843..b625e7065cc 100644 --- a/spec/features/tags/master_views_tags_spec.rb +++ b/spec/features/tags/master_views_tags_spec.rb @@ -13,7 +13,7 @@ feature 'Master views tags' do before do visit project_path(project) - click_on 'README' + click_on 'Add Readme' fill_in :commit_message, with: 'Add a README file', visible: true click_button 'Commit changes' visit project_tags_path(project) From e887e858716738c937473776f94d0686c628b2c6 Mon Sep 17 00:00:00 2001 From: Shah El-Rahman Date: Tue, 13 Feb 2018 22:16:36 -0600 Subject: [PATCH 02/81] Remove use of callback in pipeline stop/retry modals Make changes to names of events and variables Combine stop and retry modals into 1 Fix lint issues Add comment about usage of eventHub instead of props --- .../pipelines/components/async_button.vue | 30 +++++--- .../pipelines/components/pipelines_table.vue | 71 +++++++++++++++++-- .../components/pipelines_table_row.vue | 10 +-- .../components/retry_confirmation_modal.vue | 65 ----------------- .../components/stop_confirmation_modal.vue | 65 ----------------- .../pipelines/async_button_spec.js | 11 +-- 6 files changed, 100 insertions(+), 152 deletions(-) delete mode 100644 app/assets/javascripts/pipelines/components/retry_confirmation_modal.vue delete mode 100644 app/assets/javascripts/pipelines/components/stop_confirmation_modal.vue diff --git a/app/assets/javascripts/pipelines/components/async_button.vue b/app/assets/javascripts/pipelines/components/async_button.vue index a5f22c4ec80..0cdffbde05b 100644 --- a/app/assets/javascripts/pipelines/components/async_button.vue +++ b/app/assets/javascripts/pipelines/components/async_button.vue @@ -31,10 +31,14 @@ type: String, required: true, }, - id: { + pipelineId: { type: Number, required: true, }, + type: { + type: String, + required: true, + }, }, data() { return { @@ -46,17 +50,27 @@ return `btn ${this.cssClass}`; }, }, + created() { + // We're using eventHub to listen to the modal here instead of + // using props because it would would make the parent components + // much more complex to keep track of the loading state of each button + eventHub.$on('postAction', this.setLoading); + }, + beforeDestroy() { + eventHub.$off('postAction', this.setLoading); + }, methods: { onClick() { - eventHub.$emit('actionConfirmationModal', { - id: this.id, - callback: this.makeRequest, + eventHub.$emit('openConfirmationModal', { + pipelineId: this.pipelineId, + endpoint: this.endpoint, + type: this.type, }); }, - makeRequest() { - this.isLoading = true; - - eventHub.$emit('postAction', this.endpoint); + setLoading(endpoint) { + if (endpoint === this.endpoint) { + this.isLoading = true; + } }, }, }; diff --git a/app/assets/javascripts/pipelines/components/pipelines_table.vue b/app/assets/javascripts/pipelines/components/pipelines_table.vue index 62fe479fdf4..c9028952ddd 100644 --- a/app/assets/javascripts/pipelines/components/pipelines_table.vue +++ b/app/assets/javascripts/pipelines/components/pipelines_table.vue @@ -1,7 +1,8 @@ diff --git a/app/assets/javascripts/pipelines/components/pipelines_table_row.vue b/app/assets/javascripts/pipelines/components/pipelines_table_row.vue index 0e3a10ed7f4..33d441e573e 100644 --- a/app/assets/javascripts/pipelines/components/pipelines_table_row.vue +++ b/app/assets/javascripts/pipelines/components/pipelines_table_row.vue @@ -305,9 +305,10 @@ css-class="js-pipelines-retry-button btn-default btn-retry" title="Retry" icon="repeat" - :id="pipeline.id" + :pipeline-id="pipeline.id" data-toggle="modal" - data-target="#retry-confirmation-modal" + data-target="#confirmation-modal" + type="retry" /> diff --git a/app/assets/javascripts/pipelines/components/retry_confirmation_modal.vue b/app/assets/javascripts/pipelines/components/retry_confirmation_modal.vue deleted file mode 100644 index e2ac08d67bc..00000000000 --- a/app/assets/javascripts/pipelines/components/retry_confirmation_modal.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/app/assets/javascripts/pipelines/components/stop_confirmation_modal.vue b/app/assets/javascripts/pipelines/components/stop_confirmation_modal.vue deleted file mode 100644 index d737d567787..00000000000 --- a/app/assets/javascripts/pipelines/components/stop_confirmation_modal.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/spec/javascripts/pipelines/async_button_spec.js b/spec/javascripts/pipelines/async_button_spec.js index 8ce33d410a7..e0ea3649646 100644 --- a/spec/javascripts/pipelines/async_button_spec.js +++ b/spec/javascripts/pipelines/async_button_spec.js @@ -15,7 +15,8 @@ describe('Pipelines Async Button', () => { title: 'Foo', icon: 'repeat', cssClass: 'bar', - id: 123, + pipelineId: 123, + type: 'explode', }, }).$mount(); }); @@ -39,8 +40,9 @@ describe('Pipelines Async Button', () => { describe('With confirm dialog', () => { it('should call the service when confimation is positive', () => { - eventHub.$on('actionConfirmationModal', (data) => { - expect(data.id).toEqual(123); + eventHub.$on('openConfirmationModal', (data) => { + expect(data.pipelineId).toEqual(123); + expect(data.type).toEqual('explode'); }); component = new AsyncButtonComponent({ @@ -49,7 +51,8 @@ describe('Pipelines Async Button', () => { title: 'Foo', icon: 'fa fa-foo', cssClass: 'bar', - id: 123, + pipelineId: 123, + type: 'explode', }, }).$mount(); From 348c60d9be8b0e358d766c46e3e6d343af3e187a Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Thu, 15 Feb 2018 13:20:55 -0800 Subject: [PATCH 03/81] Remove codebase dependencies from a BG migration Specifically, `PopulateUntrackedUploads` and its spec. --- .../populate_untracked_uploads.rb | 11 +- ...populate_untracked_uploads_dependencies.rb | 59 ++++++ .../populate_untracked_uploads_spec.rb | 194 +++++++++--------- .../track_untracked_uploads_helpers.rb | 123 ++++++++++- 4 files changed, 275 insertions(+), 112 deletions(-) create mode 100644 lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb diff --git a/lib/gitlab/background_migration/populate_untracked_uploads.rb b/lib/gitlab/background_migration/populate_untracked_uploads.rb index ee55fabd6f0..c0aa64e27ed 100644 --- a/lib/gitlab/background_migration/populate_untracked_uploads.rb +++ b/lib/gitlab/background_migration/populate_untracked_uploads.rb @@ -5,11 +5,15 @@ module Gitlab # This class processes a batch of rows in `untracked_files_for_uploads` by # adding each file to the `uploads` table if it does not exist. class PopulateUntrackedUploads # rubocop:disable Metrics/ClassLength + include PopulateUntrackedUploadsDependencies + # This class is responsible for producing the attributes necessary to # track an uploaded file in the `uploads` table. class UntrackedFile < ActiveRecord::Base # rubocop:disable Metrics/ClassLength, Metrics/LineLength self.table_name = 'untracked_files_for_uploads' + include PopulateUntrackedUploadsDependencies + # Ends with /:random_hex/:filename FILE_UPLOADER_PATH = %r{/\h+/[^/]+\z} FULL_PATH_CAPTURE = /\A(.+)#{FILE_UPLOADER_PATH}/ @@ -147,11 +151,6 @@ module Gitlab end end - # This class is used to query the `uploads` table. - class Upload < ActiveRecord::Base - self.table_name = 'uploads' - end - def perform(start_id, end_id) return unless migrate? @@ -229,7 +228,7 @@ module Gitlab end ids.each do |model_type, model_ids| - model_class = Object.const_get(model_type) + model_class = self.class.const_get(model_type) found_ids = model_class.where(id: model_ids.uniq).pluck(:id) deleted_ids = ids[model_type] - found_ids ids[model_type] = deleted_ids diff --git a/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb b/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb new file mode 100644 index 00000000000..188aeed4fbf --- /dev/null +++ b/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true +module Gitlab + module BackgroundMigration + module PopulateUntrackedUploadsDependencies + # Avoid using application code + class Upload < ActiveRecord::Base + self.table_name = 'uploads' + end + + # Avoid using application code + class Appearance < ActiveRecord::Base + self.table_name = 'appearances' + end + + # Avoid using application code + class Namespace < ActiveRecord::Base + self.table_name = 'namespaces' + end + + # Avoid using application code + class Note < ActiveRecord::Base + self.table_name = 'notes' + end + + # Avoid using application code + class User < ActiveRecord::Base + self.table_name = 'users' + end + + # Since project Markdown upload paths don't contain the project ID, we have to find the + # project by its full_path. Due to MySQL/PostgreSQL differences, and historical reasons, + # the logic is somewhat complex, so I've mostly copied it in here. + class Project < ActiveRecord::Base + self.table_name = 'projects' + + def self.find_by_full_path(path) + binary = Gitlab::Database.mysql? ? 'BINARY' : '' + order_sql = "(CASE WHEN #{binary} routes.path = #{connection.quote(path)} THEN 0 ELSE 1 END)" + where_full_path_in(path).reorder(order_sql).take + end + + def self.where_full_path_in(path) + cast_lower = Gitlab::Database.postgresql? + + path = connection.quote(path) + + where = + if cast_lower + "(LOWER(routes.path) = LOWER(#{path}))" + else + "(routes.path = #{path})" + end + + joins("INNER JOIN routes ON routes.source_id = projects.id AND routes.source_type = 'Project'").where(where) + end + end + end + end +end diff --git a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb index c8fa252439a..23c602a3297 100644 --- a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb @@ -1,17 +1,19 @@ require 'spec_helper' -# This migration is using UploadService, which sets uploads.secret that is only -# added to the DB schema in 20180129193323. Since the test isn't isolated, we -# just use the latest schema when testing this migration. -# Ideally, the test should not use factories nor UploadService, and rely on the -# `table` helper instead. -describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migration, schema: 20180129193323 do +# Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. +describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migration, schema: 20180208183958 do include TrackUntrackedUploadsHelpers subject { described_class.new } - let!(:untracked_files_for_uploads) { described_class::UntrackedFile } - let!(:uploads) { described_class::Upload } + let!(:appearances) { table(:appearances) } + let!(:namespaces) { table(:namespaces) } + let!(:notes) { table(:notes) } + let!(:projects) { table(:projects) } + let!(:routes) { table(:routes) } + let!(:untracked_files_for_uploads) { table(:untracked_files_for_uploads) } + let!(:uploads) { table(:uploads) } + let!(:users) { table(:users) } before do ensure_temporary_tracking_table_exists @@ -19,30 +21,30 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra end context 'with untracked files and tracked files in untracked_files_for_uploads' do - let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) } - let!(:user1) { create(:user, :with_avatar) } - let!(:user2) { create(:user, :with_avatar) } - let!(:project1) { create(:project, :legacy_storage, :with_avatar) } - let!(:project2) { create(:project, :legacy_storage, :with_avatar) } + let!(:appearance) { create_or_update_appearance(logo: true, header_logo: true) } + let!(:user1) { create_user(avatar: true) } + let!(:user2) { create_user(avatar: true) } + let!(:project1) { create_project(avatar: true) } + let!(:project2) { create_project(avatar: true) } before do - UploadService.new(project1, uploaded_file, FileUploader).execute # Markdown upload - UploadService.new(project2, uploaded_file, FileUploader).execute # Markdown upload + add_markdown_attachment(project1) + add_markdown_attachment(project2) # File records created by PrepareUntrackedUploads - untracked_files_for_uploads.create!(path: appearance.uploads.first.path) - untracked_files_for_uploads.create!(path: appearance.uploads.last.path) - untracked_files_for_uploads.create!(path: user1.uploads.first.path) - untracked_files_for_uploads.create!(path: user2.uploads.first.path) - untracked_files_for_uploads.create!(path: project1.uploads.first.path) - untracked_files_for_uploads.create!(path: project2.uploads.first.path) - untracked_files_for_uploads.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{project1.full_path}/#{project1.uploads.last.path}") - untracked_files_for_uploads.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{project2.full_path}/#{project2.uploads.last.path}") + untracked_files_for_uploads.create!(path: get_uploads(appearance, 'Appearance').first.path) + untracked_files_for_uploads.create!(path: get_uploads(appearance, 'Appearance').last.path) + untracked_files_for_uploads.create!(path: get_uploads(user1, 'User').first.path) + untracked_files_for_uploads.create!(path: get_uploads(user2, 'User').first.path) + untracked_files_for_uploads.create!(path: get_uploads(project1, 'Project').first.path) + untracked_files_for_uploads.create!(path: get_uploads(project2, 'Project').first.path) + untracked_files_for_uploads.create!(path: "#{project_uploads_dir(project1).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project1, 'Project').last.path}") + untracked_files_for_uploads.create!(path: "#{project_uploads_dir(project2).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project2, 'Project').last.path}") # Untrack 4 files - user2.uploads.delete_all - project2.uploads.delete_all # 2 files: avatar and a Markdown upload - appearance.uploads.where("path like '%header_logo%'").delete_all + get_uploads(user2, 'User').delete_all + get_uploads(project2, 'Project').delete_all # 2 files: avatar and a Markdown upload + get_uploads(appearance, 'Appearance').where("path like '%header_logo%'").delete_all end it 'adds untracked files to the uploads table' do @@ -50,9 +52,9 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra subject.perform(1, untracked_files_for_uploads.reorder(:id).last.id) end.to change { uploads.count }.from(4).to(8) - expect(user2.uploads.count).to eq(1) - expect(project2.uploads.count).to eq(2) - expect(appearance.uploads.count).to eq(2) + expect(get_uploads(user2, 'User').count).to eq(1) + expect(get_uploads(project2, 'Project').count).to eq(2) + expect(get_uploads(appearance, 'Appearance').count).to eq(2) end it 'deletes rows after processing them' do @@ -66,9 +68,9 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra it 'does not create duplicate uploads of already tracked files' do subject.perform(1, untracked_files_for_uploads.last.id) - expect(user1.uploads.count).to eq(1) - expect(project1.uploads.count).to eq(2) - expect(appearance.uploads.count).to eq(2) + expect(get_uploads(user1, 'User').count).to eq(1) + expect(get_uploads(project1, 'Project').count).to eq(2) + expect(get_uploads(appearance, 'Appearance').count).to eq(2) end it 'uses the start and end batch ids [only 1st half]' do @@ -80,11 +82,11 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra subject.perform(start_id, end_id) end.to change { uploads.count }.from(4).to(6) - expect(user1.uploads.count).to eq(1) - expect(user2.uploads.count).to eq(1) - expect(appearance.uploads.count).to eq(2) - expect(project1.uploads.count).to eq(2) - expect(project2.uploads.count).to eq(0) + expect(get_uploads(user1, 'User').count).to eq(1) + expect(get_uploads(user2, 'User').count).to eq(1) + expect(get_uploads(appearance, 'Appearance').count).to eq(2) + expect(get_uploads(project1, 'Project').count).to eq(2) + expect(get_uploads(project2, 'Project').count).to eq(0) # Only 4 have been either confirmed or added to uploads expect(untracked_files_for_uploads.count).to eq(4) @@ -99,11 +101,11 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra subject.perform(start_id, end_id) end.to change { uploads.count }.from(4).to(6) - expect(user1.uploads.count).to eq(1) - expect(user2.uploads.count).to eq(0) - expect(appearance.uploads.count).to eq(1) - expect(project1.uploads.count).to eq(2) - expect(project2.uploads.count).to eq(2) + expect(get_uploads(user1, 'User').count).to eq(1) + expect(get_uploads(user2, 'User').count).to eq(0) + expect(get_uploads(appearance, 'Appearance').count).to eq(1) + expect(get_uploads(project1, 'Project').count).to eq(2) + expect(get_uploads(project2, 'Project').count).to eq(2) # Only 4 have been either confirmed or added to uploads expect(untracked_files_for_uploads.count).to eq(4) @@ -122,7 +124,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra end it 'does not block a whole batch because of one bad path' do - untracked_files_for_uploads.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{project2.full_path}/._7d37bf4c747916390e596744117d5d1a") + untracked_files_for_uploads.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{get_full_path(project2)}/._7d37bf4c747916390e596744117d5d1a") expect(untracked_files_for_uploads.count).to eq(9) expect(uploads.count).to eq(4) @@ -133,7 +135,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra end it 'an unparseable path is shown in error output' do - bad_path = "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{project2.full_path}/._7d37bf4c747916390e596744117d5d1a" + bad_path = "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{get_full_path(project2)}/._7d37bf4c747916390e596744117d5d1a" untracked_files_for_uploads.create!(path: bad_path) expect(Rails.logger).to receive(:error).with(/Error parsing path "#{bad_path}":/) @@ -152,103 +154,113 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra describe 'upload outcomes for each path pattern' do shared_examples_for 'non_markdown_file' do - let!(:expected_upload_attrs) { model.uploads.first.attributes.slice('path', 'uploader', 'size', 'checksum') } + let!(:expected_upload_attrs) { model_uploads.first.attributes.slice('path', 'uploader', 'size', 'checksum') } let!(:untracked_file) { untracked_files_for_uploads.create!(path: expected_upload_attrs['path']) } before do - model.uploads.delete_all + model_uploads.delete_all end it 'creates an Upload record' do expect do subject.perform(1, untracked_files_for_uploads.last.id) - end.to change { model.reload.uploads.count }.from(0).to(1) + end.to change { model_uploads.count }.from(0).to(1) - expect(model.uploads.first.attributes).to include(expected_upload_attrs) + expect(model_uploads.first.attributes).to include(expected_upload_attrs) end end context 'for an appearance logo file path' do - let(:model) { create_or_update_appearance(logo: uploaded_file) } + let(:model) { create_or_update_appearance(logo: true) } + let(:model_uploads) { get_uploads(model, 'Appearance') } it_behaves_like 'non_markdown_file' end context 'for an appearance header_logo file path' do - let(:model) { create_or_update_appearance(header_logo: uploaded_file) } + let(:model) { create_or_update_appearance(header_logo: true) } + let(:model_uploads) { get_uploads(model, 'Appearance') } it_behaves_like 'non_markdown_file' end context 'for a pre-Markdown Note attachment file path' do - let(:model) { create(:note, :with_attachment) } - let!(:expected_upload_attrs) { Upload.where(model_type: 'Note', model_id: model.id).first.attributes.slice('path', 'uploader', 'size', 'checksum') } + let(:model) { create_note(attachment: true) } + let!(:expected_upload_attrs) { get_uploads(model, 'Note').first.attributes.slice('path', 'uploader', 'size', 'checksum') } let!(:untracked_file) { untracked_files_for_uploads.create!(path: expected_upload_attrs['path']) } before do - Upload.where(model_type: 'Note', model_id: model.id).delete_all + get_uploads(model, 'Note').delete_all end # Can't use the shared example because Note doesn't have an `uploads` association it 'creates an Upload record' do expect do subject.perform(1, untracked_files_for_uploads.last.id) - end.to change { Upload.where(model_type: 'Note', model_id: model.id).count }.from(0).to(1) + end.to change { get_uploads(model, 'Note').count }.from(0).to(1) - expect(Upload.where(model_type: 'Note', model_id: model.id).first.attributes).to include(expected_upload_attrs) + expect(get_uploads(model, 'Note').first.attributes).to include(expected_upload_attrs) end end context 'for a user avatar file path' do - let(:model) { create(:user, :with_avatar) } + let(:model) { create_user(avatar: true) } + let(:model_uploads) { get_uploads(model, 'User') } it_behaves_like 'non_markdown_file' end context 'for a group avatar file path' do - let(:model) { create(:group, :with_avatar) } + let(:model) { create_group(avatar: true) } + let(:model_uploads) { get_uploads(model, 'Namespace') } it_behaves_like 'non_markdown_file' end context 'for a project avatar file path' do - let(:model) { create(:project, :legacy_storage, :with_avatar) } + let(:model) { create_project(avatar: true) } + let(:model_uploads) { get_uploads(model, 'Project') } it_behaves_like 'non_markdown_file' end context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - let(:model) { create(:project, :legacy_storage) } + let(:model) { create_project } before do # Upload the file - UploadService.new(model, uploaded_file, FileUploader).execute + add_markdown_attachment(model) # Create the untracked_files_for_uploads record - untracked_files_for_uploads.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{model.full_path}/#{model.uploads.first.path}") + untracked_files_for_uploads.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}/#{get_full_path(model)}/#{get_uploads(model, 'Project').first.path}") # Save the expected upload attributes - @expected_upload_attrs = model.reload.uploads.first.attributes.slice('path', 'uploader', 'size', 'checksum') + @expected_upload_attrs = get_uploads(model, 'Project').first.attributes.slice('path', 'uploader', 'size', 'checksum') # Untrack the file - model.reload.uploads.delete_all + get_uploads(model, 'Project').delete_all end it 'creates an Upload record' do expect do subject.perform(1, untracked_files_for_uploads.last.id) - end.to change { model.reload.uploads.count }.from(0).to(1) + end.to change { get_uploads(model, 'Project').count }.from(0).to(1) - expect(model.uploads.first.attributes).to include(@expected_upload_attrs) + expect(get_uploads(model, 'Project').first.attributes).to include(@expected_upload_attrs) end end end end -describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do +# Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. +describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile, :migration, schema: 20180208183958 do include TrackUntrackedUploadsHelpers - let(:upload_class) { Gitlab::BackgroundMigration::PopulateUntrackedUploads::Upload } + let!(:appearances) { table(:appearances) } + let!(:namespaces) { table(:namespaces) } + let!(:projects) { table(:projects) } + let!(:routes) { table(:routes) } + let!(:uploads) { table(:uploads) } before(:all) do ensure_temporary_tracking_table_exists @@ -299,10 +311,10 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do it 'returns the file path relative to the project directory in uploads' do - project = create(:project, :legacy_storage) + project = create_project random_hex = SecureRandom.hex - assert_upload_path("/#{project.full_path}/#{random_hex}/Some file.jpg", "#{random_hex}/Some file.jpg") + assert_upload_path("/#{get_full_path(project)}/#{random_hex}/Some file.jpg", "#{random_hex}/Some file.jpg") end end end @@ -352,9 +364,9 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do it 'returns FileUploader as a string' do - project = create(:project, :legacy_storage) + project = create_project - assert_uploader("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", 'FileUploader') + assert_uploader("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", 'FileUploader') end end end @@ -404,9 +416,9 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do it 'returns Project as a string' do - project = create(:project, :legacy_storage) + project = create_project - assert_model_type("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", 'Project') + assert_model_type("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", 'Project') end end end @@ -456,54 +468,42 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do it 'returns the ID as a string' do - project = create(:project, :legacy_storage) + project = create_project - assert_model_id("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", project.id) + assert_model_id("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", project.id) end end end describe '#file_size' do context 'for an appearance logo file path' do - let(:appearance) { create_or_update_appearance(logo: uploaded_file) } - let(:untracked_file) { described_class.create!(path: appearance.uploads.first.path) } + let(:appearance) { create_or_update_appearance(logo: true) } + let(:untracked_file) { described_class.create!(path: get_uploads(appearance, 'Appearance').first.path) } it 'returns the file size' do - expect(untracked_file.file_size).to eq(35255) - end - - it 'returns the same thing that CarrierWave would return' do - expect(untracked_file.file_size).to eq(appearance.logo.size) + expect(untracked_file.file_size).to eq(1062) end end context 'for a project avatar file path' do - let(:project) { create(:project, :legacy_storage, avatar: uploaded_file) } - let(:untracked_file) { described_class.create!(path: project.uploads.first.path) } + let(:project) { create_project(avatar: true) } + let(:untracked_file) { described_class.create!(path: get_uploads(project, 'Project').first.path) } it 'returns the file size' do - expect(untracked_file.file_size).to eq(35255) - end - - it 'returns the same thing that CarrierWave would return' do - expect(untracked_file.file_size).to eq(project.avatar.size) + expect(untracked_file.file_size).to eq(1062) end end context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - let(:project) { create(:project, :legacy_storage) } - let(:untracked_file) { create_untracked_file("/#{project.full_path}/#{project.uploads.first.path}") } + let(:project) { create_project } + let(:untracked_file) { create_untracked_file("/#{get_full_path(project)}/#{get_uploads(project, 'Project').first.path}") } before do - UploadService.new(project, uploaded_file, FileUploader).execute + add_markdown_attachment(project) end it 'returns the file size' do - expect(untracked_file.file_size).to eq(35255) - end - - it 'returns the same thing that CarrierWave would return' do - expect(untracked_file.file_size).to eq(project.uploads.first.size) + expect(untracked_file.file_size).to eq(1062) end end end diff --git a/spec/support/track_untracked_uploads_helpers.rb b/spec/support/track_untracked_uploads_helpers.rb index a8b3ed1f41c..16aa30f9871 100644 --- a/spec/support/track_untracked_uploads_helpers.rb +++ b/spec/support/track_untracked_uploads_helpers.rb @@ -1,16 +1,121 @@ module TrackUntrackedUploadsHelpers - def uploaded_file - fixture_path = Rails.root.join('spec/fixtures/rails_sample.jpg') - fixture_file_upload(fixture_path) + PUBLIC_DIR = File.join(Rails.root, 'tmp', 'tests', 'public') + UPLOADS_DIR = File.join(PUBLIC_DIR, 'uploads') + SYSTEM_DIR = File.join(UPLOADS_DIR, '-', 'system') + UPLOAD_FILENAME = 'image.png'.freeze + FIXTURE_FILE_PATH = File.join(Rails.root, 'spec', 'fixtures', 'dk.png') + FIXTURE_CHECKSUM = 'b804383982bb89b00e828e3f44c038cc991d3d1768009fc39ba8e2c081b9fb75'.freeze + + def create_or_update_appearance(logo: false, header_logo: false) + appearance = appearances.first_or_create(title: 'foo', description: 'bar', logo: (UPLOAD_FILENAME if logo), header_logo: (UPLOAD_FILENAME if header_logo)) + + add_upload(appearance, 'Appearance', 'logo', 'AttachmentUploader') if logo + add_upload(appearance, 'Appearance', 'header_logo', 'AttachmentUploader') if header_logo + + appearance + end + + def create_group(avatar: false) + index = unique_index(:group) + group = namespaces.create(name: "group#{index}", path: "group#{index}", avatar: (UPLOAD_FILENAME if avatar)) + + add_upload(group, 'Group', 'avatar', 'AvatarUploader') if avatar + + group + end + + def create_note(attachment: false) + note = notes.create(attachment: (UPLOAD_FILENAME if attachment)) + + add_upload(note, 'Note', 'attachment', 'AttachmentUploader') if attachment + + note + end + + def create_project(avatar: false) + group = create_group + project = projects.create(namespace_id: group.id, path: "project#{unique_index(:project)}", avatar: (UPLOAD_FILENAME if avatar)) + routes.create(path: "#{group.path}/#{project.path}", source_id: project.id, source_type: 'Project') # so Project.find_by_full_path works + + add_upload(project, 'Project', 'avatar', 'AvatarUploader') if avatar + + project + end + + def create_user(avatar: false) + user = users.create(email: "foo#{unique_index(:user)}@bar.com", avatar: (UPLOAD_FILENAME if avatar), projects_limit: 100) + + add_upload(user, 'User', 'avatar', 'AvatarUploader') if avatar + + user + end + + def unique_index(name = :unnamed) + @unique_index ||= {} + @unique_index[name] ||= 0 + @unique_index[name] += 1 + end + + def add_upload(model, model_type, attachment_type, uploader) + file_path = upload_file_path(model, model_type, attachment_type) + path_relative_to_public = file_path.sub("#{PUBLIC_DIR}/", '') + create_file(file_path) + + uploads.create!( + size: 1062, + path: path_relative_to_public, + model_id: model.id, + model_type: model_type == 'Group' ? 'Namespace' : model_type, + uploader: uploader, + checksum: FIXTURE_CHECKSUM + ) + end + + def add_markdown_attachment(project) + project_dir = project_uploads_dir(project) + attachment_dir = File.join(project_dir, SecureRandom.hex) + attachment_file_path = File.join(attachment_dir, UPLOAD_FILENAME) + project_attachment_path_relative_to_project = attachment_file_path.sub("#{project_dir}/", '') + create_file(attachment_file_path) + + uploads.create!( + size: 1062, + path: project_attachment_path_relative_to_project, + model_id: project.id, + model_type: 'Project', + uploader: 'FileUploader', + checksum: FIXTURE_CHECKSUM + ) + end + + def project_uploads_dir(project) + File.join(UPLOADS_DIR, project.full_path) + end + + def upload_file_path(model, model_type, attachment_type) + dir = File.join(upload_dir(model_type.downcase, attachment_type.to_s), model.id.to_s) + File.join(dir, UPLOAD_FILENAME) + end + + def upload_dir(model_type, attachment_type) + File.join(SYSTEM_DIR, model_type, attachment_type) + end + + def create_file(path) + File.delete(path) if File.exist?(path) + FileUtils.mkdir_p(File.dirname(path)) + FileUtils.cp(FIXTURE_FILE_PATH, path) + end + + def get_uploads(model, model_type) + uploads.where(model_type: model_type, model_id: model.id) + end + + def get_full_path(project) + routes.find_by(source_id: project.id, source_type: 'Project').path end def ensure_temporary_tracking_table_exists Gitlab::BackgroundMigration::PrepareUntrackedUploads.new.send(:ensure_temporary_tracking_table_exists) end - - def create_or_update_appearance(attrs) - a = Appearance.first_or_initialize(title: 'foo', description: 'bar') - a.update!(attrs) - a - end end From 293c51e39900efc8ea2e5ac77af680419f89862d Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Thu, 15 Feb 2018 14:22:38 -0800 Subject: [PATCH 04/81] Remove more BG migration spec dependencies For the `PrepareUntrackedUploads` spec. --- .../populate_untracked_uploads_spec.rb | 4 +-- .../prepare_untracked_uploads_spec.rb | 26 +++++++++++-------- .../track_untracked_uploads_helpers.rb | 13 +++++++--- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb index 23c602a3297..a098add401a 100644 --- a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb @@ -38,8 +38,8 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra untracked_files_for_uploads.create!(path: get_uploads(user2, 'User').first.path) untracked_files_for_uploads.create!(path: get_uploads(project1, 'Project').first.path) untracked_files_for_uploads.create!(path: get_uploads(project2, 'Project').first.path) - untracked_files_for_uploads.create!(path: "#{project_uploads_dir(project1).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project1, 'Project').last.path}") - untracked_files_for_uploads.create!(path: "#{project_uploads_dir(project2).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project2, 'Project').last.path}") + untracked_files_for_uploads.create!(path: "#{legacy_project_uploads_dir(project1).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project1, 'Project').last.path}") + untracked_files_for_uploads.create!(path: "#{legacy_project_uploads_dir(project2).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project2, 'Project').last.path}") # Untrack 4 files get_uploads(user2, 'User').delete_all diff --git a/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb index ca77e64ae40..e66b163f2ff 100644 --- a/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb @@ -1,10 +1,16 @@ require 'spec_helper' -describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq, :migration, schema: 20180129193323 do +# Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. +describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq, :migration, schema: 20180208183958 do include TrackUntrackedUploadsHelpers - include MigrationsHelpers let!(:untracked_files_for_uploads) { described_class::UntrackedFile } + let!(:appearances) { table(:appearances) } + let!(:namespaces) { table(:namespaces) } + let!(:projects) { table(:projects) } + let!(:routes) { table(:routes) } + let!(:uploads) { table(:uploads) } + let!(:users) { table(:users) } around do |example| # Especially important so the follow-up migration does not get run @@ -15,19 +21,17 @@ describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq, :migrat shared_examples 'prepares the untracked_files_for_uploads table' do context 'when files were uploaded before and after hashed storage was enabled' do - let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) } - let!(:user) { create(:user, :with_avatar) } - let!(:project1) { create(:project, :with_avatar, :legacy_storage) } - let(:project2) { create(:project) } # instantiate after enabling hashed_storage + let!(:appearance) { create_or_update_appearance(logo: true, header_logo: true) } + let!(:user) { create_user(avatar: true) } + let!(:project1) { create_project(avatar: true) } + let(:project2) { create_project } # instantiate after enabling hashed_storage before do # Markdown upload before enabling hashed_storage - UploadService.new(project1, uploaded_file, FileUploader).execute - - stub_application_setting(hashed_storage_enabled: true) + add_markdown_attachment(project1) # Markdown upload after enabling hashed_storage - UploadService.new(project2, uploaded_file, FileUploader).execute + add_markdown_attachment(project2, hashed_storage: true) end it 'has a path field long enough for really long paths' do @@ -61,7 +65,7 @@ describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq, :migrat it 'does not add hashed files to the untracked_files_for_uploads table' do described_class.new.perform - hashed_file_path = project2.uploads.where(uploader: 'FileUploader').first.path + hashed_file_path = get_uploads(project2, 'Project').where(uploader: 'FileUploader').first.path expect(untracked_files_for_uploads.where("path like '%#{hashed_file_path}%'").exists?).to be_falsey end diff --git a/spec/support/track_untracked_uploads_helpers.rb b/spec/support/track_untracked_uploads_helpers.rb index 16aa30f9871..87a86dd21af 100644 --- a/spec/support/track_untracked_uploads_helpers.rb +++ b/spec/support/track_untracked_uploads_helpers.rb @@ -71,8 +71,8 @@ module TrackUntrackedUploadsHelpers ) end - def add_markdown_attachment(project) - project_dir = project_uploads_dir(project) + def add_markdown_attachment(project, hashed_storage: false) + project_dir = hashed_storage ? hashed_project_uploads_dir(project) : legacy_project_uploads_dir(project) attachment_dir = File.join(project_dir, SecureRandom.hex) attachment_file_path = File.join(attachment_dir, UPLOAD_FILENAME) project_attachment_path_relative_to_project = attachment_file_path.sub("#{project_dir}/", '') @@ -88,8 +88,13 @@ module TrackUntrackedUploadsHelpers ) end - def project_uploads_dir(project) - File.join(UPLOADS_DIR, project.full_path) + def legacy_project_uploads_dir(project) + namespace = namespaces.find_by(id: project.namespace_id) + File.join(UPLOADS_DIR, namespace.path, project.path) + end + + def hashed_project_uploads_dir(project) + File.join(UPLOADS_DIR, '@hashed', 'aa', 'aaaaaaaaaaaa') end def upload_file_path(model, model_type, attachment_type) From 3219afff5741511b5ab544fd141207e13028f93a Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Fri, 16 Feb 2018 11:58:59 -0800 Subject: [PATCH 05/81] Make :migration specs a little more robust E.g. https://gitlab.com/gitlab-org/gitlab-ce/-/jobs/52873034 --- spec/spec_helper.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 85de0a14631..5600c9c6ad5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -154,6 +154,22 @@ RSpec.configure do |config| Sidekiq.redis(&:flushall) end + # The :each scope runs "inside" the example, so this hook ensures the DB is in the + # correct state before any examples' before hooks are called. This prevents a + # problem where `ScheduleIssuesClosedAtTypeChange` (or any migration that depends + # on background migrations being run inline during test setup) can be broken by + # altering Sidekiq behavior in an unrelated spec like so: + # + # around do |example| + # Sidekiq::Testing.fake! do + # example.run + # end + # end + config.before(:context, :migration) do + schema_migrate_down! + end + + # Each example may call `migrate!`, so we must ensure we are migrated down every time config.before(:each, :migration) do schema_migrate_down! end From 01f5035bfe2c2fa6cc71564e8a02fbcb325e3370 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Mon, 19 Feb 2018 15:11:10 +0000 Subject: [PATCH 06/81] Fix squash with renamed files We need to ignore the names for renamed files when configuring with sparse checkout. --- .../fix-squash-with-renamed-files.yml | 5 +++ lib/gitlab/git/repository.rb | 2 +- spec/lib/gitlab/git/repository_spec.rb | 31 ++++++++++++++++--- 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 changelogs/unreleased/fix-squash-with-renamed-files.yml diff --git a/changelogs/unreleased/fix-squash-with-renamed-files.yml b/changelogs/unreleased/fix-squash-with-renamed-files.yml new file mode 100644 index 00000000000..f7cd3a84367 --- /dev/null +++ b/changelogs/unreleased/fix-squash-with-renamed-files.yml @@ -0,0 +1,5 @@ +--- +title: Fix squashing when a file is renamed +merge_request: +author: +type: fixed diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index a10bc0dd32b..4261f028d35 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -2188,7 +2188,7 @@ module Gitlab ) diff_range = "#{start_sha}...#{end_sha}" diff_files = run_git!( - %W(diff --name-only --diff-filter=a --binary #{diff_range}) + %W(diff --name-only --diff-filter=ar --binary #{diff_range}) ).chomp with_worktree(squash_path, branch, sparse_checkout_files: diff_files, env: env) do diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 0e9150964fa..0482c48bde8 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -2204,7 +2204,7 @@ describe Gitlab::Git::Repository, seed_helper: true do context 'sparse checkout', :skip_gitaly_mock do let(:expected_files) { %w(files files/js files/js/application.js) } - before do + it 'checks out only the files in the diff' do allow(repository).to receive(:with_worktree).and_wrap_original do |m, *args| m.call(*args) do worktree_path = args[0] @@ -2216,10 +2216,33 @@ describe Gitlab::Git::Repository, seed_helper: true do expect(Dir[files_pattern]).to eq(expected) end end + + subject end - it 'checkouts only the files in the diff' do - subject + context 'when the diff contains a rename' do + let(:repo) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged } + let(:end_sha) { new_commit_move_file(repo).oid } + + after do + # Erase our commits so other tests get the original repo + repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged + repo.references.update('refs/heads/master', SeedRepo::LastCommit::ID) + end + + it 'does not include the renamed file in the sparse checkout' do + allow(repository).to receive(:with_worktree).and_wrap_original do |m, *args| + m.call(*args) do + worktree_path = args[0] + files_pattern = File.join(worktree_path, '**', '*') + + expect(Dir[files_pattern]).not_to include('CHANGELOG') + expect(Dir[files_pattern]).not_to include('encoding/CHANGELOG') + end + end + + subject + end end end @@ -2230,7 +2253,7 @@ describe Gitlab::Git::Repository, seed_helper: true do allow(repository).to receive(:run_git!).and_call_original allow(repository).to receive(:run_git!).with(%W(diff --binary #{start_sha}...#{end_sha})).and_return(diff.force_encoding('ASCII-8BIT')) - expect(subject.length).to eq(40) + expect(subject).to match(/\h{40}/) end end end From c8fb31f72436e9d88809547c60ba8da0b081061d Mon Sep 17 00:00:00 2001 From: Diana Stanley Date: Mon, 19 Feb 2018 16:01:23 -0800 Subject: [PATCH 07/81] add lines describing how to find user clone/fetch activity --- doc/administration/logs.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/administration/logs.md b/doc/administration/logs.md index debaa2330d0..1b42d7979ed 100644 --- a/doc/administration/logs.md +++ b/doc/administration/logs.md @@ -32,6 +32,8 @@ In this example, you can see this was a GET request for a specific issue. Notice 2. `view`: total time taken inside the Rails views 3. `db`: total time to retrieve data from the database +User clone/fetch activity using http transport appears in this log as `action: git_upload_pack`. + In addition, the log contains the IP address from which the request originated (`remote_ip`) as well as the user's ID (`user_id`), and username (`username`). @@ -157,6 +159,8 @@ I, [2015-02-13T06:17:00.671315 #9291] INFO -- : Adding project root/example.git I, [2015-02-13T06:17:00.679433 #9291] INFO -- : Moving existing hooks directory and symlinking global hooks directory for /var/opt/gitlab/git-data/repositories/root/example.git. ``` +User clone/fetch activity using ssh transport appears in this log as `executing git command Date: Tue, 20 Feb 2018 09:36:57 -0600 Subject: [PATCH 08/81] Switch back to using a single partial See https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/16900#note_59334967 https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/16900#note_59714883 --- app/views/projects/_stat_anchor_list.html.haml | 9 ++++++++- app/views/projects/_stat_anchor_list_item.html.haml | 7 ------- 2 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 app/views/projects/_stat_anchor_list_item.html.haml diff --git a/app/views/projects/_stat_anchor_list.html.haml b/app/views/projects/_stat_anchor_list.html.haml index 9ca51f8d68c..1f237c645bc 100644 --- a/app/views/projects/_stat_anchor_list.html.haml +++ b/app/views/projects/_stat_anchor_list.html.haml @@ -2,4 +2,11 @@ - if anchors.size > 0 %ul.nav - = render partial: 'stat_anchor_list_item', collection: anchors, as: :anchor + - anchors.each do |anchor| + %li + - if anchor[:link] + = link_to anchor[:link], class: anchor[:enabled] ? 'stat-link' : "btn btn-#{anchor[:class_modifier] || 'missing'}" do + = anchor[:label] + - else + %span.stat-text + = anchor[:label] diff --git a/app/views/projects/_stat_anchor_list_item.html.haml b/app/views/projects/_stat_anchor_list_item.html.haml deleted file mode 100644 index 404dd24599f..00000000000 --- a/app/views/projects/_stat_anchor_list_item.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%li - - if anchor[:link] - = link_to anchor[:link], class: anchor[:enabled] ? 'stat-link' : "btn btn-#{anchor[:class_modifier] || 'missing'}" do - = anchor[:label] - - else - %span.stat-text - = anchor[:label] From e0e3f1c2750b6db9343d530d00b096bcb1a57677 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Tue, 20 Feb 2018 11:56:36 -0300 Subject: [PATCH 09/81] Move button list logic to project presenter --- app/helpers/application_helper.rb | 2 +- app/helpers/branches_helper.rb | 6 - app/helpers/preferences_helper.rb | 26 -- app/helpers/projects_helper.rb | 307 ---------------- app/helpers/tree_helper.rb | 2 +- app/models/project.rb | 7 + app/presenters/project_presenter.rb | 359 +++++++++++++++++++ app/views/projects/_readme.html.haml | 2 +- app/views/projects/buttons/_koding.html.haml | 2 +- app/views/projects/empty.html.haml | 5 +- app/views/projects/show.html.haml | 8 +- app/views/shared/issuable/_form.html.haml | 2 +- spec/features/projects/show_project_spec.rb | 12 +- spec/helpers/projects_helper_spec.rb | 26 -- spec/presenters/project_presenter_spec.rb | 31 ++ 15 files changed, 416 insertions(+), 381 deletions(-) create mode 100644 app/presenters/project_presenter.rb create mode 100644 spec/presenters/project_presenter_spec.rb diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6530327698b..479797231cc 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -34,7 +34,7 @@ module ApplicationHelper def project_icon(project_id, options = {}) project = - if project_id.is_a?(Project) + if project_id.is_a?(Project) || project_id.is_a?(ProjectPresenter) project_id else Project.find_by_full_path(project_id) diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index 2641a98e29e..00b9a0e00eb 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -10,12 +10,6 @@ module BranchesHelper project_branches_path(@project, @id, options) end - def can_push_branch?(project, branch_name) - return false unless project.repository.branch_exists?(branch_name) - - ::Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(branch_name) - end - def project_branches options_for_select(@project.repository.branch_names, @project.default_branch) end diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index aaee6eaeedd..373dfd457f7 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -48,30 +48,4 @@ module PreferencesHelper def user_color_scheme Gitlab::ColorSchemes.for_user(current_user).css_class end - - def default_project_view - return anonymous_project_view unless current_user - - user_view = current_user.project_view - - if can?(current_user, :download_code, @project) - user_view - elsif user_view == "activity" - "activity" - elsif can?(current_user, :read_wiki, @project) - "wiki" - elsif @project.feature_available?(:issues, current_user) - "projects/issues/issues" - else - "customize_workflow" - end - end - - def anonymous_project_view - if !@project.empty_repo? && can?(current_user, :download_code, @project) - 'files' - else - 'activity' - end - end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 0c64b8abec3..fa6811dccbf 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -153,11 +153,6 @@ module ProjectsHelper end end - def license_short_name(project) - license = project.repository.license - license&.nickname || license&.name || 'LICENSE' - end - def last_push_event current_user&.recent_push(@project) end @@ -386,55 +381,6 @@ module ProjectsHelper end end - def add_special_file_path(project, file_name:, commit_message: nil, branch_name: nil, context: nil) - commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name } - project_new_blob_path( - project, - project.default_branch || 'master', - file_name: file_name, - commit_message: commit_message, - branch_name: branch_name, - context: context - ) - end - - def add_koding_stack_path(project) - project_new_blob_path( - project, - project.default_branch || 'master', - file_name: '.koding.yml', - commit_message: "Add Koding stack script", - content: <<-CONTENT.strip_heredoc - provider: - aws: - access_key: '${var.aws_access_key}' - secret_key: '${var.aws_secret_key}' - resource: - aws_instance: - #{project.path}-vm: - instance_type: t2.nano - user_data: |- - - # Created by GitLab UI for :> - - echo _KD_NOTIFY_@Installing Base packages...@ - - apt-get update -y - apt-get install git -y - - echo _KD_NOTIFY_@Cloning #{project.name}...@ - - export KODING_USER=${var.koding_user_username} - export REPO_URL=#{root_url}${var.koding_queryString_repo}.git - export BRANCH=${var.koding_queryString_branch} - - sudo -i -u $KODING_USER git clone $REPO_URL -b $BRANCH - - echo _KD_NOTIFY_@#{project.name} cloned.@ - CONTENT - ) - end - def koding_project_url(project = nil, branch = nil, sha = nil) if project import_path = "/Home/Stacks/import" @@ -451,36 +397,6 @@ module ProjectsHelper Gitlab::CurrentSettings.koding_url end - def contribution_guide_path(project) - if project && contribution_guide = project.repository.contribution_guide - project_blob_path( - project, - tree_join(project.default_branch, - contribution_guide.name) - ) - end - end - - def readme_path(project) - filename_path(project, :readme) - end - - def changelog_path(project) - filename_path(project, :changelog) - end - - def license_path(project) - filename_path(project, :license_blob) - end - - def version_path(project) - filename_path(project, :version) - end - - def ci_configuration_path(project) - filename_path(project, :gitlab_ci_yml) - end - def project_wiki_path_with_version(proj, page, version, is_newest) url_params = is_newest ? {} : { version_id: version } project_wiki_path(proj, page, url_params) @@ -506,15 +422,6 @@ module ProjectsHelper @ref || @repository.try(:root_ref) end - def filename_path(project, filename) - if project && blob = project.repository.public_send(filename) # rubocop:disable GitlabSecurity/PublicSend - project_blob_path( - project, - tree_join(project.default_branch, blob.name) - ) - end - end - def sanitize_repo_path(project, message) return '' unless message.present? @@ -604,218 +511,4 @@ module ProjectsHelper project_find_file_path(@project, ref) end - - def can_current_user_push_code?(project) - project.empty_repo? ? can?(current_user, :push_code, project) : can_push_branch?(project, project.default_branch) - end - - def files_anchor_data(project) - { - enabled: true, - label: _('Files (%{human_size})') % { human_size: storage_counter(@project.statistics.total_repository_size) }, - link: project_tree_path(@project) - } - end - - def commits_anchor_data(project) - { - enabled: true, - label: n_('Commit (%{commit_count})', 'Commits (%{commit_count})', @project.statistics.commit_count) % { commit_count: number_with_delimiter(@project.statistics.commit_count) }, - link: project_commits_path(@project, current_ref) - } - end - - def branches_anchor_data(project) - { - enabled: true, - label: n_('Branch (%{branch_count})', 'Branches (%{branch_count})', @repository.branch_count) % { branch_count: number_with_delimiter(@repository.branch_count) }, - link: project_branches_path(@project) - } - end - - def tags_anchor_data(project) - { - enabled: true, - label: n_('Tag (%{tag_count})', 'Tags (%{tag_count})', @repository.tag_count) % { tag_count: number_with_delimiter(@repository.tag_count) }, - link: project_tags_path(@project) - } - end - - def new_file_anchor_data(project) - if current_user && can_current_user_push_code?(project) - { - enabled: false, - label: _('New file'), - link: project_new_blob_path(project, project.default_branch || 'master'), - class_modifier: 'new' - } - end - end - - def readme_anchor_data(project) - if current_user && can_current_user_push_code?(project) && project.repository.readme.blank? - { - enabled: false, - label: _('Add Readme'), - link: add_special_file_path(project, file_name: 'README.md') - } - elsif project.repository.readme.present? - { - enabled: true, - label: _('Readme'), - link: default_project_view != 'readme' ? readme_path(@project) : '#readme' - } - end - end - - def changelog_anchor_data(project) - if current_user && can_current_user_push_code?(project) && project.repository.changelog.blank? - { - enabled: false, - label: _('Add Changelog'), - link: add_special_file_path(project, file_name: 'CHANGELOG') - } - elsif project.repository.changelog.present? - { - enabled: true, - label: _('Changelog'), - link: changelog_path(project) - } - end - end - - def license_anchor_data(project) - if current_user && can_current_user_push_code?(project) && project.repository.license_blob.blank? - { - enabled: false, - label: _('Add License'), - link: add_special_file_path(project, file_name: 'LICENSE') - } - elsif project.repository.license_blob.present? - { - enabled: true, - label: license_short_name(project), - link: license_path(project) - } - end - end - - def contribution_guide_anchor_data(project) - if current_user && can_current_user_push_code?(project) && project.repository.contribution_guide.blank? - { - enabled: false, - label: _('Add Contribution guide'), - link: add_special_file_path(project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') - } - elsif project.repository.contribution_guide.present? - { - enabled: true, - label: _('Contribution guide'), - link: contribution_guide_path(@project) - } - end - end - - def autodevops_anchor_data(project, ignore_callout: false) - if current_user && can?(current_user, :admin_pipeline, project) && project.repository.gitlab_ci_yml.blank? && (ignore_callout || !show_auto_devops_callout?(project)) - { - enabled: project.auto_devops_enabled?, - label: project.auto_devops_enabled? ? _('Auto DevOps enabled') : _('Enable Auto DevOps'), - link: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings') - } - elsif project.auto_devops_enabled? - { - enabled: true, - label: _('Auto DevOps enabled'), - link: nil - } - end - end - - def kubernetes_cluster_anchor_data(project) - if current_user && can?(current_user, :create_cluster, project) - cluster_link = project.clusters.size == 1 ? project_cluster_path(project, project.clusters.first) : project_clusters_path(project) - - if project.clusters.empty? - cluster_link = new_project_cluster_path(project) - end - - { - enabled: !project.clusters.empty?, - label: project.clusters.empty? ? _('Add Kubernetes cluster') : n_('Kubernetes cluster', 'Kubernetes clusters', project.clusters.size), - link: cluster_link - } - end - end - - def gitlab_ci_anchor_data(project) - if current_user && can_current_user_push_code?(project) && project.repository.gitlab_ci_yml.blank? && !project.auto_devops_enabled? - { - enabled: false, - label: _('Set up CI/CD'), - link: add_special_file_path(project, file_name: '.gitlab-ci.yml') - } - elsif project.repository.gitlab_ci_yml.present? - { - enabled: true, - label: _('CI/CD configuration'), - link: ci_configuration_path(@project) - } - end - end - - def koding_anchor_data(project) - if current_user && can_current_user_push_code?(project) && koding_enabled? && project.repository.koding_yml.blank? - { - enabled: false, - label: _('Set up Koding'), - link: add_koding_stack_path(project) - } - end - end - - def empty_project_stat_anchor_items(project) - [ - autodevops_anchor_data(project, ignore_callout: true), - kubernetes_cluster_anchor_data(project) - ].compact.reject { |i| !i[:enabled] } - end - - def empty_project_stat_button_items(project) - [ - new_file_anchor_data(project), - readme_anchor_data(project), - license_anchor_data(project), - autodevops_anchor_data(project, ignore_callout: true), - kubernetes_cluster_anchor_data(project) - ].compact.reject { |i| i[:enabled] } - end - - def project_stat_anchor_items(project) - [ - files_anchor_data(project), - commits_anchor_data(project), - branches_anchor_data(project), - tags_anchor_data(project), - readme_anchor_data(project), - changelog_anchor_data(project), - license_anchor_data(project), - contribution_guide_anchor_data(project), - gitlab_ci_anchor_data(project), - autodevops_anchor_data(project), - kubernetes_cluster_anchor_data(project) - ].compact.reject { |i| !i[:enabled] } - end - - def project_stat_button_items(project) - [ - changelog_anchor_data(project), - license_anchor_data(project), - contribution_guide_anchor_data(project), - autodevops_anchor_data(project), - kubernetes_cluster_anchor_data(project), - gitlab_ci_anchor_data(project), - koding_anchor_data(project) - ].compact.reject { |i| i[:enabled] } - end end diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index d39cac0f510..0a4da0ef3fc 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -55,7 +55,7 @@ module TreeHelper def tree_edit_branch(project = @project, ref = @ref) return unless can_edit_tree?(project, ref) - if can_push_branch?(project, ref) + if project.user_can_push_to_branch?(current_user, ref) ref else project = tree_edit_project(project) diff --git a/app/models/project.rb b/app/models/project.rb index 3893b1818f3..03640d7d18b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -15,6 +15,7 @@ class Project < ActiveRecord::Base include ValidAttribute include ProjectFeaturesCompatibility include SelectForProjectAuthorization + include Presentable include Routable include GroupDescendant include Gitlab::SQL::Pattern @@ -1015,6 +1016,12 @@ class Project < ActiveRecord::Base !ProtectedBranch.default_branch_protected? || team.max_member_access(user.id) > Gitlab::Access::DEVELOPER end + def user_can_push_to_branch?(user, branch_name) + return false unless repository.branch_exists?(branch_name) + + ::Gitlab::UserAccess.new(user, project: self).can_push_to_branch?(branch_name) + end + def forked? return true if fork_network && fork_network.root_project != self diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb new file mode 100644 index 00000000000..c76a529f56b --- /dev/null +++ b/app/presenters/project_presenter.rb @@ -0,0 +1,359 @@ +class ProjectPresenter < Gitlab::View::Presenter::Delegated + include ActionView::Helpers::NumberHelper + include ActionView::Helpers::UrlHelper + include GitlabRoutingHelper + include StorageHelper + include TreeHelper + + presents :project + + def project_stat_anchor_items(show_auto_devops_callout:) + [ + files_anchor_data, + commits_anchor_data, + branches_anchor_data, + tags_anchor_data, + readme_anchor_data, + changelog_anchor_data, + license_anchor_data, + contribution_guide_anchor_data, + gitlab_ci_anchor_data, + autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout), + kubernetes_cluster_anchor_data + ].compact.reject { |i| !i[:enabled] } + end + + def project_stat_button_items(show_auto_devops_callout:) + [ + changelog_anchor_data, + license_anchor_data, + contribution_guide_anchor_data, + autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout), + kubernetes_cluster_anchor_data, + gitlab_ci_anchor_data, + koding_anchor_data + ].compact.reject { |i| i[:enabled] } + end + + def empty_project_stat_anchor_items + [ + autodevops_anchor_data, + kubernetes_cluster_anchor_data + ].compact.reject { |i| !i[:enabled] } + end + + def empty_project_stat_button_items + [ + new_file_anchor_data, + readme_anchor_data, + license_anchor_data, + autodevops_anchor_data, + kubernetes_cluster_anchor_data + ].compact.reject { |i| i[:enabled] } + end + + def default_project_view + return anonymous_project_view unless current_user + + user_view = current_user.project_view + + if can?(current_user, :download_code, project) + user_view + elsif user_view == "activity" + "activity" + elsif can?(current_user, :read_wiki, project) + "wiki" + elsif feature_available?(:issues, current_user) + "projects/issues/issues" + else + "customize_workflow" + end + end + + def readme_path + filename_path(:readme) + end + + def changelog_path + filename_path(:changelog) + end + + def license_path + filename_path(:license_blob) + end + + def ci_configuration_path + filename_path(:gitlab_ci_yml) + end + + def contribution_guide_path + if project && contribution_guide = repository.contribution_guide + project_blob_path( + project, + tree_join(project.default_branch, + contribution_guide.name) + ) + end + end + + def add_license_path + add_special_file_path(file_name: 'LICENSE') + end + + def add_ci_yml_path + add_special_file_path(file_name: '.gitlab-ci.yml') + end + + def add_readme_path + add_special_file_path(file_name: 'README.md') + end + + def add_koding_stack_path + project_new_blob_path( + project, + default_branch || 'master', + file_name: '.koding.yml', + commit_message: "Add Koding stack script", + content: <<-CONTENT.strip_heredoc + provider: + aws: + access_key: '${var.aws_access_key}' + secret_key: '${var.aws_secret_key}' + resource: + aws_instance: + #{project.path}-vm: + instance_type: t2.nano + user_data: |- + + # Created by GitLab UI for :> + + echo _KD_NOTIFY_@Installing Base packages...@ + + apt-get update -y + apt-get install git -y + + echo _KD_NOTIFY_@Cloning #{project.name}...@ + + export KODING_USER=${var.koding_user_username} + export REPO_URL=#{root_url}${var.koding_queryString_repo}.git + export BRANCH=${var.koding_queryString_branch} + + sudo -i -u $KODING_USER git clone $REPO_URL -b $BRANCH + + echo _KD_NOTIFY_@#{project.name} cloned.@ + CONTENT + ) + end + + def license_short_name + license = repository.license + license&.nickname || license&.name || 'LICENSE' + end + + private + + def filename_path(filename) + if blob = repository.public_send(filename) # rubocop:disable GitlabSecurity/PublicSend + project_blob_path( + project, + tree_join(default_branch, blob.name) + ) + end + end + + def anonymous_project_view + if !project.empty_repo? && can?(current_user, :download_code, project) + 'files' + else + 'activity' + end + end + + def add_special_file_path(file_name:, commit_message: nil, branch_name: nil) + commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name } + project_new_blob_path( + project, + project.default_branch || 'master', + file_name: file_name, + commit_message: commit_message, + branch_name: branch_name + ) + end + + def can_current_user_push_code? + if empty_repo? + can?(current_user, :push_code, project) + else + user_can_push_to_branch?(current_user, default_branch) + end + end + + def files_anchor_data + { + enabled: true, + label: _('Files (%{human_size})') % { human_size: storage_counter(statistics.total_repository_size) }, + link: project_tree_path(project) + } + end + + def commits_anchor_data + { + enabled: true, + label: n_('Commit (%{commit_count})', 'Commits (%{commit_count})', statistics.commit_count) % { commit_count: number_with_delimiter(statistics.commit_count) }, + link: project_commits_path(project, repository.root_ref) + } + end + + def branches_anchor_data + { + enabled: true, + label: n_('Branch (%{branch_count})', 'Branches (%{branch_count})', repository.branch_count) % { branch_count: number_with_delimiter(repository.branch_count) }, + link: project_branches_path(project) + } + end + + def tags_anchor_data + { + enabled: true, + label: n_('Tag (%{tag_count})', 'Tags (%{tag_count})', repository.tag_count) % { tag_count: number_with_delimiter(repository.tag_count) }, + link: project_tags_path(project) + } + end + + def new_file_anchor_data + if current_user && can_current_user_push_code? + { + enabled: false, + label: _('New file'), + link: project_new_blob_path(project, default_branch || 'master'), + class_modifier: 'new' + } + end + end + + def readme_anchor_data + if current_user && can_current_user_push_code? && repository.readme.blank? + { + enabled: false, + label: _('Add Readme'), + link: add_readme_path + } + elsif repository.readme.present? + { + enabled: true, + label: _('Readme'), + link: default_project_view != 'readme' ? readme_path : '#readme' + } + end + end + + def changelog_anchor_data + if current_user && can_current_user_push_code? && repository.changelog.blank? + { + enabled: false, + label: _('Add Changelog'), + link: add_special_file_path(file_name: 'CHANGELOG') + } + elsif repository.changelog.present? + { + enabled: true, + label: _('Changelog'), + link: changelog_path + } + end + end + + def license_anchor_data + if current_user && can_current_user_push_code? && repository.license_blob.blank? + { + enabled: false, + label: _('Add License'), + link: add_license_path + } + elsif repository.license_blob.present? + { + enabled: true, + label: license_short_name, + link: license_path + } + end + end + + def contribution_guide_anchor_data + if current_user && can_current_user_push_code? && repository.contribution_guide.blank? + { + enabled: false, + label: _('Add Contribution guide'), + link: add_special_file_path(file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') + } + elsif repository.contribution_guide.present? + { + enabled: true, + label: _('Contribution guide'), + link: contribution_guide_path + } + end + end + + def autodevops_anchor_data(show_auto_devops_callout: false) + if current_user && can?(current_user, :admin_pipeline, project) && repository.gitlab_ci_yml.blank? && !show_auto_devops_callout + { + enabled: auto_devops_enabled?, + label: auto_devops_enabled? ? _('Auto DevOps enabled') : _('Enable Auto DevOps'), + link: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings') + } + elsif auto_devops_enabled? + { + enabled: true, + label: _('Auto DevOps enabled'), + link: nil + } + end + end + + def kubernetes_cluster_anchor_data + if current_user && can?(current_user, :create_cluster, project) + cluster_link = clusters.size == 1 ? project_cluster_path(project, clusters.first) : project_clusters_path(project) + + if clusters.empty? + cluster_link = new_project_cluster_path(project) + end + + { + enabled: !clusters.empty?, + label: clusters.empty? ? _('Add Kubernetes cluster') : n_('Kubernetes cluster', 'Kubernetes clusters', clusters.size), + link: cluster_link + } + end + end + + def gitlab_ci_anchor_data + if current_user && can_current_user_push_code? && repository.gitlab_ci_yml.blank? && !auto_devops_enabled? + { + enabled: false, + label: _('Set up CI/CD'), + link: add_ci_yml_path + } + elsif repository.gitlab_ci_yml.present? + { + enabled: true, + label: _('CI/CD configuration'), + link: ci_configuration_path + } + end + end + + def koding_anchor_data + if current_user && can_current_user_push_code? && koding_enabled? && repository.koding_yml.blank? + { + enabled: false, + label: _('Set up Koding'), + link: add_koding_stack_path + } + end + end + + def koding_enabled? + Gitlab::CurrentSettings.koding_enabled? + end +end diff --git a/app/views/projects/_readme.html.haml b/app/views/projects/_readme.html.haml index aebdfbc8218..705338c083e 100644 --- a/app/views/projects/_readme.html.haml +++ b/app/views/projects/_readme.html.haml @@ -20,4 +20,4 @@ distributed with computer software, forming part of its documentation. GitLab will render it here instead of this message. %p - = link_to "Add Readme", add_special_file_path(@project, file_name: 'README.md'), class: 'btn btn-new' + = link_to "Add Readme", @project.add_readme_path, class: 'btn btn-new' diff --git a/app/views/projects/buttons/_koding.html.haml b/app/views/projects/buttons/_koding.html.haml index de2d61d4aa3..b9cec834ab4 100644 --- a/app/views/projects/buttons/_koding.html.haml +++ b/app/views/projects/buttons/_koding.html.haml @@ -1,3 +1,3 @@ -- if koding_enabled? && current_user && @repository.koding_yml && can_push_branch?(@project, @project.default_branch) +- if koding_enabled? && current_user && @repository.koding_yml && @project.user_can_push_to_branch?(current_user, @project.default_branch) = link_to koding_project_url(@project), class: 'btn project-action-button inline', target: '_blank', rel: 'noopener noreferrer' do _('Run in IDE (Koding)') diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 01fb9dab313..b4f91f447f9 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,5 +1,6 @@ - @no_container = true - breadcrumb_title "Details" +- @project = @project.present(current_user: current_user) = render partial: 'flash_messages', locals: { project: @project } @@ -32,8 +33,8 @@ .prepend-top-20 %nav.project-stats{ class: container_class } - = render 'stat_anchor_list', anchors: empty_project_stat_anchor_items(@project) - = render 'stat_anchor_list', anchors: empty_project_stat_button_items(@project) + = render 'stat_anchor_list', anchors: @project.empty_project_stat_anchor_items + = render 'stat_anchor_list', anchors: @project.empty_project_stat_button_items - if can?(current_user, :push_code, @project) %div{ class: [container_class, ("limit-container-width-sm" unless fluid_layout)] } diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 3d23b19b815..385a3b490a4 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,6 +1,8 @@ +- project_stat_items_args = { show_auto_devops_callout: show_auto_devops_callout?(@project) } - @no_container = true - breadcrumb_title "Details" - @content_class = "limit-container-width" unless fluid_layout +- @project = @project.present(current_user: current_user) = content_for :meta_tags do = auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity") @@ -14,8 +16,8 @@ - if can?(current_user, :download_code, @project) %nav.project-stats{ class: container_class } - = render 'stat_anchor_list', anchors: project_stat_anchor_items(@project) - = render 'stat_anchor_list', anchors: project_stat_button_items(@project) + = render 'stat_anchor_list', anchors: @project.project_stat_anchor_items(project_stat_items_args) + = render 'stat_anchor_list', anchors: @project.project_stat_button_items(project_stat_items_args) %div{ class: [container_class, ("limit-container-width" unless fluid_layout)] } @@ -25,7 +27,7 @@ = icon("exclamation-triangle fw") #{ _('Archived project! Repository is read-only') } - - view_path = default_project_view + - view_path = @project.default_project_view - if show_auto_devops_callout?(@project) = render 'shared/auto_devops_callout' diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 79021a08719..6dfabd7ba4c 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -69,7 +69,7 @@ - else = form.submit 'Save changes', class: 'btn btn-save' - - if !issuable.persisted? && !issuable.project.empty_repo? && (guide_url = contribution_guide_path(issuable.project)) + - if !issuable.persisted? && !issuable.project.empty_repo? && (guide_url = issuable.project.present.contribution_guide_path) .inline.prepend-top-10 Please review the %strong= link_to('contribution guidelines', guide_url) diff --git a/spec/features/projects/show_project_spec.rb b/spec/features/projects/show_project_spec.rb index f5f2bbb49e0..0bd13a17dc9 100644 --- a/spec/features/projects/show_project_spec.rb +++ b/spec/features/projects/show_project_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' describe 'Project show page', :feature do - include ProjectsHelper - context 'when project pending delete' do let(:project) { create(:project, :empty_repo, pending_delete: true) } @@ -29,6 +27,7 @@ describe 'Project show page', :feature do describe 'empty project' do let(:project) { create(:project, :public, :empty_repo) } + let(:presenter) { project.present(current_user: user) } describe 'as a normal user' do before do @@ -71,13 +70,13 @@ describe 'Project show page', :feature do it '"Add Readme" button linked to new file populated for a readme' do page.within('.project-stats') do - expect(page).to have_link('Add Readme', href: add_special_file_path(project, file_name: 'README.md')) + expect(page).to have_link('Add Readme', href: presenter.add_readme_path) end end it '"Add License" button linked to new file populated for a license' do page.within('.project-stats') do - expect(page).to have_link('Add License', href: add_special_file_path(project, file_name: 'LICENSE')) + expect(page).to have_link('Add License', href: presenter.add_license_path) end end @@ -121,6 +120,7 @@ describe 'Project show page', :feature do describe 'populated project' do let(:project) { create(:project, :public, :repository) } + let(:presenter) { project.present(current_user: user) } describe 'as a normal user' do before do @@ -192,7 +192,7 @@ describe 'Project show page', :feature do expect(project.repository.gitlab_ci_yml).to be_nil page.within('.project-stats') do - expect(page).to have_link('Set up CI/CD', href: add_special_file_path(project, file_name: '.gitlab-ci.yml')) + expect(page).to have_link('Set up CI/CD', href: presenter.add_ci_yml_path) end end @@ -327,7 +327,7 @@ describe 'Project show page', :feature do visit project_path(project) page.within('.project-stats') do - expect(page).to have_link('Set up Koding', href: add_koding_stack_path(project)) + expect(page).to have_link('Set up Koding', href: presenter.add_koding_stack_path) end end end diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index c0251bf7dc0..ffe4266b51a 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -264,32 +264,6 @@ describe ProjectsHelper do end end - describe '#license_short_name' do - let(:project) { create(:project) } - - context 'when project.repository has a license_key' do - it 'returns the nickname of the license if present' do - allow(project.repository).to receive(:license_key).and_return('agpl-3.0') - - expect(helper.license_short_name(project)).to eq('GNU AGPLv3') - end - - it 'returns the name of the license if nickname is not present' do - allow(project.repository).to receive(:license_key).and_return('mit') - - expect(helper.license_short_name(project)).to eq('MIT License') - end - end - - context 'when project.repository has no license_key but a license_blob' do - it 'returns LICENSE' do - allow(project.repository).to receive(:license_key).and_return(nil) - - expect(helper.license_short_name(project)).to eq('LICENSE') - end - end - end - describe '#sanitized_import_error' do let(:project) { create(:project, :repository) } diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb new file mode 100644 index 00000000000..49822693f3e --- /dev/null +++ b/spec/presenters/project_presenter_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe ProjectPresenter do + let(:user) { create(:user) } + let(:project) { create(:project) } + let(:presenter) { described_class.new(project, current_user: user) } + + describe '#license_short_name' do + context 'when project.repository has a license_key' do + it 'returns the nickname of the license if present' do + allow(project.repository).to receive(:license_key).and_return('agpl-3.0') + + expect(presenter.license_short_name).to eq('GNU AGPLv3') + end + + it 'returns the name of the license if nickname is not present' do + allow(project.repository).to receive(:license_key).and_return('mit') + + expect(presenter.license_short_name).to eq('MIT License') + end + end + + context 'when project.repository has no license_key but a license_blob' do + it 'returns LICENSE' do + allow(project.repository).to receive(:license_key).and_return(nil) + + expect(presenter.license_short_name).to eq('LICENSE') + end + end + end +end From c445ef539ef62b0eb425b8cf60e240597b697ec1 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Tue, 20 Feb 2018 13:30:49 -0300 Subject: [PATCH 10/81] Move default_project_view tests to presenter --- app/presenters/project_presenter.rb | 4 +- app/views/projects/show.html.haml | 2 +- spec/helpers/preferences_helper_spec.rb | 97 ----------------------- spec/presenters/project_presenter_spec.rb | 96 +++++++++++++++++++++- 4 files changed, 97 insertions(+), 102 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index c76a529f56b..1f37830e181 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -52,7 +52,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated ].compact.reject { |i| i[:enabled] } end - def default_project_view + def default_view return anonymous_project_view unless current_user user_view = current_user.project_view @@ -242,7 +242,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated { enabled: true, label: _('Readme'), - link: default_project_view != 'readme' ? readme_path : '#readme' + link: default_view != 'readme' ? readme_path : '#readme' } end end diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 385a3b490a4..e6e6502c70f 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -27,7 +27,7 @@ = icon("exclamation-triangle fw") #{ _('Archived project! Repository is read-only') } - - view_path = @project.default_project_view + - view_path = @project.default_view - if show_auto_devops_callout?(@project) = render 'shared/auto_devops_callout' diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb index 749aa25e632..e2a0c4322ff 100644 --- a/spec/helpers/preferences_helper_spec.rb +++ b/spec/helpers/preferences_helper_spec.rb @@ -77,103 +77,6 @@ describe PreferencesHelper do end end - describe '#default_project_view' do - context 'user not signed in' do - before do - helper.instance_variable_set(:@project, project) - stub_user - end - - context 'when repository is empty' do - let(:project) { create(:project_empty_repo, :public) } - - it 'returns activity if user has repository access' do - allow(helper).to receive(:can?).with(nil, :download_code, project).and_return(true) - - expect(helper.default_project_view).to eq('activity') - end - - it 'returns activity if user does not have repository access' do - allow(helper).to receive(:can?).with(nil, :download_code, project).and_return(false) - - expect(helper.default_project_view).to eq('activity') - end - end - - context 'when repository is not empty' do - let(:project) { create(:project, :public, :repository) } - - it 'returns files and readme if user has repository access' do - allow(helper).to receive(:can?).with(nil, :download_code, project).and_return(true) - - expect(helper.default_project_view).to eq('files') - end - - it 'returns activity if user does not have repository access' do - allow(helper).to receive(:can?).with(nil, :download_code, project).and_return(false) - - expect(helper.default_project_view).to eq('activity') - end - end - end - - context 'user signed in' do - let(:user) { create(:user, :readme) } - let(:project) { create(:project, :public, :repository) } - - before do - helper.instance_variable_set(:@project, project) - allow(helper).to receive(:current_user).and_return(user) - end - - context 'when the user is allowed to see the code' do - it 'returns the project view' do - allow(helper).to receive(:can?).with(user, :download_code, project).and_return(true) - - expect(helper.default_project_view).to eq('readme') - end - end - - context 'with wikis enabled and the right policy for the user' do - before do - project.project_feature.update_attribute(:issues_access_level, 0) - allow(helper).to receive(:can?).with(user, :download_code, project).and_return(false) - end - - it 'returns wiki if the user has the right policy' do - allow(helper).to receive(:can?).with(user, :read_wiki, project).and_return(true) - - expect(helper.default_project_view).to eq('wiki') - end - - it 'returns customize_workflow if the user does not have the right policy' do - allow(helper).to receive(:can?).with(user, :read_wiki, project).and_return(false) - - expect(helper.default_project_view).to eq('customize_workflow') - end - end - - context 'with issues as a feature available' do - it 'return issues' do - allow(helper).to receive(:can?).with(user, :download_code, project).and_return(false) - allow(helper).to receive(:can?).with(user, :read_wiki, project).and_return(false) - - expect(helper.default_project_view).to eq('projects/issues/issues') - end - end - - context 'with no activity, no wikies and no issues' do - it 'returns customize_workflow as default' do - project.project_feature.update_attribute(:issues_access_level, 0) - allow(helper).to receive(:can?).with(user, :download_code, project).and_return(false) - allow(helper).to receive(:can?).with(user, :read_wiki, project).and_return(false) - - expect(helper.default_project_view).to eq('customize_workflow') - end - end - end - end - def stub_user(messages = {}) if messages.empty? allow(helper).to receive(:current_user).and_return(nil) diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb index 49822693f3e..80e66b87175 100644 --- a/spec/presenters/project_presenter_spec.rb +++ b/spec/presenters/project_presenter_spec.rb @@ -2,10 +2,11 @@ require 'spec_helper' describe ProjectPresenter do let(:user) { create(:user) } - let(:project) { create(:project) } - let(:presenter) { described_class.new(project, current_user: user) } describe '#license_short_name' do + let(:project) { create(:project) } + let(:presenter) { described_class.new(project, current_user: user) } + context 'when project.repository has a license_key' do it 'returns the nickname of the license if present' do allow(project.repository).to receive(:license_key).and_return('agpl-3.0') @@ -28,4 +29,95 @@ describe ProjectPresenter do end end end + + describe '#default_view' do + let(:presenter) { described_class.new(project, current_user: user) } + + context 'user not signed in' do + let(:user) { nil } + + context 'when repository is empty' do + let(:project) { create(:project_empty_repo, :public) } + + it 'returns activity if user has repository access' do + allow(presenter).to receive(:can?).with(nil, :download_code, project).and_return(true) + + expect(presenter.default_view).to eq('activity') + end + + it 'returns activity if user does not have repository access' do + allow(project).to receive(:can?).with(nil, :download_code, project).and_return(false) + + expect(presenter.default_view).to eq('activity') + end + end + + context 'when repository is not empty' do + let(:project) { create(:project, :public, :repository) } + + it 'returns files and readme if user has repository access' do + allow(presenter).to receive(:can?).with(nil, :download_code, project).and_return(true) + + expect(presenter.default_view).to eq('files') + end + + it 'returns activity if user does not have repository access' do + allow(presenter).to receive(:can?).with(nil, :download_code, project).and_return(false) + + expect(presenter.default_view).to eq('activity') + end + end + end + + context 'user signed in' do + let(:user) { create(:user, :readme) } + let(:project) { create(:project, :public, :repository) } + + context 'when the user is allowed to see the code' do + it 'returns the project view' do + allow(presenter).to receive(:can?).with(user, :download_code, project).and_return(true) + + expect(presenter.default_view).to eq('readme') + end + end + + context 'with wikis enabled and the right policy for the user' do + before do + project.project_feature.update_attribute(:issues_access_level, 0) + allow(presenter).to receive(:can?).with(user, :download_code, project).and_return(false) + end + + it 'returns wiki if the user has the right policy' do + allow(presenter).to receive(:can?).with(user, :read_wiki, project).and_return(true) + + expect(presenter.default_view).to eq('wiki') + end + + it 'returns customize_workflow if the user does not have the right policy' do + allow(presenter).to receive(:can?).with(user, :read_wiki, project).and_return(false) + + expect(presenter.default_view).to eq('customize_workflow') + end + end + + context 'with issues as a feature available' do + it 'return issues' do + allow(presenter).to receive(:can?).with(user, :download_code, project).and_return(false) + allow(presenter).to receive(:can?).with(user, :read_wiki, project).and_return(false) + + expect(presenter.default_view).to eq('projects/issues/issues') + end + end + + context 'with no activity, no wikies and no issues' do + it 'returns customize_workflow as default' do + project.project_feature.update_attribute(:issues_access_level, 0) + allow(presenter).to receive(:can?).with(user, :download_code, project).and_return(false) + allow(presenter).to receive(:can?).with(user, :read_wiki, project).and_return(false) + + expect(presenter.default_view).to eq('customize_workflow') + end + end + end + end end From 083003bf1eeef8347c8cd8ac40bdf8a0d7f5672e Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Tue, 20 Feb 2018 15:51:52 -0300 Subject: [PATCH 11/81] Improve methods naming --- app/presenters/project_presenter.rb | 8 ++++---- app/views/projects/empty.html.haml | 4 ++-- app/views/projects/show.html.haml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index 1f37830e181..6a8227982cb 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -7,7 +7,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated presents :project - def project_stat_anchor_items(show_auto_devops_callout:) + def statistics_anchors(show_auto_devops_callout:) [ files_anchor_data, commits_anchor_data, @@ -23,7 +23,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated ].compact.reject { |i| !i[:enabled] } end - def project_stat_button_items(show_auto_devops_callout:) + def statistics_buttons(show_auto_devops_callout:) [ changelog_anchor_data, license_anchor_data, @@ -35,14 +35,14 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated ].compact.reject { |i| i[:enabled] } end - def empty_project_stat_anchor_items + def empty_repo_statistics_anchors [ autodevops_anchor_data, kubernetes_cluster_anchor_data ].compact.reject { |i| !i[:enabled] } end - def empty_project_stat_button_items + def empty_repo_statistics_buttons [ new_file_anchor_data, readme_anchor_data, diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index b4f91f447f9..34f3482d7c6 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -33,8 +33,8 @@ .prepend-top-20 %nav.project-stats{ class: container_class } - = render 'stat_anchor_list', anchors: @project.empty_project_stat_anchor_items - = render 'stat_anchor_list', anchors: @project.empty_project_stat_button_items + = render 'stat_anchor_list', anchors: @project.empty_repo_statistics_anchors + = render 'stat_anchor_list', anchors: @project.empty_repo_statistics_buttons - if can?(current_user, :push_code, @project) %div{ class: [container_class, ("limit-container-width-sm" unless fluid_layout)] } diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index e6e6502c70f..9b2045f396b 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,8 +1,8 @@ -- project_stat_items_args = { show_auto_devops_callout: show_auto_devops_callout?(@project) } - @no_container = true - breadcrumb_title "Details" - @content_class = "limit-container-width" unless fluid_layout - @project = @project.present(current_user: current_user) +- show_auto_devops_callout = show_auto_devops_callout?(@project) = content_for :meta_tags do = auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity") @@ -16,8 +16,8 @@ - if can?(current_user, :download_code, @project) %nav.project-stats{ class: container_class } - = render 'stat_anchor_list', anchors: @project.project_stat_anchor_items(project_stat_items_args) - = render 'stat_anchor_list', anchors: @project.project_stat_button_items(project_stat_items_args) + = render 'stat_anchor_list', anchors: @project.statistics_anchors(show_auto_devops_callout: show_auto_devops_callout) + = render 'stat_anchor_list', anchors: @project.statistics_buttons(show_auto_devops_callout: show_auto_devops_callout) %div{ class: [container_class, ("limit-container-width" unless fluid_layout)] } From 2aacb7fb435f669aa3860c7220835f04e208188b Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Wed, 14 Feb 2018 17:52:36 -0600 Subject: [PATCH 12/81] Make import tab/form active when importing project by URL and validation fails See https://gitlab.com/gitlab-org/gitlab-ce/issues/43261 --- app/controllers/projects_controller.rb | 2 +- app/views/projects/new.html.haml | 15 ++++++++------- ...-import-from-url-name-collision-active-tab.yml | 6 ++++++ spec/features/projects/new_project_spec.rb | 14 +++++++++++++- 4 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 72573e0765d..f437929bc85 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -45,7 +45,7 @@ class ProjectsController < Projects::ApplicationController notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name } ) else - render 'new' + render 'new', locals: { active_tab: ('import' if project_params[:import_url].present?) } end end diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 61ae0ebbce6..8e169ccea08 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -4,6 +4,7 @@ - page_title 'New Project' - header_title "Projects", dashboard_projects_path - visibility_level = params.dig(:project, :visibility_level) || default_project_visibility +- active_tab = local_assigns.fetch(:active_tab, 'blank') .project-edit-container .project-edit-errors @@ -20,32 +21,32 @@ = brand_new_project_guidelines .col-lg-9.js-toggle-container %ul.nav-links.gitlab-tabs{ role: 'tablist' } - %li.active{ role: 'presentation' } + %li{ class: ('active' if active_tab == 'blank'), role: 'presentation' } %a{ href: '#blank-project-pane', id: 'blank-project-tab', data: { toggle: 'tab' }, role: 'tab' } %span.hidden-xs Blank project %span.visible-xs Blank - %li{ role: 'presentation' } + %li{ class: ('active' if active_tab == 'template'), role: 'presentation' } %a{ href: '#create-from-template-pane', id: 'create-from-template-tab', data: { toggle: 'tab' }, role: 'tab' } %span.hidden-xs Create from template %span.visible-xs Template - %li{ role: 'presentation' } + %li{ class: ('active' if active_tab == 'import'), role: 'presentation' } %a{ href: '#import-project-pane', id: 'import-project-tab', data: { toggle: 'tab' }, role: 'tab' } %span.hidden-xs Import project %span.visible-xs Import .tab-content.gitlab-tab-content - .tab-pane.active{ id: 'blank-project-pane', role: 'tabpanel' } + .tab-pane{ id: 'blank-project-pane', class: ('active' if active_tab == 'blank'), role: 'tabpanel' } = form_for @project, html: { class: 'new_project' } do |f| = render 'new_project_fields', f: f, project_name_id: "blank-project-name" - .tab-pane.no-padding{ id: 'create-from-template-pane', role: 'tabpanel' } + .tab-pane.no-padding{ id: 'create-from-template-pane', class: ('active' if active_tab == 'template'), role: 'tabpanel' } = form_for @project, html: { class: 'new_project' } do |f| .project-template .form-group %div = render 'project_templates', f: f - .tab-pane.import-project-pane{ id: 'import-project-pane', role: 'tabpanel' } + .tab-pane.import-project-pane{ id: 'import-project-pane', class: ('active' if active_tab == 'import'), role: 'tabpanel' } = form_for @project, html: { class: 'new_project' } do |f| - if import_sources_enabled? .project-import.row @@ -92,7 +93,7 @@ %button.btn.js-toggle-button.import_git{ type: "button" } = icon('git', text: 'Repo by URL') .col-lg-12 - .js-toggle-content.hide.toggle-import-form + .js-toggle-content.toggle-import-form{ class: ('hide' if active_tab != 'import') } %hr = render "shared/import_form", f: f = render 'new_project_fields', f: f, project_name_id: "import-url-name" diff --git a/changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml b/changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml new file mode 100644 index 00000000000..71073b2e214 --- /dev/null +++ b/changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml @@ -0,0 +1,6 @@ +--- +title: Keep "Import project" tab/form active when validation fails trying to import + "Repo by URL" +merge_request: 17136 +author: +type: fixed diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index 6f097ad16c7..b5104747d00 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -140,7 +140,7 @@ feature 'New project' do find('#import-project-tab').click end - context 'from git repository url' do + context 'from git repository url, "Repo by URL"' do before do first('.import_git').click end @@ -157,6 +157,18 @@ feature 'New project' do expect(git_import_instructions).to be_visible expect(git_import_instructions).to have_content 'Git repository URL' end + + it 'keeps "Import project" tab open after form validation error' do + collision_project = create(:project, name: 'test-name-collision', namespace: user.namespace) + + fill_in 'project_import_url', with: collision_project.http_url_to_repo + fill_in 'project_path', with: collision_project.path + + click_on 'Create project' + + expect(page).to have_css('#import-project-pane.active') + expect(page).not_to have_css('.toggle-import-form.hide') + end end context 'from GitHub' do From d714073d62860bdd80f861baa6882f54d5c57e5f Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Tue, 20 Feb 2018 16:15:01 -0300 Subject: [PATCH 13/81] Use OpenStruct instead Hash for statistics buttons --- app/presenters/project_presenter.rb | 154 +++++++----------- .../projects/_stat_anchor_list.html.haml | 8 +- 2 files changed, 62 insertions(+), 100 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index 6a8227982cb..aa708c656ff 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -189,125 +189,95 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def files_anchor_data - { - enabled: true, - label: _('Files (%{human_size})') % { human_size: storage_counter(statistics.total_repository_size) }, - link: project_tree_path(project) - } + OpenStruct.new(enabled: true, + label: _('Files (%{human_size})') % { human_size: storage_counter(statistics.total_repository_size) }, + link: project_tree_path(project)) end def commits_anchor_data - { - enabled: true, - label: n_('Commit (%{commit_count})', 'Commits (%{commit_count})', statistics.commit_count) % { commit_count: number_with_delimiter(statistics.commit_count) }, - link: project_commits_path(project, repository.root_ref) - } + OpenStruct.new(enabled: true, + label: n_('Commit (%{commit_count})', 'Commits (%{commit_count})', statistics.commit_count) % { commit_count: number_with_delimiter(statistics.commit_count) }, + link: project_commits_path(project, repository.root_ref)) end def branches_anchor_data - { - enabled: true, - label: n_('Branch (%{branch_count})', 'Branches (%{branch_count})', repository.branch_count) % { branch_count: number_with_delimiter(repository.branch_count) }, - link: project_branches_path(project) - } + OpenStruct.new(enabled: true, + label: n_('Branch (%{branch_count})', 'Branches (%{branch_count})', repository.branch_count) % { branch_count: number_with_delimiter(repository.branch_count) }, + link: project_branches_path(project)) end def tags_anchor_data - { - enabled: true, - label: n_('Tag (%{tag_count})', 'Tags (%{tag_count})', repository.tag_count) % { tag_count: number_with_delimiter(repository.tag_count) }, - link: project_tags_path(project) - } + OpenStruct.new(enabled: true, + label: n_('Tag (%{tag_count})', 'Tags (%{tag_count})', repository.tag_count) % { tag_count: number_with_delimiter(repository.tag_count) }, + link: project_tags_path(project)) end def new_file_anchor_data if current_user && can_current_user_push_code? - { - enabled: false, - label: _('New file'), - link: project_new_blob_path(project, default_branch || 'master'), - class_modifier: 'new' - } + OpenStruct.new(enabled: false, + label: _('New file'), + link: project_new_blob_path(project, default_branch || 'master'), + class_modifier: 'new') end end def readme_anchor_data if current_user && can_current_user_push_code? && repository.readme.blank? - { - enabled: false, - label: _('Add Readme'), - link: add_readme_path - } + OpenStruct.new(enabled: false, + label: _('Add Readme'), + link: add_readme_path) elsif repository.readme.present? - { - enabled: true, - label: _('Readme'), - link: default_view != 'readme' ? readme_path : '#readme' - } + OpenStruct.new(enabled: true, + label: _('Readme'), + link: default_view != 'readme' ? readme_path : '#readme') end end def changelog_anchor_data if current_user && can_current_user_push_code? && repository.changelog.blank? - { - enabled: false, - label: _('Add Changelog'), - link: add_special_file_path(file_name: 'CHANGELOG') - } + OpenStruct.new(enabled: false, + label: _('Add Changelog'), + link: add_special_file_path(file_name: 'CHANGELOG')) elsif repository.changelog.present? - { - enabled: true, - label: _('Changelog'), - link: changelog_path - } + OpenStruct.new(enabled: true, + label: _('Changelog'), + link: changelog_path) end end def license_anchor_data if current_user && can_current_user_push_code? && repository.license_blob.blank? - { - enabled: false, - label: _('Add License'), - link: add_license_path - } + OpenStruct.new(enabled: false, + label: _('Add License'), + link: add_license_path) elsif repository.license_blob.present? - { - enabled: true, - label: license_short_name, - link: license_path - } + OpenStruct.new(enabled: true, + label: license_short_name, + link: license_path) end end def contribution_guide_anchor_data if current_user && can_current_user_push_code? && repository.contribution_guide.blank? - { - enabled: false, - label: _('Add Contribution guide'), - link: add_special_file_path(file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') - } + OpenStruct.new(enabled: false, + label: _('Add Contribution guide'), + link: add_special_file_path(file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide')) elsif repository.contribution_guide.present? - { - enabled: true, - label: _('Contribution guide'), - link: contribution_guide_path - } + OpenStruct.new(enabled: true, + label: _('Contribution guide'), + link: contribution_guide_path) end end def autodevops_anchor_data(show_auto_devops_callout: false) if current_user && can?(current_user, :admin_pipeline, project) && repository.gitlab_ci_yml.blank? && !show_auto_devops_callout - { - enabled: auto_devops_enabled?, - label: auto_devops_enabled? ? _('Auto DevOps enabled') : _('Enable Auto DevOps'), - link: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings') - } + OpenStruct.new(enabled: auto_devops_enabled?, + label: auto_devops_enabled? ? _('Auto DevOps enabled') : _('Enable Auto DevOps'), + link: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings')) elsif auto_devops_enabled? - { - enabled: true, - label: _('Auto DevOps enabled'), - link: nil - } + OpenStruct.new(enabled: true, + label: _('Auto DevOps enabled'), + link: nil) end end @@ -319,37 +289,29 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated cluster_link = new_project_cluster_path(project) end - { - enabled: !clusters.empty?, - label: clusters.empty? ? _('Add Kubernetes cluster') : n_('Kubernetes cluster', 'Kubernetes clusters', clusters.size), - link: cluster_link - } + OpenStruct.new(enabled: !clusters.empty?, + label: clusters.empty? ? _('Add Kubernetes cluster') : n_('Kubernetes cluster', 'Kubernetes clusters', clusters.size), + link: cluster_link) end end def gitlab_ci_anchor_data if current_user && can_current_user_push_code? && repository.gitlab_ci_yml.blank? && !auto_devops_enabled? - { - enabled: false, - label: _('Set up CI/CD'), - link: add_ci_yml_path - } + OpenStruct.new(enabled: false, + label: _('Set up CI/CD'), + link: add_ci_yml_path) elsif repository.gitlab_ci_yml.present? - { - enabled: true, - label: _('CI/CD configuration'), - link: ci_configuration_path - } + OpenStruct.new(enabled: true, + label: _('CI/CD configuration'), + link: ci_configuration_path) end end def koding_anchor_data if current_user && can_current_user_push_code? && koding_enabled? && repository.koding_yml.blank? - { - enabled: false, - label: _('Set up Koding'), - link: add_koding_stack_path - } + OpenStruct.new(enabled: false, + label: _('Set up Koding'), + link: add_koding_stack_path) end end diff --git a/app/views/projects/_stat_anchor_list.html.haml b/app/views/projects/_stat_anchor_list.html.haml index 1f237c645bc..055d484cf49 100644 --- a/app/views/projects/_stat_anchor_list.html.haml +++ b/app/views/projects/_stat_anchor_list.html.haml @@ -4,9 +4,9 @@ %ul.nav - anchors.each do |anchor| %li - - if anchor[:link] - = link_to anchor[:link], class: anchor[:enabled] ? 'stat-link' : "btn btn-#{anchor[:class_modifier] || 'missing'}" do - = anchor[:label] + - if anchor.link + = link_to anchor.link, class: anchor.enabled ? 'stat-link' : "btn btn-#{anchor.class_modifier || 'missing'}" do + = anchor.label - else %span.stat-text - = anchor[:label] + = anchor.label From 4b49eb495debdbe6f808fd38904dbae0055fda0e Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Tue, 20 Feb 2018 11:37:46 -0800 Subject: [PATCH 14/81] Explicitly reference redefined models And move UntrackedFile into PopulateUntrackedUploadsDependencies, and move its spec into its own file. --- .../populate_untracked_uploads.rb | 159 +---------- ...populate_untracked_uploads_dependencies.rb | 142 ++++++++++ .../untracked_file_spec.rb | 262 ++++++++++++++++++ .../populate_untracked_uploads_spec.rb | 261 ----------------- 4 files changed, 411 insertions(+), 413 deletions(-) create mode 100644 spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb diff --git a/lib/gitlab/background_migration/populate_untracked_uploads.rb b/lib/gitlab/background_migration/populate_untracked_uploads.rb index c0aa64e27ed..c5415bf0f9a 100644 --- a/lib/gitlab/background_migration/populate_untracked_uploads.rb +++ b/lib/gitlab/background_migration/populate_untracked_uploads.rb @@ -5,156 +5,10 @@ module Gitlab # This class processes a batch of rows in `untracked_files_for_uploads` by # adding each file to the `uploads` table if it does not exist. class PopulateUntrackedUploads # rubocop:disable Metrics/ClassLength - include PopulateUntrackedUploadsDependencies - - # This class is responsible for producing the attributes necessary to - # track an uploaded file in the `uploads` table. - class UntrackedFile < ActiveRecord::Base # rubocop:disable Metrics/ClassLength, Metrics/LineLength - self.table_name = 'untracked_files_for_uploads' - - include PopulateUntrackedUploadsDependencies - - # Ends with /:random_hex/:filename - FILE_UPLOADER_PATH = %r{/\h+/[^/]+\z} - FULL_PATH_CAPTURE = /\A(.+)#{FILE_UPLOADER_PATH}/ - - # These regex patterns are tested against a relative path, relative to - # the upload directory. - # For convenience, if there exists a capture group in the pattern, then - # it indicates the model_id. - PATH_PATTERNS = [ - { - pattern: %r{\A-/system/appearance/logo/(\d+)/}, - uploader: 'AttachmentUploader', - model_type: 'Appearance' - }, - { - pattern: %r{\A-/system/appearance/header_logo/(\d+)/}, - uploader: 'AttachmentUploader', - model_type: 'Appearance' - }, - { - pattern: %r{\A-/system/note/attachment/(\d+)/}, - uploader: 'AttachmentUploader', - model_type: 'Note' - }, - { - pattern: %r{\A-/system/user/avatar/(\d+)/}, - uploader: 'AvatarUploader', - model_type: 'User' - }, - { - pattern: %r{\A-/system/group/avatar/(\d+)/}, - uploader: 'AvatarUploader', - model_type: 'Namespace' - }, - { - pattern: %r{\A-/system/project/avatar/(\d+)/}, - uploader: 'AvatarUploader', - model_type: 'Project' - }, - { - pattern: FILE_UPLOADER_PATH, - uploader: 'FileUploader', - model_type: 'Project' - } - ].freeze - - def to_h - @upload_hash ||= { - path: upload_path, - uploader: uploader, - model_type: model_type, - model_id: model_id, - size: file_size, - checksum: checksum - } - end - - def upload_path - # UntrackedFile#path is absolute, but Upload#path depends on uploader - @upload_path ||= - if uploader == 'FileUploader' - # Path relative to project directory in uploads - matchd = path_relative_to_upload_dir.match(FILE_UPLOADER_PATH) - matchd[0].sub(%r{\A/}, '') # remove leading slash - else - path - end - end - - def uploader - matching_pattern_map[:uploader] - end - - def model_type - matching_pattern_map[:model_type] - end - - def model_id - return @model_id if defined?(@model_id) - - pattern = matching_pattern_map[:pattern] - matchd = path_relative_to_upload_dir.match(pattern) - - # If something is captured (matchd[1] is not nil), it is a model_id - # Only the FileUploader pattern will not match an ID - @model_id = matchd[1] ? matchd[1].to_i : file_uploader_model_id - end - - def file_size - File.size(absolute_path) - end - - def checksum - Digest::SHA256.file(absolute_path).hexdigest - end - - private - - def matching_pattern_map - @matching_pattern_map ||= PATH_PATTERNS.find do |path_pattern_map| - path_relative_to_upload_dir.match(path_pattern_map[:pattern]) - end - - unless @matching_pattern_map - raise "Unknown upload path pattern \"#{path}\"" - end - - @matching_pattern_map - end - - def file_uploader_model_id - matchd = path_relative_to_upload_dir.match(FULL_PATH_CAPTURE) - not_found_msg = <<~MSG - Could not capture project full_path from a FileUploader path: - "#{path_relative_to_upload_dir}" - MSG - raise not_found_msg unless matchd - - full_path = matchd[1] - project = Project.find_by_full_path(full_path) - return nil unless project - - project.id - end - - # Not including a leading slash - def path_relative_to_upload_dir - upload_dir = Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR # rubocop:disable Metrics/LineLength - base = %r{\A#{Regexp.escape(upload_dir)}/} - @path_relative_to_upload_dir ||= path.sub(base, '') - end - - def absolute_path - File.join(Gitlab.config.uploads.storage_path, path) - end - end - def perform(start_id, end_id) return unless migrate? - files = UntrackedFile.where(id: start_id..end_id) + files = Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::UntrackedFile.where(id: start_id..end_id) processed_files = insert_uploads_if_needed(files) processed_files.delete_all @@ -164,7 +18,8 @@ module Gitlab private def migrate? - UntrackedFile.table_exists? && Upload.table_exists? + Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::UntrackedFile.table_exists? && + Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::Upload.table_exists? end def insert_uploads_if_needed(files) @@ -196,7 +51,7 @@ module Gitlab def filter_existing_uploads(files) paths = files.map(&:upload_path) - existing_paths = Upload.where(path: paths).pluck(:path).to_set + existing_paths = Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::Upload.where(path: paths).pluck(:path).to_set files.reject do |file| existing_paths.include?(file.upload_path) @@ -228,7 +83,7 @@ module Gitlab end ids.each do |model_type, model_ids| - model_class = self.class.const_get(model_type) + model_class = Object.const_get("Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::#{model_type}") found_ids = model_class.where(id: model_ids.uniq).pluck(:id) deleted_ids = ids[model_type] - found_ids ids[model_type] = deleted_ids @@ -248,8 +103,8 @@ module Gitlab end def drop_temp_table_if_finished - if UntrackedFile.all.empty? && !Rails.env.test? # Dropping a table intermittently breaks test cleanup - UntrackedFile.connection.drop_table(:untracked_files_for_uploads, + if Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::UntrackedFile.all.empty? && !Rails.env.test? # Dropping a table intermittently breaks test cleanup + Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::UntrackedFile.connection.drop_table(:untracked_files_for_uploads, if_exists: true) end end diff --git a/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb b/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb index 188aeed4fbf..a2c5acbde71 100644 --- a/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb +++ b/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb @@ -2,6 +2,148 @@ module Gitlab module BackgroundMigration module PopulateUntrackedUploadsDependencies + # This class is responsible for producing the attributes necessary to + # track an uploaded file in the `uploads` table. + class UntrackedFile < ActiveRecord::Base # rubocop:disable Metrics/ClassLength, Metrics/LineLength + self.table_name = 'untracked_files_for_uploads' + + # Ends with /:random_hex/:filename + FILE_UPLOADER_PATH = %r{/\h+/[^/]+\z} + FULL_PATH_CAPTURE = /\A(.+)#{FILE_UPLOADER_PATH}/ + + # These regex patterns are tested against a relative path, relative to + # the upload directory. + # For convenience, if there exists a capture group in the pattern, then + # it indicates the model_id. + PATH_PATTERNS = [ + { + pattern: %r{\A-/system/appearance/logo/(\d+)/}, + uploader: 'AttachmentUploader', + model_type: 'Appearance' + }, + { + pattern: %r{\A-/system/appearance/header_logo/(\d+)/}, + uploader: 'AttachmentUploader', + model_type: 'Appearance' + }, + { + pattern: %r{\A-/system/note/attachment/(\d+)/}, + uploader: 'AttachmentUploader', + model_type: 'Note' + }, + { + pattern: %r{\A-/system/user/avatar/(\d+)/}, + uploader: 'AvatarUploader', + model_type: 'User' + }, + { + pattern: %r{\A-/system/group/avatar/(\d+)/}, + uploader: 'AvatarUploader', + model_type: 'Namespace' + }, + { + pattern: %r{\A-/system/project/avatar/(\d+)/}, + uploader: 'AvatarUploader', + model_type: 'Project' + }, + { + pattern: FILE_UPLOADER_PATH, + uploader: 'FileUploader', + model_type: 'Project' + } + ].freeze + + def to_h + @upload_hash ||= { + path: upload_path, + uploader: uploader, + model_type: model_type, + model_id: model_id, + size: file_size, + checksum: checksum + } + end + + def upload_path + # UntrackedFile#path is absolute, but Upload#path depends on uploader + @upload_path ||= + if uploader == 'FileUploader' + # Path relative to project directory in uploads + matchd = path_relative_to_upload_dir.match(FILE_UPLOADER_PATH) + matchd[0].sub(%r{\A/}, '') # remove leading slash + else + path + end + end + + def uploader + matching_pattern_map[:uploader] + end + + def model_type + matching_pattern_map[:model_type] + end + + def model_id + return @model_id if defined?(@model_id) + + pattern = matching_pattern_map[:pattern] + matchd = path_relative_to_upload_dir.match(pattern) + + # If something is captured (matchd[1] is not nil), it is a model_id + # Only the FileUploader pattern will not match an ID + @model_id = matchd[1] ? matchd[1].to_i : file_uploader_model_id + end + + def file_size + File.size(absolute_path) + end + + def checksum + Digest::SHA256.file(absolute_path).hexdigest + end + + private + + def matching_pattern_map + @matching_pattern_map ||= PATH_PATTERNS.find do |path_pattern_map| + path_relative_to_upload_dir.match(path_pattern_map[:pattern]) + end + + unless @matching_pattern_map + raise "Unknown upload path pattern \"#{path}\"" + end + + @matching_pattern_map + end + + def file_uploader_model_id + matchd = path_relative_to_upload_dir.match(FULL_PATH_CAPTURE) + not_found_msg = <<~MSG + Could not capture project full_path from a FileUploader path: + "#{path_relative_to_upload_dir}" + MSG + raise not_found_msg unless matchd + + full_path = matchd[1] + project = Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::Project.find_by_full_path(full_path) + return nil unless project + + project.id + end + + # Not including a leading slash + def path_relative_to_upload_dir + upload_dir = Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR # rubocop:disable Metrics/LineLength + base = %r{\A#{Regexp.escape(upload_dir)}/} + @path_relative_to_upload_dir ||= path.sub(base, '') + end + + def absolute_path + File.join(Gitlab.config.uploads.storage_path, path) + end + end + # Avoid using application code class Upload < ActiveRecord::Base self.table_name = 'uploads' diff --git a/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb b/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb new file mode 100644 index 00000000000..2bc31be9ca3 --- /dev/null +++ b/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb @@ -0,0 +1,262 @@ +require 'spec_helper' + +# Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. +describe Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::UntrackedFile, :migration, schema: 20180208183958 do + include TrackUntrackedUploadsHelpers + + let!(:appearances) { table(:appearances) } + let!(:namespaces) { table(:namespaces) } + let!(:projects) { table(:projects) } + let!(:routes) { table(:routes) } + let!(:uploads) { table(:uploads) } + + before(:all) do + ensure_temporary_tracking_table_exists + end + + describe '#upload_path' do + def assert_upload_path(file_path, expected_upload_path) + untracked_file = create_untracked_file(file_path) + + expect(untracked_file.upload_path).to eq(expected_upload_path) + end + + context 'for an appearance logo file path' do + it 'returns the file path relative to the CarrierWave root' do + assert_upload_path('/-/system/appearance/logo/1/some_logo.jpg', 'uploads/-/system/appearance/logo/1/some_logo.jpg') + end + end + + context 'for an appearance header_logo file path' do + it 'returns the file path relative to the CarrierWave root' do + assert_upload_path('/-/system/appearance/header_logo/1/some_logo.jpg', 'uploads/-/system/appearance/header_logo/1/some_logo.jpg') + end + end + + context 'for a pre-Markdown Note attachment file path' do + it 'returns the file path relative to the CarrierWave root' do + assert_upload_path('/-/system/note/attachment/1234/some_attachment.pdf', 'uploads/-/system/note/attachment/1234/some_attachment.pdf') + end + end + + context 'for a user avatar file path' do + it 'returns the file path relative to the CarrierWave root' do + assert_upload_path('/-/system/user/avatar/1234/avatar.jpg', 'uploads/-/system/user/avatar/1234/avatar.jpg') + end + end + + context 'for a group avatar file path' do + it 'returns the file path relative to the CarrierWave root' do + assert_upload_path('/-/system/group/avatar/1234/avatar.jpg', 'uploads/-/system/group/avatar/1234/avatar.jpg') + end + end + + context 'for a project avatar file path' do + it 'returns the file path relative to the CarrierWave root' do + assert_upload_path('/-/system/project/avatar/1234/avatar.jpg', 'uploads/-/system/project/avatar/1234/avatar.jpg') + end + end + + context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do + it 'returns the file path relative to the project directory in uploads' do + project = create_project + random_hex = SecureRandom.hex + + assert_upload_path("/#{get_full_path(project)}/#{random_hex}/Some file.jpg", "#{random_hex}/Some file.jpg") + end + end + end + + describe '#uploader' do + def assert_uploader(file_path, expected_uploader) + untracked_file = create_untracked_file(file_path) + + expect(untracked_file.uploader).to eq(expected_uploader) + end + + context 'for an appearance logo file path' do + it 'returns AttachmentUploader as a string' do + assert_uploader('/-/system/appearance/logo/1/some_logo.jpg', 'AttachmentUploader') + end + end + + context 'for an appearance header_logo file path' do + it 'returns AttachmentUploader as a string' do + assert_uploader('/-/system/appearance/header_logo/1/some_logo.jpg', 'AttachmentUploader') + end + end + + context 'for a pre-Markdown Note attachment file path' do + it 'returns AttachmentUploader as a string' do + assert_uploader('/-/system/note/attachment/1234/some_attachment.pdf', 'AttachmentUploader') + end + end + + context 'for a user avatar file path' do + it 'returns AvatarUploader as a string' do + assert_uploader('/-/system/user/avatar/1234/avatar.jpg', 'AvatarUploader') + end + end + + context 'for a group avatar file path' do + it 'returns AvatarUploader as a string' do + assert_uploader('/-/system/group/avatar/1234/avatar.jpg', 'AvatarUploader') + end + end + + context 'for a project avatar file path' do + it 'returns AvatarUploader as a string' do + assert_uploader('/-/system/project/avatar/1234/avatar.jpg', 'AvatarUploader') + end + end + + context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do + it 'returns FileUploader as a string' do + project = create_project + + assert_uploader("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", 'FileUploader') + end + end + end + + describe '#model_type' do + def assert_model_type(file_path, expected_model_type) + untracked_file = create_untracked_file(file_path) + + expect(untracked_file.model_type).to eq(expected_model_type) + end + + context 'for an appearance logo file path' do + it 'returns Appearance as a string' do + assert_model_type('/-/system/appearance/logo/1/some_logo.jpg', 'Appearance') + end + end + + context 'for an appearance header_logo file path' do + it 'returns Appearance as a string' do + assert_model_type('/-/system/appearance/header_logo/1/some_logo.jpg', 'Appearance') + end + end + + context 'for a pre-Markdown Note attachment file path' do + it 'returns Note as a string' do + assert_model_type('/-/system/note/attachment/1234/some_attachment.pdf', 'Note') + end + end + + context 'for a user avatar file path' do + it 'returns User as a string' do + assert_model_type('/-/system/user/avatar/1234/avatar.jpg', 'User') + end + end + + context 'for a group avatar file path' do + it 'returns Namespace as a string' do + assert_model_type('/-/system/group/avatar/1234/avatar.jpg', 'Namespace') + end + end + + context 'for a project avatar file path' do + it 'returns Project as a string' do + assert_model_type('/-/system/project/avatar/1234/avatar.jpg', 'Project') + end + end + + context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do + it 'returns Project as a string' do + project = create_project + + assert_model_type("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", 'Project') + end + end + end + + describe '#model_id' do + def assert_model_id(file_path, expected_model_id) + untracked_file = create_untracked_file(file_path) + + expect(untracked_file.model_id).to eq(expected_model_id) + end + + context 'for an appearance logo file path' do + it 'returns the ID as a string' do + assert_model_id('/-/system/appearance/logo/1/some_logo.jpg', 1) + end + end + + context 'for an appearance header_logo file path' do + it 'returns the ID as a string' do + assert_model_id('/-/system/appearance/header_logo/1/some_logo.jpg', 1) + end + end + + context 'for a pre-Markdown Note attachment file path' do + it 'returns the ID as a string' do + assert_model_id('/-/system/note/attachment/1234/some_attachment.pdf', 1234) + end + end + + context 'for a user avatar file path' do + it 'returns the ID as a string' do + assert_model_id('/-/system/user/avatar/1234/avatar.jpg', 1234) + end + end + + context 'for a group avatar file path' do + it 'returns the ID as a string' do + assert_model_id('/-/system/group/avatar/1234/avatar.jpg', 1234) + end + end + + context 'for a project avatar file path' do + it 'returns the ID as a string' do + assert_model_id('/-/system/project/avatar/1234/avatar.jpg', 1234) + end + end + + context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do + it 'returns the ID as a string' do + project = create_project + + assert_model_id("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", project.id) + end + end + end + + describe '#file_size' do + context 'for an appearance logo file path' do + let(:appearance) { create_or_update_appearance(logo: true) } + let(:untracked_file) { described_class.create!(path: get_uploads(appearance, 'Appearance').first.path) } + + it 'returns the file size' do + expect(untracked_file.file_size).to eq(1062) + end + end + + context 'for a project avatar file path' do + let(:project) { create_project(avatar: true) } + let(:untracked_file) { described_class.create!(path: get_uploads(project, 'Project').first.path) } + + it 'returns the file size' do + expect(untracked_file.file_size).to eq(1062) + end + end + + context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do + let(:project) { create_project } + let(:untracked_file) { create_untracked_file("/#{get_full_path(project)}/#{get_uploads(project, 'Project').first.path}") } + + before do + add_markdown_attachment(project) + end + + it 'returns the file size' do + expect(untracked_file.file_size).to eq(1062) + end + end + end + + def create_untracked_file(path_relative_to_upload_dir) + described_class.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}#{path_relative_to_upload_dir}") + end +end diff --git a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb index a098add401a..d8f2c2bb07f 100644 --- a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb @@ -251,264 +251,3 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra end end end - -# Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. -describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile, :migration, schema: 20180208183958 do - include TrackUntrackedUploadsHelpers - - let!(:appearances) { table(:appearances) } - let!(:namespaces) { table(:namespaces) } - let!(:projects) { table(:projects) } - let!(:routes) { table(:routes) } - let!(:uploads) { table(:uploads) } - - before(:all) do - ensure_temporary_tracking_table_exists - end - - describe '#upload_path' do - def assert_upload_path(file_path, expected_upload_path) - untracked_file = create_untracked_file(file_path) - - expect(untracked_file.upload_path).to eq(expected_upload_path) - end - - context 'for an appearance logo file path' do - it 'returns the file path relative to the CarrierWave root' do - assert_upload_path('/-/system/appearance/logo/1/some_logo.jpg', 'uploads/-/system/appearance/logo/1/some_logo.jpg') - end - end - - context 'for an appearance header_logo file path' do - it 'returns the file path relative to the CarrierWave root' do - assert_upload_path('/-/system/appearance/header_logo/1/some_logo.jpg', 'uploads/-/system/appearance/header_logo/1/some_logo.jpg') - end - end - - context 'for a pre-Markdown Note attachment file path' do - it 'returns the file path relative to the CarrierWave root' do - assert_upload_path('/-/system/note/attachment/1234/some_attachment.pdf', 'uploads/-/system/note/attachment/1234/some_attachment.pdf') - end - end - - context 'for a user avatar file path' do - it 'returns the file path relative to the CarrierWave root' do - assert_upload_path('/-/system/user/avatar/1234/avatar.jpg', 'uploads/-/system/user/avatar/1234/avatar.jpg') - end - end - - context 'for a group avatar file path' do - it 'returns the file path relative to the CarrierWave root' do - assert_upload_path('/-/system/group/avatar/1234/avatar.jpg', 'uploads/-/system/group/avatar/1234/avatar.jpg') - end - end - - context 'for a project avatar file path' do - it 'returns the file path relative to the CarrierWave root' do - assert_upload_path('/-/system/project/avatar/1234/avatar.jpg', 'uploads/-/system/project/avatar/1234/avatar.jpg') - end - end - - context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - it 'returns the file path relative to the project directory in uploads' do - project = create_project - random_hex = SecureRandom.hex - - assert_upload_path("/#{get_full_path(project)}/#{random_hex}/Some file.jpg", "#{random_hex}/Some file.jpg") - end - end - end - - describe '#uploader' do - def assert_uploader(file_path, expected_uploader) - untracked_file = create_untracked_file(file_path) - - expect(untracked_file.uploader).to eq(expected_uploader) - end - - context 'for an appearance logo file path' do - it 'returns AttachmentUploader as a string' do - assert_uploader('/-/system/appearance/logo/1/some_logo.jpg', 'AttachmentUploader') - end - end - - context 'for an appearance header_logo file path' do - it 'returns AttachmentUploader as a string' do - assert_uploader('/-/system/appearance/header_logo/1/some_logo.jpg', 'AttachmentUploader') - end - end - - context 'for a pre-Markdown Note attachment file path' do - it 'returns AttachmentUploader as a string' do - assert_uploader('/-/system/note/attachment/1234/some_attachment.pdf', 'AttachmentUploader') - end - end - - context 'for a user avatar file path' do - it 'returns AvatarUploader as a string' do - assert_uploader('/-/system/user/avatar/1234/avatar.jpg', 'AvatarUploader') - end - end - - context 'for a group avatar file path' do - it 'returns AvatarUploader as a string' do - assert_uploader('/-/system/group/avatar/1234/avatar.jpg', 'AvatarUploader') - end - end - - context 'for a project avatar file path' do - it 'returns AvatarUploader as a string' do - assert_uploader('/-/system/project/avatar/1234/avatar.jpg', 'AvatarUploader') - end - end - - context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - it 'returns FileUploader as a string' do - project = create_project - - assert_uploader("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", 'FileUploader') - end - end - end - - describe '#model_type' do - def assert_model_type(file_path, expected_model_type) - untracked_file = create_untracked_file(file_path) - - expect(untracked_file.model_type).to eq(expected_model_type) - end - - context 'for an appearance logo file path' do - it 'returns Appearance as a string' do - assert_model_type('/-/system/appearance/logo/1/some_logo.jpg', 'Appearance') - end - end - - context 'for an appearance header_logo file path' do - it 'returns Appearance as a string' do - assert_model_type('/-/system/appearance/header_logo/1/some_logo.jpg', 'Appearance') - end - end - - context 'for a pre-Markdown Note attachment file path' do - it 'returns Note as a string' do - assert_model_type('/-/system/note/attachment/1234/some_attachment.pdf', 'Note') - end - end - - context 'for a user avatar file path' do - it 'returns User as a string' do - assert_model_type('/-/system/user/avatar/1234/avatar.jpg', 'User') - end - end - - context 'for a group avatar file path' do - it 'returns Namespace as a string' do - assert_model_type('/-/system/group/avatar/1234/avatar.jpg', 'Namespace') - end - end - - context 'for a project avatar file path' do - it 'returns Project as a string' do - assert_model_type('/-/system/project/avatar/1234/avatar.jpg', 'Project') - end - end - - context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - it 'returns Project as a string' do - project = create_project - - assert_model_type("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", 'Project') - end - end - end - - describe '#model_id' do - def assert_model_id(file_path, expected_model_id) - untracked_file = create_untracked_file(file_path) - - expect(untracked_file.model_id).to eq(expected_model_id) - end - - context 'for an appearance logo file path' do - it 'returns the ID as a string' do - assert_model_id('/-/system/appearance/logo/1/some_logo.jpg', 1) - end - end - - context 'for an appearance header_logo file path' do - it 'returns the ID as a string' do - assert_model_id('/-/system/appearance/header_logo/1/some_logo.jpg', 1) - end - end - - context 'for a pre-Markdown Note attachment file path' do - it 'returns the ID as a string' do - assert_model_id('/-/system/note/attachment/1234/some_attachment.pdf', 1234) - end - end - - context 'for a user avatar file path' do - it 'returns the ID as a string' do - assert_model_id('/-/system/user/avatar/1234/avatar.jpg', 1234) - end - end - - context 'for a group avatar file path' do - it 'returns the ID as a string' do - assert_model_id('/-/system/group/avatar/1234/avatar.jpg', 1234) - end - end - - context 'for a project avatar file path' do - it 'returns the ID as a string' do - assert_model_id('/-/system/project/avatar/1234/avatar.jpg', 1234) - end - end - - context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - it 'returns the ID as a string' do - project = create_project - - assert_model_id("/#{get_full_path(project)}/#{SecureRandom.hex}/Some file.jpg", project.id) - end - end - end - - describe '#file_size' do - context 'for an appearance logo file path' do - let(:appearance) { create_or_update_appearance(logo: true) } - let(:untracked_file) { described_class.create!(path: get_uploads(appearance, 'Appearance').first.path) } - - it 'returns the file size' do - expect(untracked_file.file_size).to eq(1062) - end - end - - context 'for a project avatar file path' do - let(:project) { create_project(avatar: true) } - let(:untracked_file) { described_class.create!(path: get_uploads(project, 'Project').first.path) } - - it 'returns the file size' do - expect(untracked_file.file_size).to eq(1062) - end - end - - context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do - let(:project) { create_project } - let(:untracked_file) { create_untracked_file("/#{get_full_path(project)}/#{get_uploads(project, 'Project').first.path}") } - - before do - add_markdown_attachment(project) - end - - it 'returns the file size' do - expect(untracked_file.file_size).to eq(1062) - end - end - end - - def create_untracked_file(path_relative_to_upload_dir) - described_class.create!(path: "#{Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR}#{path_relative_to_upload_dir}") - end -end From a02fed20d0227dc6455fb0e4aef68c01b7dddcdf Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Tue, 20 Feb 2018 12:00:00 -0800 Subject: [PATCH 15/81] Move TrackUntrackedUploadsHelpers into MigrationsHelpers namespace just for organization. --- .../untracked_file_spec.rb | 2 +- .../populate_untracked_uploads_spec.rb | 6 +- .../prepare_untracked_uploads_spec.rb | 2 +- .../track_untracked_uploads_spec.rb | 2 +- .../track_untracked_uploads_helpers.rb | 128 ++++++++++++++++++ .../track_untracked_uploads_helpers.rb | 126 ----------------- 6 files changed, 134 insertions(+), 132 deletions(-) create mode 100644 spec/support/migrations_helpers/track_untracked_uploads_helpers.rb delete mode 100644 spec/support/track_untracked_uploads_helpers.rb diff --git a/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb b/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb index 2bc31be9ca3..c76adcbe2f5 100644 --- a/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb +++ b/spec/lib/gitlab/background_migration/populate_untracked_uploads_dependencies/untracked_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' # Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. describe Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::UntrackedFile, :migration, schema: 20180208183958 do - include TrackUntrackedUploadsHelpers + include MigrationsHelpers::TrackUntrackedUploadsHelpers let!(:appearances) { table(:appearances) } let!(:namespaces) { table(:namespaces) } diff --git a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb index d8f2c2bb07f..0d2074eed22 100644 --- a/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/populate_untracked_uploads_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' # Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migration, schema: 20180208183958 do - include TrackUntrackedUploadsHelpers + include MigrationsHelpers::TrackUntrackedUploadsHelpers subject { described_class.new } @@ -38,8 +38,8 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq, :migra untracked_files_for_uploads.create!(path: get_uploads(user2, 'User').first.path) untracked_files_for_uploads.create!(path: get_uploads(project1, 'Project').first.path) untracked_files_for_uploads.create!(path: get_uploads(project2, 'Project').first.path) - untracked_files_for_uploads.create!(path: "#{legacy_project_uploads_dir(project1).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project1, 'Project').last.path}") - untracked_files_for_uploads.create!(path: "#{legacy_project_uploads_dir(project2).sub("#{TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project2, 'Project').last.path}") + untracked_files_for_uploads.create!(path: "#{legacy_project_uploads_dir(project1).sub("#{MigrationsHelpers::TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project1, 'Project').last.path}") + untracked_files_for_uploads.create!(path: "#{legacy_project_uploads_dir(project2).sub("#{MigrationsHelpers::TrackUntrackedUploadsHelpers::PUBLIC_DIR}/", '')}/#{get_uploads(project2, 'Project').last.path}") # Untrack 4 files get_uploads(user2, 'User').delete_all diff --git a/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb index e66b163f2ff..881d40b4404 100644 --- a/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' # Rollback DB to 10.5 (later than this was originally written for) because it still needs to work. describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq, :migration, schema: 20180208183958 do - include TrackUntrackedUploadsHelpers + include MigrationsHelpers::TrackUntrackedUploadsHelpers let!(:untracked_files_for_uploads) { described_class::UntrackedFile } let!(:appearances) { table(:appearances) } diff --git a/spec/migrations/track_untracked_uploads_spec.rb b/spec/migrations/track_untracked_uploads_spec.rb index fe4d5b8a279..2fccfb3f12c 100644 --- a/spec/migrations/track_untracked_uploads_spec.rb +++ b/spec/migrations/track_untracked_uploads_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' require Rails.root.join('db', 'post_migrate', '20171103140253_track_untracked_uploads') describe TrackUntrackedUploads, :migration, :sidekiq do - include TrackUntrackedUploadsHelpers + include MigrationsHelpers::TrackUntrackedUploadsHelpers it 'correctly schedules the follow-up background migration' do Sidekiq::Testing.fake! do diff --git a/spec/support/migrations_helpers/track_untracked_uploads_helpers.rb b/spec/support/migrations_helpers/track_untracked_uploads_helpers.rb new file mode 100644 index 00000000000..016bcfa9b1b --- /dev/null +++ b/spec/support/migrations_helpers/track_untracked_uploads_helpers.rb @@ -0,0 +1,128 @@ +module MigrationsHelpers + module TrackUntrackedUploadsHelpers + PUBLIC_DIR = File.join(Rails.root, 'tmp', 'tests', 'public') + UPLOADS_DIR = File.join(PUBLIC_DIR, 'uploads') + SYSTEM_DIR = File.join(UPLOADS_DIR, '-', 'system') + UPLOAD_FILENAME = 'image.png'.freeze + FIXTURE_FILE_PATH = File.join(Rails.root, 'spec', 'fixtures', 'dk.png') + FIXTURE_CHECKSUM = 'b804383982bb89b00e828e3f44c038cc991d3d1768009fc39ba8e2c081b9fb75'.freeze + + def create_or_update_appearance(logo: false, header_logo: false) + appearance = appearances.first_or_create(title: 'foo', description: 'bar', logo: (UPLOAD_FILENAME if logo), header_logo: (UPLOAD_FILENAME if header_logo)) + + add_upload(appearance, 'Appearance', 'logo', 'AttachmentUploader') if logo + add_upload(appearance, 'Appearance', 'header_logo', 'AttachmentUploader') if header_logo + + appearance + end + + def create_group(avatar: false) + index = unique_index(:group) + group = namespaces.create(name: "group#{index}", path: "group#{index}", avatar: (UPLOAD_FILENAME if avatar)) + + add_upload(group, 'Group', 'avatar', 'AvatarUploader') if avatar + + group + end + + def create_note(attachment: false) + note = notes.create(attachment: (UPLOAD_FILENAME if attachment)) + + add_upload(note, 'Note', 'attachment', 'AttachmentUploader') if attachment + + note + end + + def create_project(avatar: false) + group = create_group + project = projects.create(namespace_id: group.id, path: "project#{unique_index(:project)}", avatar: (UPLOAD_FILENAME if avatar)) + routes.create(path: "#{group.path}/#{project.path}", source_id: project.id, source_type: 'Project') # so Project.find_by_full_path works + + add_upload(project, 'Project', 'avatar', 'AvatarUploader') if avatar + + project + end + + def create_user(avatar: false) + user = users.create(email: "foo#{unique_index(:user)}@bar.com", avatar: (UPLOAD_FILENAME if avatar), projects_limit: 100) + + add_upload(user, 'User', 'avatar', 'AvatarUploader') if avatar + + user + end + + def unique_index(name = :unnamed) + @unique_index ||= {} + @unique_index[name] ||= 0 + @unique_index[name] += 1 + end + + def add_upload(model, model_type, attachment_type, uploader) + file_path = upload_file_path(model, model_type, attachment_type) + path_relative_to_public = file_path.sub("#{PUBLIC_DIR}/", '') + create_file(file_path) + + uploads.create!( + size: 1062, + path: path_relative_to_public, + model_id: model.id, + model_type: model_type == 'Group' ? 'Namespace' : model_type, + uploader: uploader, + checksum: FIXTURE_CHECKSUM + ) + end + + def add_markdown_attachment(project, hashed_storage: false) + project_dir = hashed_storage ? hashed_project_uploads_dir(project) : legacy_project_uploads_dir(project) + attachment_dir = File.join(project_dir, SecureRandom.hex) + attachment_file_path = File.join(attachment_dir, UPLOAD_FILENAME) + project_attachment_path_relative_to_project = attachment_file_path.sub("#{project_dir}/", '') + create_file(attachment_file_path) + + uploads.create!( + size: 1062, + path: project_attachment_path_relative_to_project, + model_id: project.id, + model_type: 'Project', + uploader: 'FileUploader', + checksum: FIXTURE_CHECKSUM + ) + end + + def legacy_project_uploads_dir(project) + namespace = namespaces.find_by(id: project.namespace_id) + File.join(UPLOADS_DIR, namespace.path, project.path) + end + + def hashed_project_uploads_dir(project) + File.join(UPLOADS_DIR, '@hashed', 'aa', 'aaaaaaaaaaaa') + end + + def upload_file_path(model, model_type, attachment_type) + dir = File.join(upload_dir(model_type.downcase, attachment_type.to_s), model.id.to_s) + File.join(dir, UPLOAD_FILENAME) + end + + def upload_dir(model_type, attachment_type) + File.join(SYSTEM_DIR, model_type, attachment_type) + end + + def create_file(path) + File.delete(path) if File.exist?(path) + FileUtils.mkdir_p(File.dirname(path)) + FileUtils.cp(FIXTURE_FILE_PATH, path) + end + + def get_uploads(model, model_type) + uploads.where(model_type: model_type, model_id: model.id) + end + + def get_full_path(project) + routes.find_by(source_id: project.id, source_type: 'Project').path + end + + def ensure_temporary_tracking_table_exists + Gitlab::BackgroundMigration::PrepareUntrackedUploads.new.send(:ensure_temporary_tracking_table_exists) + end + end +end diff --git a/spec/support/track_untracked_uploads_helpers.rb b/spec/support/track_untracked_uploads_helpers.rb deleted file mode 100644 index 87a86dd21af..00000000000 --- a/spec/support/track_untracked_uploads_helpers.rb +++ /dev/null @@ -1,126 +0,0 @@ -module TrackUntrackedUploadsHelpers - PUBLIC_DIR = File.join(Rails.root, 'tmp', 'tests', 'public') - UPLOADS_DIR = File.join(PUBLIC_DIR, 'uploads') - SYSTEM_DIR = File.join(UPLOADS_DIR, '-', 'system') - UPLOAD_FILENAME = 'image.png'.freeze - FIXTURE_FILE_PATH = File.join(Rails.root, 'spec', 'fixtures', 'dk.png') - FIXTURE_CHECKSUM = 'b804383982bb89b00e828e3f44c038cc991d3d1768009fc39ba8e2c081b9fb75'.freeze - - def create_or_update_appearance(logo: false, header_logo: false) - appearance = appearances.first_or_create(title: 'foo', description: 'bar', logo: (UPLOAD_FILENAME if logo), header_logo: (UPLOAD_FILENAME if header_logo)) - - add_upload(appearance, 'Appearance', 'logo', 'AttachmentUploader') if logo - add_upload(appearance, 'Appearance', 'header_logo', 'AttachmentUploader') if header_logo - - appearance - end - - def create_group(avatar: false) - index = unique_index(:group) - group = namespaces.create(name: "group#{index}", path: "group#{index}", avatar: (UPLOAD_FILENAME if avatar)) - - add_upload(group, 'Group', 'avatar', 'AvatarUploader') if avatar - - group - end - - def create_note(attachment: false) - note = notes.create(attachment: (UPLOAD_FILENAME if attachment)) - - add_upload(note, 'Note', 'attachment', 'AttachmentUploader') if attachment - - note - end - - def create_project(avatar: false) - group = create_group - project = projects.create(namespace_id: group.id, path: "project#{unique_index(:project)}", avatar: (UPLOAD_FILENAME if avatar)) - routes.create(path: "#{group.path}/#{project.path}", source_id: project.id, source_type: 'Project') # so Project.find_by_full_path works - - add_upload(project, 'Project', 'avatar', 'AvatarUploader') if avatar - - project - end - - def create_user(avatar: false) - user = users.create(email: "foo#{unique_index(:user)}@bar.com", avatar: (UPLOAD_FILENAME if avatar), projects_limit: 100) - - add_upload(user, 'User', 'avatar', 'AvatarUploader') if avatar - - user - end - - def unique_index(name = :unnamed) - @unique_index ||= {} - @unique_index[name] ||= 0 - @unique_index[name] += 1 - end - - def add_upload(model, model_type, attachment_type, uploader) - file_path = upload_file_path(model, model_type, attachment_type) - path_relative_to_public = file_path.sub("#{PUBLIC_DIR}/", '') - create_file(file_path) - - uploads.create!( - size: 1062, - path: path_relative_to_public, - model_id: model.id, - model_type: model_type == 'Group' ? 'Namespace' : model_type, - uploader: uploader, - checksum: FIXTURE_CHECKSUM - ) - end - - def add_markdown_attachment(project, hashed_storage: false) - project_dir = hashed_storage ? hashed_project_uploads_dir(project) : legacy_project_uploads_dir(project) - attachment_dir = File.join(project_dir, SecureRandom.hex) - attachment_file_path = File.join(attachment_dir, UPLOAD_FILENAME) - project_attachment_path_relative_to_project = attachment_file_path.sub("#{project_dir}/", '') - create_file(attachment_file_path) - - uploads.create!( - size: 1062, - path: project_attachment_path_relative_to_project, - model_id: project.id, - model_type: 'Project', - uploader: 'FileUploader', - checksum: FIXTURE_CHECKSUM - ) - end - - def legacy_project_uploads_dir(project) - namespace = namespaces.find_by(id: project.namespace_id) - File.join(UPLOADS_DIR, namespace.path, project.path) - end - - def hashed_project_uploads_dir(project) - File.join(UPLOADS_DIR, '@hashed', 'aa', 'aaaaaaaaaaaa') - end - - def upload_file_path(model, model_type, attachment_type) - dir = File.join(upload_dir(model_type.downcase, attachment_type.to_s), model.id.to_s) - File.join(dir, UPLOAD_FILENAME) - end - - def upload_dir(model_type, attachment_type) - File.join(SYSTEM_DIR, model_type, attachment_type) - end - - def create_file(path) - File.delete(path) if File.exist?(path) - FileUtils.mkdir_p(File.dirname(path)) - FileUtils.cp(FIXTURE_FILE_PATH, path) - end - - def get_uploads(model, model_type) - uploads.where(model_type: model_type, model_id: model.id) - end - - def get_full_path(project) - routes.find_by(source_id: project.id, source_type: 'Project').path - end - - def ensure_temporary_tracking_table_exists - Gitlab::BackgroundMigration::PrepareUntrackedUploads.new.send(:ensure_temporary_tracking_table_exists) - end -end From 3f017f07ee27a90984255948f7979390b17e20ae Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Tue, 20 Feb 2018 12:02:03 -0800 Subject: [PATCH 16/81] Prefer `table` helper in migration specs --- .../background_migration/prepare_untracked_uploads_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb b/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb index 881d40b4404..35750d89c35 100644 --- a/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb +++ b/spec/lib/gitlab/background_migration/prepare_untracked_uploads_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq, :migration, schema: 20180208183958 do include MigrationsHelpers::TrackUntrackedUploadsHelpers - let!(:untracked_files_for_uploads) { described_class::UntrackedFile } + let!(:untracked_files_for_uploads) { table(:untracked_files_for_uploads) } let!(:appearances) { table(:appearances) } let!(:namespaces) { table(:namespaces) } let!(:projects) { table(:projects) } From 1521fd9f5ca6e19d282bbd7253e64d741ab44380 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Tue, 20 Feb 2018 18:59:19 -0300 Subject: [PATCH 17/81] Add unit tests to presenter methods --- app/presenters/project_presenter.rb | 74 +++--- spec/presenters/project_presenter_spec.rb | 274 ++++++++++++++++++++++ 2 files changed, 315 insertions(+), 33 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index aa708c656ff..8dca777212e 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -100,6 +100,14 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated add_special_file_path(file_name: 'LICENSE') end + def add_changelog_path + add_special_file_path(file_name: 'CHANGELOG') + end + + def add_contribution_guide_path + add_special_file_path(file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') + end + def add_ci_yml_path add_special_file_path(file_name: '.gitlab-ci.yml') end @@ -150,36 +158,6 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated license&.nickname || license&.name || 'LICENSE' end - private - - def filename_path(filename) - if blob = repository.public_send(filename) # rubocop:disable GitlabSecurity/PublicSend - project_blob_path( - project, - tree_join(default_branch, blob.name) - ) - end - end - - def anonymous_project_view - if !project.empty_repo? && can?(current_user, :download_code, project) - 'files' - else - 'activity' - end - end - - def add_special_file_path(file_name:, commit_message: nil, branch_name: nil) - commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name } - project_new_blob_path( - project, - project.default_branch || 'master', - file_name: file_name, - commit_message: commit_message, - branch_name: branch_name - ) - end - def can_current_user_push_code? if empty_repo? can?(current_user, :push_code, project) @@ -237,7 +215,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated if current_user && can_current_user_push_code? && repository.changelog.blank? OpenStruct.new(enabled: false, label: _('Add Changelog'), - link: add_special_file_path(file_name: 'CHANGELOG')) + link: add_changelog_path) elsif repository.changelog.present? OpenStruct.new(enabled: true, label: _('Changelog'), @@ -261,7 +239,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated if current_user && can_current_user_push_code? && repository.contribution_guide.blank? OpenStruct.new(enabled: false, label: _('Add Contribution guide'), - link: add_special_file_path(file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide')) + link: add_contribution_guide_path) elsif repository.contribution_guide.present? OpenStruct.new(enabled: true, label: _('Contribution guide'), @@ -283,7 +261,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated def kubernetes_cluster_anchor_data if current_user && can?(current_user, :create_cluster, project) - cluster_link = clusters.size == 1 ? project_cluster_path(project, clusters.first) : project_clusters_path(project) + cluster_link = clusters.count == 1 ? project_cluster_path(project, clusters.first) : project_clusters_path(project) if clusters.empty? cluster_link = new_project_cluster_path(project) @@ -315,6 +293,36 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end end + private + + def filename_path(filename) + if blob = repository.public_send(filename) # rubocop:disable GitlabSecurity/PublicSend + project_blob_path( + project, + tree_join(default_branch, blob.name) + ) + end + end + + def anonymous_project_view + if !project.empty_repo? && can?(current_user, :download_code, project) + 'files' + else + 'activity' + end + end + + def add_special_file_path(file_name:, commit_message: nil, branch_name: nil) + commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name } + project_new_blob_path( + project, + project.default_branch || 'master', + file_name: file_name, + commit_message: commit_message, + branch_name: branch_name + ) + end + def koding_enabled? Gitlab::CurrentSettings.koding_enabled? end diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb index 80e66b87175..a984f01ac64 100644 --- a/spec/presenters/project_presenter_spec.rb +++ b/spec/presenters/project_presenter_spec.rb @@ -120,4 +120,278 @@ describe ProjectPresenter do end end end + + describe '#can_current_user_push_code?' do + let(:project) { create(:project, :repository) } + let(:presenter) { described_class.new(project, current_user: user) } + + context 'empty repo' do + let(:project) { create(:project) } + + it 'returns true if user can push_code' do + project.add_developer(user) + + expect(presenter.can_current_user_push_code?).to be(true) + end + + it 'returns false if user cannot push_code' do + project.add_reporter(user) + + expect(presenter.can_current_user_push_code?).to be(false) + end + end + + context 'not empty repo' do + let(:project) { create(:project, :repository) } + + it 'returns true if user can push to default branch' do + project.add_developer(user) + + expect(presenter.can_current_user_push_code?).to be(true) + end + + it 'returns false if default branch is protected' do + project.add_developer(user) + create(:protected_branch, project: project, name: project.default_branch) + + expect(presenter.can_current_user_push_code?).to be(false) + end + end + end + + context 'statistics anchors' do + let(:project) { create(:project, :repository) } + let(:presenter) { described_class.new(project, current_user: user) } + + describe '#files_anchor_data' do + it 'returns files data' do + expect(presenter.files_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Files (0 Bytes)', + link: presenter.project_tree_path(project))) + end + end + + describe '#commits_anchor_data' do + it 'returns commits data' do + expect(presenter.commits_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Commits (0)', + link: presenter.project_commits_path(project, project.repository.root_ref))) + end + end + + describe '#branches_anchor_data' do + it 'returns branches data' do + expect(presenter.branches_anchor_data).to eq(OpenStruct.new(enabled: true, + label: "Branches (#{project.repository.branches.size})", + link: presenter.project_branches_path(project))) + end + end + + describe '#tags_anchor_data' do + it 'returns tags data' do + expect(presenter.tags_anchor_data).to eq(OpenStruct.new(enabled: true, + label: "Tags (#{project.repository.tags.size})", + link: presenter.project_tags_path(project))) + end + end + + describe '#new_file_anchor_data' do + it 'returns new file data if user can push' do + project.add_developer(user) + + expect(presenter.new_file_anchor_data).to eq(OpenStruct.new(enabled: false, + label: "New file", + link: presenter.project_new_blob_path(project, 'master'), + class_modifier: 'new')) + end + + it 'returns nil if user cannot push' do + expect(presenter.new_file_anchor_data).to be_nil + end + end + + describe '#readme_anchor_data' do + context 'when user can push and README does not exists' do + it 'returns anchor data' do + project.add_developer(user) + allow(project.repository).to receive(:readme).and_return(nil) + + expect(presenter.readme_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Add Readme', + link: presenter.add_readme_path)) + end + end + + context 'when README exists' do + it 'returns anchor data' do + allow(project.repository).to receive(:readme).and_return(double(name: 'readme')) + + expect(presenter.readme_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Readme', + link: presenter.readme_path)) + end + end + end + + describe '#changelog_anchor_data' do + context 'when user can push and CHANGELOG does not exists' do + it 'returns anchor data' do + project.add_developer(user) + allow(project.repository).to receive(:changelog).and_return(nil) + + expect(presenter.changelog_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Add Changelog', + link: presenter.add_changelog_path)) + end + end + + context 'when CHANGELOG exists' do + it 'returns anchor data' do + allow(project.repository).to receive(:changelog).and_return(double(name: 'foo')) + + expect(presenter.changelog_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Changelog', + link: presenter.changelog_path)) + end + end + end + + describe '#license_anchor_data' do + context 'when user can push and LICENSE does not exists' do + it 'returns anchor data' do + project.add_developer(user) + allow(project.repository).to receive(:license_blob).and_return(nil) + + expect(presenter.license_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Add License', + link: presenter.add_license_path)) + end + end + + context 'when LICENSE exists' do + it 'returns anchor data' do + allow(project.repository).to receive(:license_blob).and_return(double(name: 'foo')) + + expect(presenter.license_anchor_data).to eq(OpenStruct.new(enabled: true, + label: presenter.license_short_name, + link: presenter.license_path)) + end + end + end + + describe '#contribution_guide_anchor_data' do + context 'when user can push and CONTRIBUTING does not exists' do + it 'returns anchor data' do + project.add_developer(user) + allow(project.repository).to receive(:contribution_guide).and_return(nil) + + expect(presenter.contribution_guide_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Add Contribution guide', + link: presenter.add_contribution_guide_path)) + end + end + + context 'when CONTRIBUTING exists' do + it 'returns anchor data' do + allow(project.repository).to receive(:contribution_guide).and_return(double(name: 'foo')) + + expect(presenter.contribution_guide_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Contribution guide', + link: presenter.contribution_guide_path)) + end + end + end + + describe '#autodevops_anchor_data' do + context 'when Auto Devops is enabled' do + it 'returns anchor data' do + allow(project).to receive(:auto_devops_enabled?).and_return(true) + + expect(presenter.autodevops_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Auto DevOps enabled', + link: nil)) + end + end + + context 'when user can admin pipeline and CI yml does not exists' do + it 'returns anchor data' do + project.add_master(user) + allow(project).to receive(:auto_devops_enabled?).and_return(false) + allow(project.repository).to receive(:gitlab_ci_yml).and_return(nil) + + expect(presenter.autodevops_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Enable Auto DevOps', + link: presenter.project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings'))) + end + end + end + + describe '#kubernetes_cluster_anchor_data' do + context 'when user can create Kubernetes cluster' do + it 'returns link to cluster if only one exists' do + project.add_master(user) + cluster = create(:cluster, projects: [project]) + + expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Kubernetes cluster', + link: presenter.project_cluster_path(project, cluster))) + end + + it 'returns link to clusters page if more than one exists' do + project.add_master(user) + cluster_1 = create(:cluster, projects: [project]) + cluster_2 = create(:cluster, projects: [project]) + + expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: true, + label: 'Kubernetes clusters', + link: presenter.project_clusters_path(project))) + end + + it 'returns link to create a cluster if no cluster exists' do + project.add_master(user) + + expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Add Kubernetes cluster', + link: presenter.new_project_cluster_path(project))) + end + end + + context 'when user cannot create Kubernetes cluster' do + it 'returns nil' do + expect(presenter.kubernetes_cluster_anchor_data).to be_nil + end + end + end + + describe '#koding_anchor_data' do + it 'returns link to setup Koding if user can push and no koding YML exists' do + project.add_developer(user) + allow(project.repository).to receive(:koding_yml).and_return(nil) + allow(Gitlab::CurrentSettings).to receive(:koding_enabled?).and_return(true) + + expect(presenter.koding_anchor_data).to eq(OpenStruct.new(enabled: false, + label: 'Set up Koding', + link: presenter.add_koding_stack_path)) + end + + it 'returns nil if user cannot push' do + expect(presenter.koding_anchor_data).to be_nil + end + + it 'returns nil if koding is not enabled' do + project.add_developer(user) + allow(Gitlab::CurrentSettings).to receive(:koding_enabled?).and_return(false) + + expect(presenter.koding_anchor_data).to be_nil + end + + it 'returns nil if koding YML already exists' do + project.add_developer(user) + allow(project.repository).to receive(:koding_yml).and_return(double) + allow(Gitlab::CurrentSettings).to receive(:koding_enabled?).and_return(true) + + expect(presenter.koding_anchor_data).to be_nil + end + end + end end From 70156f3b8e277ffeba2a6c37d15ec2669fb432d7 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Tue, 20 Feb 2018 19:04:10 -0300 Subject: [PATCH 18/81] Memoize method which is called multiple times on presenter --- app/presenters/project_presenter.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index 8dca777212e..843651682eb 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -4,6 +4,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated include GitlabRoutingHelper include StorageHelper include TreeHelper + include Gitlab::Utils::StrongMemoize presents :project @@ -159,10 +160,12 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def can_current_user_push_code? - if empty_repo? - can?(current_user, :push_code, project) - else - user_can_push_to_branch?(current_user, default_branch) + strong_memoize(:can_current_user_push_code) do + if empty_repo? + can?(current_user, :push_code, project) + else + user_can_push_to_branch?(current_user, default_branch) + end end end From 5d814468d9f0fc0e892100471f0b5cc7f031f2e3 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Wed, 21 Feb 2018 14:01:02 +0100 Subject: [PATCH 19/81] Change cache index delimiter to character not recognizable as variable part --- app/models/ci/build.rb | 2 +- spec/models/ci/build_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index ee987949080..b230b7f47ef 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -467,7 +467,7 @@ module Ci if cache && project.jobs_cache_index cache = cache.merge( - key: "#{cache[:key]}_#{project.jobs_cache_index}") + key: "#{cache[:key]}-#{project.jobs_cache_index}") end [cache] diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 2b6b6a61182..c27313ed88b 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -277,7 +277,7 @@ describe Ci::Build do allow_any_instance_of(Project).to receive(:jobs_cache_index).and_return(1) end - it { is_expected.to be_an(Array).and all(include(key: "key_1")) } + it { is_expected.to be_an(Array).and all(include(key: "key-1")) } end context 'when project does not have jobs_cache_index' do From a0f020cd0d781cf8e361c217759e159ee01777ab Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Wed, 21 Feb 2018 14:04:32 +0100 Subject: [PATCH 20/81] Add CHANGELOG entry --- changelogs/unreleased/43373-fix-cache-index-appending.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelogs/unreleased/43373-fix-cache-index-appending.yml diff --git a/changelogs/unreleased/43373-fix-cache-index-appending.yml b/changelogs/unreleased/43373-fix-cache-index-appending.yml new file mode 100644 index 00000000000..fdb293ea04d --- /dev/null +++ b/changelogs/unreleased/43373-fix-cache-index-appending.yml @@ -0,0 +1,5 @@ +--- +title: Fix issue with cache key being empty when variable used as the key +merge_request: 17260 +author: +type: fixed From 082a32350a2913a73f2ee2e811d3bdb78e62f33e Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Wed, 21 Feb 2018 10:47:13 -0300 Subject: [PATCH 21/81] Use method call instead hash accesses --- app/presenters/project_presenter.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index 843651682eb..d193a182da3 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -21,7 +21,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated gitlab_ci_anchor_data, autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout), kubernetes_cluster_anchor_data - ].compact.reject { |i| !i[:enabled] } + ].compact.reject { |item| !item.enabled? } end def statistics_buttons(show_auto_devops_callout:) @@ -33,14 +33,14 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated kubernetes_cluster_anchor_data, gitlab_ci_anchor_data, koding_anchor_data - ].compact.reject { |i| i[:enabled] } + ].compact.reject { |item| item.enabled? } end def empty_repo_statistics_anchors [ autodevops_anchor_data, kubernetes_cluster_anchor_data - ].compact.reject { |i| !i[:enabled] } + ].compact.reject { |item| !item.enabled? } end def empty_repo_statistics_buttons @@ -50,7 +50,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated license_anchor_data, autodevops_anchor_data, kubernetes_cluster_anchor_data - ].compact.reject { |i| i[:enabled] } + ].compact.reject { |item| item.enabled? } end def default_view From 5cefa20a3ce5156a73b897c4eafb6c8e74676d63 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Wed, 21 Feb 2018 10:49:38 -0300 Subject: [PATCH 22/81] Make ruby-lint happy --- spec/presenters/project_presenter_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb index a984f01ac64..3a3423c99c8 100644 --- a/spec/presenters/project_presenter_spec.rb +++ b/spec/presenters/project_presenter_spec.rb @@ -339,8 +339,8 @@ describe ProjectPresenter do it 'returns link to clusters page if more than one exists' do project.add_master(user) - cluster_1 = create(:cluster, projects: [project]) - cluster_2 = create(:cluster, projects: [project]) + create(:cluster, projects: [project]) + create(:cluster, projects: [project]) expect(presenter.kubernetes_cluster_anchor_data).to eq(OpenStruct.new(enabled: true, label: 'Kubernetes clusters', From 1fda2c838ec1aca0f9446683c3c741f9995b85a8 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Wed, 21 Feb 2018 10:22:38 -0600 Subject: [PATCH 23/81] Link "add a Kubernetes cluster" to new cluster page See https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/16900#note_59936315 --- app/views/projects/empty.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 34f3482d7c6..31a1e543ffa 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -24,7 +24,7 @@ %hr %p - link_to_auto_devops_settings = link_to(s_('AutoDevOps|enable Auto DevOps (Beta)'), project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings')) - - link_to_add_kubernetes_cluster = link_to(s_('AutoDevOps|add a Kubernetes cluster'), project_clusters_path(@project)) + - link_to_add_kubernetes_cluster = link_to(s_('AutoDevOps|add a Kubernetes cluster'), new_project_cluster_path(@project)) = s_('AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}.').html_safe % { link_to_auto_devops_settings: link_to_auto_devops_settings, link_to_add_kubernetes_cluster: link_to_add_kubernetes_cluster } %hr From 6dcadfc900ad309546b89c9c958b7a5c78931595 Mon Sep 17 00:00:00 2001 From: Victor Wu Date: Wed, 21 Feb 2018 16:54:56 +0000 Subject: [PATCH 24/81] Revert "Merge branch 'tc-info-version-check' into 'master'" This reverts merge request !17257 --- app/views/admin/application_settings/_form.html.haml | 5 +---- changelogs/unreleased/tc-info-version-check.yml | 5 ----- doc/user/admin_area/settings/usage_statistics.md | 5 ++--- 3 files changed, 3 insertions(+), 12 deletions(-) delete mode 100644 changelogs/unreleased/tc-info-version-check.yml diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 938185b6eba..60f12030f98 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -647,11 +647,8 @@ = f.label :version_check_enabled do = f.check_box :version_check_enabled Version check enabled - = link_to icon('question-circle'), help_page_path("user/admin_area/settings/usage_statistics", anchor: "version-check") .help-block - Let GitLab inform you when an update is available. When - enabled, GitLab Inc. will collect info about your hostname - and version. + Let GitLab inform you when an update is available. .form-group .col-sm-offset-2.col-sm-10 - can_be_configured = @application_setting.usage_ping_can_be_configured? diff --git a/changelogs/unreleased/tc-info-version-check.yml b/changelogs/unreleased/tc-info-version-check.yml deleted file mode 100644 index 9f20d03b864..00000000000 --- a/changelogs/unreleased/tc-info-version-check.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add more info about data collected when version check is enabled -merge_request: 17257 -author: -type: changed diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md index 81b135a5b37..d874688cc29 100644 --- a/doc/user/admin_area/settings/usage_statistics.md +++ b/doc/user/admin_area/settings/usage_statistics.md @@ -10,9 +10,8 @@ under **Admin area > Settings > Usage statistics**. GitLab can inform you when an update is available and the importance of it. -GitLab Inc. collects version statistics, but no information other than -the GitLab version and the instance's hostname (through the HTTP -referer) is collected. +No information other than the GitLab version and the instance's hostname (through the HTTP referer) +are collected. In the **Overview** tab you can see if your GitLab version is up to date. There are three cases: 1) you are up to date (green), 2) there is an update available From 65da44b25e5af7c8535fa4165e75e22e8b500b52 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Wed, 21 Feb 2018 10:57:41 -0600 Subject: [PATCH 25/81] Fix enabled filtering on stat anchors --- app/presenters/project_presenter.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index d193a182da3..5a46342d47a 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -21,7 +21,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated gitlab_ci_anchor_data, autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout), kubernetes_cluster_anchor_data - ].compact.reject { |item| !item.enabled? } + ].compact.reject { |item| !item.enabled } end def statistics_buttons(show_auto_devops_callout:) @@ -33,14 +33,14 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated kubernetes_cluster_anchor_data, gitlab_ci_anchor_data, koding_anchor_data - ].compact.reject { |item| item.enabled? } + ].compact.reject { |item| item.enabled } end def empty_repo_statistics_anchors [ autodevops_anchor_data, kubernetes_cluster_anchor_data - ].compact.reject { |item| !item.enabled? } + ].compact.reject { |item| !item.enabled } end def empty_repo_statistics_buttons @@ -50,7 +50,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated license_anchor_data, autodevops_anchor_data, kubernetes_cluster_anchor_data - ].compact.reject { |item| item.enabled? } + ].compact.reject { |item| item.enabled } end def default_view From 0c357ac83b941e3a3b5d13e8430ec555b384b967 Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Wed, 21 Feb 2018 10:04:42 -0800 Subject: [PATCH 26/81] Use convenient Rails helper --- lib/gitlab/background_migration/populate_untracked_uploads.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/background_migration/populate_untracked_uploads.rb b/lib/gitlab/background_migration/populate_untracked_uploads.rb index c5415bf0f9a..9232f20a063 100644 --- a/lib/gitlab/background_migration/populate_untracked_uploads.rb +++ b/lib/gitlab/background_migration/populate_untracked_uploads.rb @@ -83,7 +83,7 @@ module Gitlab end ids.each do |model_type, model_ids| - model_class = Object.const_get("Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::#{model_type}") + model_class = "Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::#{model_type}".constantize found_ids = model_class.where(id: model_ids.uniq).pluck(:id) deleted_ids = ids[model_type] - found_ids ids[model_type] = deleted_ids From e70fe78281ba07d9a0eb863d66ddf6a13917fde1 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Tue, 20 Feb 2018 09:06:00 +0100 Subject: [PATCH 27/81] Handle branch and tag names which are commit ids Adds a test where a branch name is also a valid commit id. Git, the binary should create an error message which is difficult to parse and leading to errors later, as seen in: gitlab-org/gitlab-ce#43222 To catch these cases in the future, gitlab-test@1942eed5cc108b19c7405106e81fa96125d0be22 was created. Which a branch name matching the commit --- .../zj-branch-contains-git-message.yml | 5 ++++ lib/gitlab/git/repository.rb | 26 +++++++++++------- spec/lib/gitlab/git/repository_spec.rb | 27 +++++++++++++++++++ 3 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 changelogs/unreleased/zj-branch-contains-git-message.yml diff --git a/changelogs/unreleased/zj-branch-contains-git-message.yml b/changelogs/unreleased/zj-branch-contains-git-message.yml new file mode 100644 index 00000000000..ce034e7ec87 --- /dev/null +++ b/changelogs/unreleased/zj-branch-contains-git-message.yml @@ -0,0 +1,5 @@ +--- +title: Allow branch names to be named the same as the sha it points to +merge_request: +author: +type: fixed diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index a10bc0dd32b..072ad312ab8 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -1349,7 +1349,7 @@ module Gitlab if is_enabled gitaly_ref_client.branch_names_contains_sha(sha) else - refs_contains_sha(:branch, sha) + refs_contains_sha('refs/heads/', sha) end end end @@ -1359,7 +1359,7 @@ module Gitlab if is_enabled gitaly_ref_client.tag_names_contains_sha(sha) else - refs_contains_sha(:tag, sha) + refs_contains_sha('refs/tags/', sha) end end end @@ -1458,19 +1458,25 @@ module Gitlab end end - def refs_contains_sha(ref_type, sha) - args = %W(#{ref_type} --contains #{sha}) - names = run_git(args).first + def refs_contains_sha(refs_prefix, sha) + refs_prefix << "/" unless refs_prefix.ends_with?('/') - return [] unless names.respond_to?(:split) + # By forcing the output to %(refname) each line wiht a ref will start with + # the ref prefix. All other lines can be discarded. + args = %W(for-each-ref --contains=#{sha} --format=%(refname) #{refs_prefix}) + names, code = run_git(args) - names = names.split("\n").map(&:strip) + return [] unless code.zero? - names.each do |name| - name.slice! '* ' + refs = [] + left_slice_count = refs_prefix.length + names.lines.each do |line| + next unless line.start_with?(refs_prefix) + + refs << line.rstrip[left_slice_count..-1] end - names + refs end def rugged_write_config(full_path:) diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 0e9150964fa..9feaaec3f3b 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -600,6 +600,33 @@ describe Gitlab::Git::Repository, seed_helper: true do end end + describe '#branch_names_contains_sha' do + shared_examples 'returning the right branches' do + let(:head_id) { repository.rugged.head.target.oid } + let(:new_branch) { head_id } + + before do + repository.create_branch(new_branch, 'master') + end + + after do + repository.delete_branch(new_branch) + end + + it 'displays that branch' do + expect(repository.branch_names_contains_sha(head_id)).to include('master', new_branch) + end + end + + context 'when Gitaly is enabled' do + it_behaves_like 'returning the right branches' + end + + context 'when Gitaly is disabled', :disable_gitaly do + it_behaves_like 'returning the right branches' + end + end + describe "#refs_hash" do subject { repository.refs_hash } From 8446d3df15121a08664187a04e2cfa28c527efb3 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Wed, 21 Feb 2018 13:57:50 -0600 Subject: [PATCH 28/81] Use dynamic imports in dispatcher --- app/assets/javascripts/dispatcher.js | 59 ------------------- .../pages/admin/groups/edit/index.js | 4 +- .../pages/admin/groups/new/index.js | 4 +- .../pages/groups/activity/index.js | 2 +- .../javascripts/pages/groups/edit/index.js | 4 +- .../pages/groups/group_members/index/index.js | 4 +- .../javascripts/pages/groups/new/index.js | 4 +- .../pages/projects/blame/show/index.js | 2 +- .../pages/projects/blob/show/index.js | 4 +- .../pages/projects/find_file/show/index.js | 4 +- .../pages/projects/project_members/index.js | 4 +- .../pages/projects/tree/show/index.js | 5 +- 12 files changed, 20 insertions(+), 80 deletions(-) diff --git a/app/assets/javascripts/dispatcher.js b/app/assets/javascripts/dispatcher.js index a0a2a30d4ca..a9a70e295a6 100644 --- a/app/assets/javascripts/dispatcher.js +++ b/app/assets/javascripts/dispatcher.js @@ -56,70 +56,11 @@ var Dispatcher; case 'projects:activity': case 'projects:commits:show': case 'projects:show': - shortcut_handler = true; - break; - case 'groups:activity': - import('./pages/groups/activity') - .then(callDefault) - .catch(fail); - break; case 'groups:show': - shortcut_handler = true; - break; - case 'groups:group_members:index': - import('./pages/groups/group_members/index') - .then(callDefault) - .catch(fail); - break; - case 'projects:project_members:index': - import('./pages/projects/project_members') - .then(callDefault) - .catch(fail); - break; - case 'groups:create': - case 'groups:new': - import('./pages/groups/new') - .then(callDefault) - .catch(fail); - break; - case 'groups:edit': - import('./pages/groups/edit') - .then(callDefault) - .catch(fail); - break; - case 'admin:groups:create': - case 'admin:groups:new': - import('./pages/admin/groups/new') - .then(callDefault) - .catch(fail); - break; - case 'admin:groups:edit': - import('./pages/admin/groups/edit') - .then(callDefault) - .catch(fail); - break; case 'projects:tree:show': - import('./pages/projects/tree/show') - .then(callDefault) - .catch(fail); - shortcut_handler = true; - break; case 'projects:find_file:show': - import('./pages/projects/find_file/show') - .then(callDefault) - .catch(fail); - shortcut_handler = true; - break; case 'projects:blob:show': - import('./pages/projects/blob/show') - .then(callDefault) - .catch(fail); - shortcut_handler = true; - break; case 'projects:blame:show': - import('./pages/projects/blame/show') - .then(callDefault) - .catch(fail); shortcut_handler = true; break; case 'groups:labels:new': diff --git a/app/assets/javascripts/pages/admin/groups/edit/index.js b/app/assets/javascripts/pages/admin/groups/edit/index.js index ff9ef8d2449..d3d125a1859 100644 --- a/app/assets/javascripts/pages/admin/groups/edit/index.js +++ b/app/assets/javascripts/pages/admin/groups/edit/index.js @@ -1,3 +1,3 @@ -import groupAvatar from '../../../../group_avatar'; +import groupAvatar from '~/group_avatar'; -export default () => groupAvatar(); +document.addEventListener('DOMContentLoaded', groupAvatar); diff --git a/app/assets/javascripts/pages/admin/groups/new/index.js b/app/assets/javascripts/pages/admin/groups/new/index.js index fb5c46e4729..21f1ce222ac 100644 --- a/app/assets/javascripts/pages/admin/groups/new/index.js +++ b/app/assets/javascripts/pages/admin/groups/new/index.js @@ -2,8 +2,8 @@ import BindInOut from '../../../../behaviors/bind_in_out'; import Group from '../../../../group'; import groupAvatar from '../../../../group_avatar'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { BindInOut.initAll(); new Group(); // eslint-disable-line no-new groupAvatar(); -}; +}); diff --git a/app/assets/javascripts/pages/groups/activity/index.js b/app/assets/javascripts/pages/groups/activity/index.js index 95faf1f1e98..1b887cad496 100644 --- a/app/assets/javascripts/pages/groups/activity/index.js +++ b/app/assets/javascripts/pages/groups/activity/index.js @@ -1,3 +1,3 @@ import Activities from '~/activities'; -export default () => new Activities(); +document.addEventListener('DOMContentLoaded', () => new Activities()); diff --git a/app/assets/javascripts/pages/groups/edit/index.js b/app/assets/javascripts/pages/groups/edit/index.js index 1aeec55a4be..d44874c8741 100644 --- a/app/assets/javascripts/pages/groups/edit/index.js +++ b/app/assets/javascripts/pages/groups/edit/index.js @@ -1,7 +1,7 @@ import groupAvatar from '~/group_avatar'; import TransferDropdown from '~/groups/transfer_dropdown'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { groupAvatar(); new TransferDropdown(); // eslint-disable-line no-new -}; +}); diff --git a/app/assets/javascripts/pages/groups/group_members/index/index.js b/app/assets/javascripts/pages/groups/group_members/index/index.js index 29319b97ae2..c22a164cd4e 100644 --- a/app/assets/javascripts/pages/groups/group_members/index/index.js +++ b/app/assets/javascripts/pages/groups/group_members/index/index.js @@ -4,8 +4,8 @@ import memberExpirationDate from '~/member_expiration_date'; import Members from '~/members'; import UsersSelect from '~/users_select'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { memberExpirationDate(); new Members(); new UsersSelect(); -}; +}); diff --git a/app/assets/javascripts/pages/groups/new/index.js b/app/assets/javascripts/pages/groups/new/index.js index 7850b90d3d2..b2f275dc5ea 100644 --- a/app/assets/javascripts/pages/groups/new/index.js +++ b/app/assets/javascripts/pages/groups/new/index.js @@ -2,8 +2,8 @@ import BindInOut from '~/behaviors/bind_in_out'; import Group from '~/group'; import groupAvatar from '~/group_avatar'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { BindInOut.initAll(); new Group(); // eslint-disable-line no-new groupAvatar(); -}; +}); diff --git a/app/assets/javascripts/pages/projects/blame/show/index.js b/app/assets/javascripts/pages/projects/blame/show/index.js index 480357a309c..80d0bff92fa 100644 --- a/app/assets/javascripts/pages/projects/blame/show/index.js +++ b/app/assets/javascripts/pages/projects/blame/show/index.js @@ -1,3 +1,3 @@ import initBlob from '~/pages/projects/init_blob'; -export default initBlob; +document.addEventListener('DOMContentLoaded', initBlob); diff --git a/app/assets/javascripts/pages/projects/blob/show/index.js b/app/assets/javascripts/pages/projects/blob/show/index.js index a3eeb1cefb6..26cbb279d4a 100644 --- a/app/assets/javascripts/pages/projects/blob/show/index.js +++ b/app/assets/javascripts/pages/projects/blob/show/index.js @@ -1,7 +1,7 @@ import BlobViewer from '~/blob/viewer/index'; import initBlob from '~/pages/projects/init_blob'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { new BlobViewer(); // eslint-disable-line no-new initBlob(); -}; +}); diff --git a/app/assets/javascripts/pages/projects/find_file/show/index.js b/app/assets/javascripts/pages/projects/find_file/show/index.js index 42bde0ff779..23d857d69ec 100644 --- a/app/assets/javascripts/pages/projects/find_file/show/index.js +++ b/app/assets/javascripts/pages/projects/find_file/show/index.js @@ -1,7 +1,7 @@ import ProjectFindFile from '~/project_find_file'; import ShortcutsFindFile from '~/shortcuts_find_file'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { const findElement = document.querySelector('.js-file-finder'); const projectFindFile = new ProjectFindFile($('.file-finder-holder'), { url: findElement.dataset.fileFindUrl, @@ -9,4 +9,4 @@ export default () => { blobUrlTemplate: findElement.dataset.blobUrlTemplate, }); new ShortcutsFindFile(projectFindFile); // eslint-disable-line no-new -}; +}); diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js index f4643e7dba0..adbe744290a 100644 --- a/app/assets/javascripts/pages/projects/project_members/index.js +++ b/app/assets/javascripts/pages/projects/project_members/index.js @@ -3,10 +3,10 @@ import UsersSelect from '../../../users_select'; import groupsSelect from '../../../groups_select'; import Members from '../../../members'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { memberExpirationDate('.js-access-expiration-date-groups'); groupsSelect(); memberExpirationDate(); new Members(); // eslint-disable-line no-new new UsersSelect(); // eslint-disable-line no-new -}; +}); diff --git a/app/assets/javascripts/pages/projects/tree/show/index.js b/app/assets/javascripts/pages/projects/tree/show/index.js index cba57058380..fb84959c477 100644 --- a/app/assets/javascripts/pages/projects/tree/show/index.js +++ b/app/assets/javascripts/pages/projects/tree/show/index.js @@ -6,7 +6,7 @@ import BlobViewer from '../../../../blob/viewer'; import NewCommitForm from '../../../../new_commit_form'; import { ajaxGet } from '../../../../lib/utils/common_utils'; -export default () => { +document.addEventListener('DOMContentLoaded', () => { new ShortcutsNavigation(); // eslint-disable-line no-new new TreeView(); // eslint-disable-line no-new new BlobViewer(); // eslint-disable-line no-new @@ -33,5 +33,4 @@ export default () => { }, }); } -}; - +}); From acc0e25de739aa515dbf8ef151921f366fe322b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Wed, 7 Feb 2018 18:26:35 -0300 Subject: [PATCH 29/81] Incorporate Gitaly's RepositoryService.IsSquashInProgress RPC --- GITALY_SERVER_VERSION | 2 +- lib/gitlab/git/repository.rb | 8 +++++- .../gitaly_client/repository_service.rb | 17 ++++++++++++ .../gitaly_client/repository_service_spec.rb | 26 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 9a55e28031d..92fc430ae8f 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -0.81.0 +0.82.0 diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 6761fb0937a..14e98e39394 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -1234,7 +1234,13 @@ module Gitlab end def squash_in_progress?(squash_id) - fresh_worktree?(worktree_path(SQUASH_WORKTREE_PREFIX, squash_id)) + gitaly_migrate(:squash_in_progress) do |is_enabled| + if is_enabled + gitaly_repository_client.squash_in_progress?(squash_id) + else + fresh_worktree?(worktree_path(SQUASH_WORKTREE_PREFIX, squash_id)) + end + end end def push_remote_branches(remote_name, branch_names, forced: true) diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index 60706b4f0d8..603457d0664 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -134,6 +134,23 @@ module Gitlab response.in_progress end + def squash_in_progress?(squash_id) + request = Gitaly::IsSquashInProgressRequest.new( + repository: @gitaly_repo, + squash_id: squash_id.to_s + ) + + response = GitalyClient.call( + @storage, + :repository_service, + :is_squash_in_progress, + request, + timeout: GitalyClient.default_timeout + ) + + response.in_progress + end + def fetch_source_branch(source_repository, source_branch, local_ref) request = Gitaly::FetchSourceBranchRequest.new( repository: @gitaly_repo, diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb index cbc7ce1c1b0..c50e73cecfc 100644 --- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb @@ -84,4 +84,30 @@ describe Gitlab::GitalyClient::RepositoryService do expect(client.has_local_branches?).to be(true) end end + + describe '#rebase_in_progress?' do + let(:rebase_id) { 1 } + + it 'sends a repository_rebase_in_progress message' do + expect_any_instance_of(Gitaly::RepositoryService::Stub) + .to receive(:is_rebase_in_progress) + .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash)) + .and_return(double(in_progress: true)) + + client.rebase_in_progress?(rebase_id) + end + end + + describe '#squash_in_progress?' do + let(:squash_id) { 1 } + + it 'sends a repository_squash_in_progress message' do + expect_any_instance_of(Gitaly::RepositoryService::Stub) + .to receive(:is_squash_in_progress) + .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash)) + .and_return(double(in_progress: true)) + + client.squash_in_progress?(squash_id) + end + end end From 4104ab0554db257ffe3b5edddfccd261b4f8050e Mon Sep 17 00:00:00 2001 From: James Ramsay Date: Wed, 21 Feb 2018 17:30:29 -0500 Subject: [PATCH 30/81] Add more detail to the proofreader process --- doc/development/i18n/proofreader.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md index 795e1e83105..afebb7fc089 100644 --- a/doc/development/i18n/proofreader.md +++ b/doc/development/i18n/proofreader.md @@ -37,9 +37,26 @@ are very appreciative of the work done by translators and proofreaders! > sure that you have a history of contributing translations to the GitLab > project. -1. Once your translations have been accepted, - [open a merge request](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/new) - to request Proofreader permissions and add yourself to the list above. +1. Contribute translations to GitLab. See instructions for + [translating GitLab](../translate.md). + + Translating GitLab is a community effort that requires team work and + attention to detail. Proofreaders play an important role helping new + contributors, and ensuring the consistency and quality of translations. + Your conduct and contributions as a translator should reflect this before + requesting to be a proofreader. + +1. Request proofreader permissions by opening a merge request to add yourself + to the list of proofreaders. + + At the bottom of this page click **Edit this page**. + + Add your language in alphabetical order, and add yourself to the list + including: + + - name + - link to your GitLab profile + - link to your CrowdIn profile In the merge request description, please include links to any projects you have previously translated. From f6a1c7ffda4ed1815a27ef832edc7e60ab5e6a7b Mon Sep 17 00:00:00 2001 From: James Ramsay Date: Wed, 21 Feb 2018 17:58:58 -0500 Subject: [PATCH 31/81] Link directly to proofreader.md --- doc/development/i18n/proofreader.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md index afebb7fc089..0b05ff40d26 100644 --- a/doc/development/i18n/proofreader.md +++ b/doc/development/i18n/proofreader.md @@ -38,7 +38,7 @@ are very appreciative of the work done by translators and proofreaders! > project. 1. Contribute translations to GitLab. See instructions for - [translating GitLab](../translate.md). + [translating GitLab](../translation.md). Translating GitLab is a community effort that requires team work and attention to detail. Proofreaders play an important role helping new @@ -49,7 +49,7 @@ are very appreciative of the work done by translators and proofreaders! 1. Request proofreader permissions by opening a merge request to add yourself to the list of proofreaders. - At the bottom of this page click **Edit this page**. + Open the [proofreader.md source file][proofreader-src] and click **Edit**. Add your language in alphabetical order, and add yourself to the list including: @@ -63,3 +63,5 @@ are very appreciative of the work done by translators and proofreaders! 1. Your request to become a proofreader will be considered on the merits of your previous translations. + +[proofreader-src]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/i18n/proofreader.md From 9f79e6efc217b3052a02d43455cf5a5362d31191 Mon Sep 17 00:00:00 2001 From: Connor Shea Date: Wed, 21 Feb 2018 23:32:17 +0000 Subject: [PATCH 32/81] No `../` is necessary for linking pages in the same directory. --- doc/development/i18n/proofreader.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md index 0b05ff40d26..ece9a9bc0fe 100644 --- a/doc/development/i18n/proofreader.md +++ b/doc/development/i18n/proofreader.md @@ -38,7 +38,7 @@ are very appreciative of the work done by translators and proofreaders! > project. 1. Contribute translations to GitLab. See instructions for - [translating GitLab](../translation.md). + [translating GitLab](translation.md). Translating GitLab is a community effort that requires team work and attention to detail. Proofreaders play an important role helping new From aa1b7f2dc4c8995e20deba0e0e9ed60cf04fb1f7 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Wed, 21 Feb 2018 15:34:38 +1100 Subject: [PATCH 33/81] Add inverse_of pipeline -> statuses -> pipeline (#43134) --- app/models/ci/pipeline.rb | 2 +- .../43134-reduce-queries-pipelines-controller-show.yml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 2abe90dd181..a72a815bfe8 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -13,7 +13,7 @@ module Ci belongs_to :pipeline_schedule, class_name: 'Ci::PipelineSchedule' has_many :stages - has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id + has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline has_many :builds, foreign_key: :commit_id has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id # rubocop:disable Cop/ActiveRecordDependent has_many :variables, class_name: 'Ci::PipelineVariable' diff --git a/changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml b/changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml new file mode 100644 index 00000000000..c1e9614b676 --- /dev/null +++ b/changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml @@ -0,0 +1,5 @@ +--- +title: Improve performance of pipeline page by reducing DB queries +merge_request: 17168 +author: +type: performance From ea18e1bf287800825f12e87cf3160e90cc2046d9 Mon Sep 17 00:00:00 2001 From: "Jacob Vosmaer (GitLab)" Date: Thu, 22 Feb 2018 00:20:30 +0000 Subject: [PATCH 34/81] Fix repo existence check in GitAccessWiki --- lib/gitlab/git_access.rb | 6 +++++- lib/gitlab/git_access_wiki.rb | 6 ++++++ spec/lib/gitlab/git_access_wiki_spec.rb | 14 +++++++++++++- spec/requests/api/internal_spec.rb | 2 +- spec/requests/git_http_spec.rb | 8 ++++---- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index 9ec3858b493..bbdb593d4e2 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -198,7 +198,7 @@ module Gitlab end def check_repository_existence! - unless project.repository.exists? + unless repository.exists? raise UnauthorizedError, ERROR_MESSAGES[:no_repo] end end @@ -327,5 +327,9 @@ module Gitlab def push_to_read_only_message ERROR_MESSAGES[:cannot_push_to_read_only] end + + def repository + project.repository + end end end diff --git a/lib/gitlab/git_access_wiki.rb b/lib/gitlab/git_access_wiki.rb index 84d6e1490c3..a5b3902ebf4 100644 --- a/lib/gitlab/git_access_wiki.rb +++ b/lib/gitlab/git_access_wiki.rb @@ -28,5 +28,11 @@ module Gitlab def push_to_read_only_message ERROR_MESSAGES[:read_only] end + + private + + def repository + project.wiki.repository + end end end diff --git a/spec/lib/gitlab/git_access_wiki_spec.rb b/spec/lib/gitlab/git_access_wiki_spec.rb index 186b2d9279d..215f1ecc9c5 100644 --- a/spec/lib/gitlab/git_access_wiki_spec.rb +++ b/spec/lib/gitlab/git_access_wiki_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' describe Gitlab::GitAccessWiki do let(:access) { described_class.new(user, project, 'web', authentication_abilities: authentication_abilities, redirected_path: redirected_path) } - let(:project) { create(:project, :repository) } + let(:project) { create(:project, :wiki_repo) } let(:user) { create(:user) } let(:changes) { ['6f6d7e7ed 570e7b2ab refs/heads/master'] } let(:redirected_path) { nil } @@ -48,6 +48,18 @@ describe Gitlab::GitAccessWiki do it 'give access to download wiki code' do expect { subject }.not_to raise_error end + + context 'when the wiki repository does not exist' do + it 'returns not found' do + wiki_repo = project.wiki.repository + FileUtils.rm_rf(wiki_repo.path) + + # Sanity check for rm_rf + expect(wiki_repo.exists?).to eq(false) + + expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'A repository for this project does not exist yet.') + end + end end context 'when wiki feature is disabled' do diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb index c7df6251d74..827f4c04324 100644 --- a/spec/requests/api/internal_spec.rb +++ b/spec/requests/api/internal_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe API::Internal do let(:user) { create(:user) } let(:key) { create(:key, user: user) } - let(:project) { create(:project, :repository) } + let(:project) { create(:project, :repository, :wiki_repo) } let(:secret_token) { Gitlab::Shell.secret_token } let(:gl_repository) { "project-#{project.id}" } let(:reference_counter) { double('ReferenceCounter') } diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb index 942e5b2bb1b..c6fdda203ad 100644 --- a/spec/requests/git_http_spec.rb +++ b/spec/requests/git_http_spec.rb @@ -150,7 +150,7 @@ describe 'Git HTTP requests' do let(:path) { "/#{wiki.repository.full_path}.git" } context "when the project is public" do - let(:project) { create(:project, :repository, :public, :wiki_enabled) } + let(:project) { create(:project, :wiki_repo, :public, :wiki_enabled) } it_behaves_like 'pushes require Basic HTTP Authentication' @@ -177,7 +177,7 @@ describe 'Git HTTP requests' do end context 'but the repo is disabled' do - let(:project) { create(:project, :repository, :public, :repository_disabled, :wiki_enabled) } + let(:project) { create(:project, :wiki_repo, :public, :repository_disabled, :wiki_enabled) } it_behaves_like 'pulls are allowed' it_behaves_like 'pushes are allowed' @@ -198,7 +198,7 @@ describe 'Git HTTP requests' do end context "when the project is private" do - let(:project) { create(:project, :repository, :private, :wiki_enabled) } + let(:project) { create(:project, :wiki_repo, :private, :wiki_enabled) } it_behaves_like 'pulls require Basic HTTP Authentication' it_behaves_like 'pushes require Basic HTTP Authentication' @@ -210,7 +210,7 @@ describe 'Git HTTP requests' do end context 'but the repo is disabled' do - let(:project) { create(:project, :repository, :private, :repository_disabled, :wiki_enabled) } + let(:project) { create(:project, :wiki_repo, :private, :repository_disabled, :wiki_enabled) } it 'allows clones' do download(path, user: user.username, password: user.password) do |response| From 5c2102d0f6cc40550d52dea415ae5fcf36c8cf38 Mon Sep 17 00:00:00 2001 From: Victor Wu Date: Tue, 20 Feb 2018 20:15:43 +0000 Subject: [PATCH 35/81] Update docs milestones --- .../milestones/img/milestone_create.png | Bin 40591 -> 0 bytes .../milestones/img/milestone_group_create.png | Bin 35526 -> 0 bytes .../img/milestones_new_group_milestone.png | Bin 0 -> 156704 bytes .../img/milestones_new_project_milestone.png | Bin 0 -> 173762 bytes .../img/milestones_project_milestone_page.png | Bin 0 -> 489382 bytes .../img/milestones_promote_milestone.png | Bin 0 -> 350399 bytes doc/user/project/milestones/img/sidebar.png | Bin 89947 -> 0 bytes doc/user/project/milestones/index.md | 128 ++++++++++++------ 8 files changed, 88 insertions(+), 40 deletions(-) delete mode 100644 doc/user/project/milestones/img/milestone_create.png delete mode 100644 doc/user/project/milestones/img/milestone_group_create.png create mode 100644 doc/user/project/milestones/img/milestones_new_group_milestone.png create mode 100644 doc/user/project/milestones/img/milestones_new_project_milestone.png create mode 100644 doc/user/project/milestones/img/milestones_project_milestone_page.png create mode 100644 doc/user/project/milestones/img/milestones_promote_milestone.png delete mode 100644 doc/user/project/milestones/img/sidebar.png diff --git a/doc/user/project/milestones/img/milestone_create.png b/doc/user/project/milestones/img/milestone_create.png deleted file mode 100644 index beb2caa897f45129a3494cfd562efa9975e53b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40591 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 sj|+ZPTlgJ9I3s1n0=y# zT?DsWzWKeEX5pnUp-!%~fvn-`M$H&s>ag*vZsk&Xk`344Htv|!M6Rr}ZL~^k$diA} z=c*fyZ6$r@D`RNUj{6s| z%+hTrMv6m9k1mpUz88+vQlTYdsR=QuJhZ1CnfSakQwRvyf!|y&U4S} zz}oopPR==HOX4Fb&m9Bhp6R#7%Z_U5SXsU}RvgQ=d=}x>UI3K%rzFnWFqdvW(^>;z z^^Yvp2kBMs(He)2Cra_-COIZnb=WQLm&sJFX6gj#(V_+J75PD%h3&d+#YNUzpYt-* z4fK{OyKGI%gVSE$iP7+>elw_3P_;V=&))bxy7pf->e$W{AWuMZQRX67f2S}-Kp<>U zGLQpuS3;5kU_unvwkifN*Gw=xY!2FI(1#nRbKyiKT0v~9iD5GeKQfDjFq8lnZoLQ! z-wkwcF+X}2A!44KYqVLZ;sKUldl;3Me-B}ZqZciKB`D8(g zPIXUC(vr;L>x;{x<-QVOT;kAi+YJGEU64nUevZt1uUld;0J(iQKCR2k|65e&7Pgf zB%n9pFWRaoz^ZX#>!CkO=qI;~nJdtSB>V>+ke77Apo7F41hy)4j5B!{yF?}-S{+%h zqUh0M%6qb>xT?fnVmI_R+_{-RHu-nfQ8R4MrnNtDBKN}Vp4pC`+UkNj|BYA`|J1Ov z&};42X*prydfmP6eQ+FhRc}*;AicS0ShJ&V(ykw$R##=%Ic}9bYa4Bv9azX{;9d$& z+FV`jTd05ksO*8Qv60LB1Yu;GaQ5W{C;DGv$kFPns*+DYKdyfK(Gp_z1ABBb6B_Yp z5$YPyOSbmk4=;cA>^DgXfM%1S-nR}7YYx7;K1oXf184BHNXssh6f?-fFV5LsYHd5b zUMEw>srG?KsdycIo8_^1rN$wI3%{H-y+8J(ePeAECg^WsJFYU_g?*Gzuya~2sCq|V zFTrONT+5i)=+IOAviWvRfNjE1XE~LwH}L#s0s;n)YKE}nFhe{cEnMCGU&6y@Bn1`3 z_ClURrc*LtmSgMYiu?q~)#qE{vrWzqH%5JdUiI-w%wb%;J)n8?A%xLb_*?OOVz02a zJ=Paqwhw6(diaGNb51S+VMQlR`aaZG>GQnvNAlUEgIz2KT3^hSKw-QCPvellv9*_T zepTt)h@^0JSuo8bEW>1GRmj}zn?q*;6OHR$=P=l{yap|2Glqep+n6Rcxo>(Z z5mzq0yPzsTDDd)KabIX&@ZLS_&bx2+d zl$h_381s|ZG|c6mZL)U$M=KKGy33^jxgDulmp*iy-%5UxqH9fCaDsC~$)&glHlY|Wpke+ZG302isz{!No5$T2_#)GQP!D|3XCZp95v8&V) z-JWO}e8TPkjl!u%NX?+H%(IMxztLP!mH^AQ1N@6yao}e{(YvOqyMlU^#KVT!m+L&D zG}Hc>@^ku!J(JToY0I!ZBku{oKdTXXzO zbRGM|!W4dAPp#ENM|;{Dr;_O(Iv?&JLFe5=v5_O)5=+~0wzpiammS*8?#TWr_;zl2 zgxB);UEHSYTDq-H*?ZNK|8>Et8(Q`c^YRaTqyKPuzQ>NC^($28yEhsHoejBt3A6T}ibRH4(k7^iq$a7%ap|Pa!SieX`mujXm zNrm)nKg=&p7JqqF!dH2@%C8K+A|>$k=uxpO=BU#!rh|NAT1!>W^p+_t`2TPlRhPz4 z)j6s}oASys+=?e1qayMCXK0aZZbV+RRBr_@lM&X7Zr*`(&VW{0rv!t{`}!`{9t z^qGpJPpO|mv(?&{A~oF9)4L{waYm@%Hfx#U9f!=Ut2a@&l`N{jy2F>tqSgdxT364P z#?EQcjg1;>z{@<)FIH#P`>-_xczMePee3D=_K!P{29LG3=g;R*bPdLj)K;a;aU*|T l_;uv^N6q@Te_3gpyW!jzi|BXJxUf-{KiF)_GT(dRe*)fqSkC|e diff --git a/doc/user/project/milestones/img/milestones_new_group_milestone.png b/doc/user/project/milestones/img/milestones_new_group_milestone.png new file mode 100644 index 0000000000000000000000000000000000000000..8780394d72e6baa6d0d6b4f770e9e667d9305e6b GIT binary patch literal 156704 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%0Arwa$s|PFHG{+~N^H~af(u`x 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 xNNiW9JaX~`uWWn8xR{)52O8UmorofFSI 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%0Dja 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 #>~DPTq)nd^{@3;h0Bcy*^}RmE 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