2018-02-20 09:56:36 -05:00
|
|
|
class ProjectPresenter < Gitlab::View::Presenter::Delegated
|
|
|
|
include ActionView::Helpers::NumberHelper
|
|
|
|
include ActionView::Helpers::UrlHelper
|
|
|
|
include GitlabRoutingHelper
|
|
|
|
include StorageHelper
|
|
|
|
include TreeHelper
|
2018-02-20 17:04:10 -05:00
|
|
|
include Gitlab::Utils::StrongMemoize
|
2018-02-20 09:56:36 -05:00
|
|
|
|
|
|
|
presents :project
|
|
|
|
|
2018-02-20 13:51:52 -05:00
|
|
|
def statistics_anchors(show_auto_devops_callout:)
|
2018-02-20 09:56:36 -05:00
|
|
|
[
|
|
|
|
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
|
2018-02-22 11:57:11 -05:00
|
|
|
].compact.select { |item| item.enabled }
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
2018-02-20 13:51:52 -05:00
|
|
|
def statistics_buttons(show_auto_devops_callout:)
|
2018-02-20 09:56:36 -05:00
|
|
|
[
|
|
|
|
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
|
2018-02-21 11:57:41 -05:00
|
|
|
].compact.reject { |item| item.enabled }
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
2018-02-20 13:51:52 -05:00
|
|
|
def empty_repo_statistics_anchors
|
2018-02-20 09:56:36 -05:00
|
|
|
[
|
|
|
|
autodevops_anchor_data,
|
|
|
|
kubernetes_cluster_anchor_data
|
2018-02-22 11:57:11 -05:00
|
|
|
].compact.select { |item| item.enabled }
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
2018-02-20 13:51:52 -05:00
|
|
|
def empty_repo_statistics_buttons
|
2018-02-20 09:56:36 -05:00
|
|
|
[
|
|
|
|
new_file_anchor_data,
|
|
|
|
readme_anchor_data,
|
|
|
|
license_anchor_data,
|
|
|
|
autodevops_anchor_data,
|
|
|
|
kubernetes_cluster_anchor_data
|
2018-02-21 11:57:41 -05:00
|
|
|
].compact.reject { |item| item.enabled }
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
2018-02-20 11:30:49 -05:00
|
|
|
def default_view
|
2018-02-20 09:56:36 -05:00
|
|
|
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
|
|
|
|
|
2018-02-20 16:59:19 -05:00
|
|
|
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
|
|
|
|
|
2018-02-20 09:56:36 -05:00
|
|
|
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
|
|
|
|
|
|
|
|
def can_current_user_push_code?
|
2018-02-20 17:04:10 -05:00
|
|
|
strong_memoize(:can_current_user_push_code) do
|
|
|
|
if empty_repo?
|
|
|
|
can?(current_user, :push_code, project)
|
|
|
|
else
|
2018-02-22 11:56:38 -05:00
|
|
|
can_current_user_push_to_branch?(default_branch)
|
2018-02-20 17:04:10 -05:00
|
|
|
end
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-22 11:56:38 -05:00
|
|
|
def can_current_user_push_to_branch?(branch)
|
|
|
|
return false unless repository.branch_exists?(branch)
|
|
|
|
|
|
|
|
::Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(branch)
|
|
|
|
end
|
|
|
|
|
2018-02-20 09:56:36 -05:00
|
|
|
def files_anchor_data
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: _('Files (%{human_size})') % { human_size: storage_counter(statistics.total_repository_size) },
|
|
|
|
link: project_tree_path(project))
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def commits_anchor_data
|
2018-02-20 14:15:01 -05:00
|
|
|
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))
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def branches_anchor_data
|
2018-02-20 14:15:01 -05:00
|
|
|
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))
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def tags_anchor_data
|
2018-02-20 14:15:01 -05:00
|
|
|
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))
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def new_file_anchor_data
|
|
|
|
if current_user && can_current_user_push_code?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('New file'),
|
|
|
|
link: project_new_blob_path(project, default_branch || 'master'),
|
|
|
|
class_modifier: 'new')
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def readme_anchor_data
|
|
|
|
if current_user && can_current_user_push_code? && repository.readme.blank?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('Add Readme'),
|
|
|
|
link: add_readme_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
elsif repository.readme.present?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: _('Readme'),
|
|
|
|
link: default_view != 'readme' ? readme_path : '#readme')
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def changelog_anchor_data
|
|
|
|
if current_user && can_current_user_push_code? && repository.changelog.blank?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('Add Changelog'),
|
2018-02-20 16:59:19 -05:00
|
|
|
link: add_changelog_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
elsif repository.changelog.present?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: _('Changelog'),
|
|
|
|
link: changelog_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def license_anchor_data
|
|
|
|
if current_user && can_current_user_push_code? && repository.license_blob.blank?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('Add License'),
|
|
|
|
link: add_license_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
elsif repository.license_blob.present?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: license_short_name,
|
|
|
|
link: license_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def contribution_guide_anchor_data
|
|
|
|
if current_user && can_current_user_push_code? && repository.contribution_guide.blank?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('Add Contribution guide'),
|
2018-02-20 16:59:19 -05:00
|
|
|
link: add_contribution_guide_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
elsif repository.contribution_guide.present?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: _('Contribution guide'),
|
|
|
|
link: contribution_guide_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
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
|
2018-02-20 14:15:01 -05:00
|
|
|
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'))
|
2018-02-20 09:56:36 -05:00
|
|
|
elsif auto_devops_enabled?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: _('Auto DevOps enabled'),
|
|
|
|
link: nil)
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def kubernetes_cluster_anchor_data
|
|
|
|
if current_user && can?(current_user, :create_cluster, project)
|
2018-02-20 16:59:19 -05:00
|
|
|
cluster_link = clusters.count == 1 ? project_cluster_path(project, clusters.first) : project_clusters_path(project)
|
2018-02-20 09:56:36 -05:00
|
|
|
|
|
|
|
if clusters.empty?
|
|
|
|
cluster_link = new_project_cluster_path(project)
|
|
|
|
end
|
|
|
|
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: !clusters.empty?,
|
2018-02-22 11:01:08 -05:00
|
|
|
label: clusters.empty? ? _('Add Kubernetes cluster') : _('Kubernetes configured'),
|
2018-02-20 14:15:01 -05:00
|
|
|
link: cluster_link)
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def gitlab_ci_anchor_data
|
|
|
|
if current_user && can_current_user_push_code? && repository.gitlab_ci_yml.blank? && !auto_devops_enabled?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('Set up CI/CD'),
|
|
|
|
link: add_ci_yml_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
elsif repository.gitlab_ci_yml.present?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: true,
|
|
|
|
label: _('CI/CD configuration'),
|
|
|
|
link: ci_configuration_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def koding_anchor_data
|
|
|
|
if current_user && can_current_user_push_code? && koding_enabled? && repository.koding_yml.blank?
|
2018-02-20 14:15:01 -05:00
|
|
|
OpenStruct.new(enabled: false,
|
|
|
|
label: _('Set up Koding'),
|
|
|
|
link: add_koding_stack_path)
|
2018-02-20 09:56:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-20 16:59:19 -05:00
|
|
|
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
|
|
|
|
|
2018-02-20 09:56:36 -05:00
|
|
|
def koding_enabled?
|
|
|
|
Gitlab::CurrentSettings.koding_enabled?
|
|
|
|
end
|
|
|
|
end
|