Commit 2497cd1e authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch 'ce-to-ee-2018-07-16' into 'master'

CE upstream - 2018-07-16 15:23 UTC

See merge request gitlab-org/gitlab-ee!6524
parents 654509d7 6ca4ecec
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.4-golang-1.9-git-2.17-chrome-67.0-node-8.x-yarn-1.2-postgresql-9.6-graphicsmagick-1.3.29" image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.4-golang-1.9-git-2.18-chrome-67.0-node-8.x-yarn-1.2-postgresql-9.6-graphicsmagick-1.3.29"
.dedicated-runner: &dedicated-runner .dedicated-runner: &dedicated-runner
retry: 1 retry: 1
......
# frozen_string_literal: true
class AccessTokenValidationService class AccessTokenValidationService
# Results: # Results:
VALID = :valid VALID = :valid
......
# frozen_string_literal: true
## ##
# Branch can be deleted either by DeleteBranchService # Branch can be deleted either by DeleteBranchService
# or by GitPushService. # or by GitPushService.
......
# frozen_string_literal: true
class AkismetService class AkismetService
attr_accessor :owner, :text, :options attr_accessor :owner, :text, :options
......
# frozen_string_literal: true
class AuditEventService class AuditEventService
prepend EE::AuditEventService prepend EE::AuditEventService
......
# frozen_string_literal: true
# Base class for services that count a single resource such as the number of # Base class for services that count a single resource such as the number of
# issues for a project. # issues for a project.
class BaseCountService class BaseCountService
......
# frozen_string_literal: true
class BaseRenderer class BaseRenderer
attr_reader :current_user attr_reader :current_user
......
# frozen_string_literal: true
class BaseService class BaseService
include Gitlab::Allowable include Gitlab::Allowable
......
# frozen_string_literal: true
class CohortsService class CohortsService
MONTHS_INCLUDED = 12 MONTHS_INCLUDED = 12
......
# frozen_string_literal: true
require 'securerandom' require 'securerandom'
# Compare 2 refs for one repo or between repositories # Compare 2 refs for one repo or between repositories
......
# frozen_string_literal: true
class CreateBranchService < BaseService class CreateBranchService < BaseService
def execute(branch_name, ref, create_master_if_empty: true) def execute(branch_name, ref, create_master_if_empty: true)
create_master_branch if create_master_if_empty && project.empty_repo? create_master_branch if create_master_if_empty && project.empty_repo?
......
# frozen_string_literal: true
class CreateDeploymentService class CreateDeploymentService
attr_reader :job attr_reader :job
......
# frozen_string_literal: true
class CreateReleaseService < BaseService class CreateReleaseService < BaseService
def execute(tag_name, release_description) def execute(tag_name, release_description)
repository = project.repository repository = project.repository
......
# frozen_string_literal: true
class CreateSnippetService < BaseService class CreateSnippetService < BaseService
include SpamCheckService include SpamCheckService
......
# frozen_string_literal: true
class DeleteBranchService < BaseService class DeleteBranchService < BaseService
def execute(branch_name) def execute(branch_name)
repository = project.repository repository = project.repository
......
# frozen_string_literal: true
class DeleteMergedBranchesService < BaseService class DeleteMergedBranchesService < BaseService
def async_execute def async_execute
DeleteMergedBranchesWorker.perform_async(project.id, current_user.id) DeleteMergedBranchesWorker.perform_async(project.id, current_user.id)
......
# frozen_string_literal: true
# EventCreateService class # EventCreateService class
# #
# Used for creating events feed on dashboard after certain user action # Used for creating events feed on dashboard after certain user action
......
# frozen_string_literal: true
class GitPushService < BaseService class GitPushService < BaseService
attr_accessor :push_data, :push_commits attr_accessor :push_data, :push_commits
include Gitlab::Access include Gitlab::Access
......
# frozen_string_literal: true
class GitTagPushService < BaseService class GitTagPushService < BaseService
attr_accessor :push_data attr_accessor :push_data
......
# frozen_string_literal: true
class GravatarService class GravatarService
def execute(email, size = nil, scale = 2, username: nil) def execute(email, size = nil, scale = 2, username: nil)
return unless Gitlab::CurrentSettings.gravatar_enabled? return unless Gitlab::CurrentSettings.gravatar_enabled?
......
# frozen_string_literal: true
class HamService class HamService
attr_accessor :spam_log attr_accessor :spam_log
......
# frozen_string_literal: true
class ImportExportCleanUpService class ImportExportCleanUpService
LAST_MODIFIED_TIME_IN_MINUTES = 1440 LAST_MODIFIED_TIME_IN_MINUTES = 1440
......
# frozen_string_literal: true
class IssuableBaseService < BaseService class IssuableBaseService < BaseService
prepend ::EE::IssuableBaseService prepend ::EE::IssuableBaseService
......
# frozen_string_literal: true
class MergeRequestMetricsService class MergeRequestMetricsService
delegate :update!, to: :@merge_request_metrics delegate :update!, to: :@merge_request_metrics
......
# frozen_string_literal: true
require 'prometheus/client/formats/text' require 'prometheus/client/formats/text'
class MetricsService class MetricsService
......
# frozen_string_literal: true
class NoteSummary class NoteSummary
attr_reader :note attr_reader :note
attr_reader :metadata attr_reader :metadata
......
# frozen_string_literal: true
# #
# Used by NotificationService to determine who should receive notification # Used by NotificationService to determine who should receive notification
# #
......
# frozen_string_literal: true
# rubocop:disable GitlabSecurity/PublicSend # rubocop:disable GitlabSecurity/PublicSend
# NotificationService class # NotificationService class
......
# frozen_string_literal: true
class PreviewMarkdownService < BaseService class PreviewMarkdownService < BaseService
def execute def execute
text, commands = explain_quick_actions(params[:text]) text, commands = explain_quick_actions(params[:text])
......
# frozen_string_literal: true
# Service class for creating push event payloads as stored in the # Service class for creating push event payloads as stored in the
# "push_event_payloads" table. # "push_event_payloads" table.
# #
......
# frozen_string_literal: true
class RepairLdapBlockedUserService class RepairLdapBlockedUserService
attr_accessor :user attr_accessor :user
......
# frozen_string_literal: true
class RepositoryArchiveCleanUpService class RepositoryArchiveCleanUpService
LAST_MODIFIED_TIME_IN_MINUTES = 120 LAST_MODIFIED_TIME_IN_MINUTES = 120
......
# frozen_string_literal: true
class ResetProjectCacheService < BaseService class ResetProjectCacheService < BaseService
def execute def execute
@project.increment!(:jobs_cache_index) @project.increment!(:jobs_cache_index)
......
# frozen_string_literal: true
class SearchService class SearchService
include Gitlab::Allowable include Gitlab::Allowable
......
# frozen_string_literal: true
# SpamCheckService # SpamCheckService
# #
# Provide helper methods for checking if a given spammable object has # Provide helper methods for checking if a given spammable object has
......
# frozen_string_literal: true
class SpamService class SpamService
attr_accessor :spammable, :request, :options attr_accessor :spammable, :request, :options
attr_reader :spam_log attr_reader :spam_log
......
# frozen_string_literal: true
class SubmitUsagePingService class SubmitUsagePingService
URL = 'https://version.gitlab.com/usage_data'.freeze URL = 'https://version.gitlab.com/usage_data'.freeze
......
# frozen_string_literal: true
class SystemHooksService class SystemHooksService
prepend EE::SystemHooksService prepend EE::SystemHooksService
......
# frozen_string_literal: true
# SystemNoteService # SystemNoteService
# #
# Used for creating system notes (e.g., when a user references a merge request # Used for creating system notes (e.g., when a user references a merge request
...@@ -22,9 +24,11 @@ module SystemNoteService ...@@ -22,9 +24,11 @@ module SystemNoteService
total_count = new_commits.length + existing_commits.length total_count = new_commits.length + existing_commits.length
commits_text = "#{total_count} commit".pluralize(total_count) commits_text = "#{total_count} commit".pluralize(total_count)
body = "added #{commits_text}\n\n" text_parts = ["added #{commits_text}"]
body << commits_list(noteable, new_commits, existing_commits, oldrev) text_parts << commits_list(noteable, new_commits, existing_commits, oldrev)
body << "\n\n[Compare with previous version](#{diff_comparison_url(noteable, project, oldrev)})" text_parts << "[Compare with previous version](#{diff_comparison_url(noteable, project, oldrev)})"
body = text_parts.join("\n\n")
create_note(NoteSummary.new(noteable, project, author, body, action: 'commit', commit_count: total_count)) create_note(NoteSummary.new(noteable, project, author, body, action: 'commit', commit_count: total_count))
end end
...@@ -104,18 +108,19 @@ module SystemNoteService ...@@ -104,18 +108,19 @@ module SystemNoteService
added_labels = added_labels.map(&references).join(' ') added_labels = added_labels.map(&references).join(' ')
removed_labels = removed_labels.map(&references).join(' ') removed_labels = removed_labels.map(&references).join(' ')
body = '' text_parts = []
if added_labels.present? if added_labels.present?
body << "added #{added_labels}" text_parts << "added #{added_labels}"
body << ' and ' if removed_labels.present? text_parts << 'and' if removed_labels.present?
end end
if removed_labels.present? if removed_labels.present?
body << "removed #{removed_labels}" text_parts << "removed #{removed_labels}"
end end
body << ' ' << 'label'.pluralize(labels_count) text_parts << 'label'.pluralize(labels_count)
body = text_parts.join(' ')
create_note(NoteSummary.new(noteable, project, author, body, action: 'label')) create_note(NoteSummary.new(noteable, project, author, body, action: 'label'))
end end
...@@ -189,8 +194,10 @@ module SystemNoteService ...@@ -189,8 +194,10 @@ module SystemNoteService
spent_at = noteable.spent_at spent_at = noteable.spent_at
parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent.abs) parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent.abs)
action = time_spent > 0 ? 'added' : 'subtracted' action = time_spent > 0 ? 'added' : 'subtracted'
body = "#{action} #{parsed_time} of time spent"
body << " at #{spent_at}" if spent_at text_parts = ["#{action} #{parsed_time} of time spent"]
text_parts << "at #{spent_at}" if spent_at
body = text_parts.join(' ')
end end
create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking')) create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
...@@ -269,17 +276,19 @@ module SystemNoteService ...@@ -269,17 +276,19 @@ module SystemNoteService
diff_refs = change_position.diff_refs diff_refs = change_position.diff_refs
version_index = merge_request.merge_request_diffs.viewable.count version_index = merge_request.merge_request_diffs.viewable.count
body = "changed this line in" text_parts = ["changed this line in"]
if version_params = merge_request.version_params_for(diff_refs) if version_params = merge_request.version_params_for(diff_refs)
line_code = change_position.line_code(project.repository) line_code = change_position.line_code(project.repository)
url = url_helpers.diffs_project_merge_request_url(project, merge_request, version_params.merge(anchor: line_code)) url = url_helpers.diffs_project_merge_request_url(project, merge_request, version_params.merge(anchor: line_code))
body << " [version #{version_index} of the diff](#{url})" text_parts << "[version #{version_index} of the diff](#{url})"
else else
body << " version #{version_index} of the diff" text_parts << "version #{version_index} of the diff"
end end
body = text_parts.join(' ')
note_attributes = discussion.reply_attributes.merge(project: project, author: author, note: body) note_attributes = discussion.reply_attributes.merge(project: project, author: author, note: body)
note = Note.create(note_attributes.merge(system: true)) note = Note.create(note_attributes.merge(system: true))
note.system_note_metadata = SystemNoteMetadata.new(action: 'outdated') note.system_note_metadata = SystemNoteMetadata.new(action: 'outdated')
......
# frozen_string_literal: true
# TodoService class # TodoService class
# #
# Used for creating/updating todos after certain user actions # Used for creating/updating todos after certain user actions
......
# frozen_string_literal: true
class UpdateReleaseService < BaseService class UpdateReleaseService < BaseService
def execute(tag_name, release_description) def execute(tag_name, release_description)
repository = project.repository repository = project.repository
......
# frozen_string_literal: true
class UpdateSnippetService < BaseService class UpdateSnippetService < BaseService
include SpamCheckService include SpamCheckService
......
# frozen_string_literal: true
class UploadService class UploadService
def initialize(model, file, uploader_class = FileUploader, **uploader_context) def initialize(model, file, uploader_class = FileUploader, **uploader_context)
@model, @file, @uploader_class, @uploader_context = model, file, uploader_class, uploader_context @model, @file, @uploader_class, @uploader_context = model, file, uploader_class, uploader_context
......
# frozen_string_literal: true
class UserAgentDetailService class UserAgentDetailService
attr_accessor :spammable, :request attr_accessor :spammable, :request
......
# frozen_string_literal: true
class UserProjectAccessChangedService class UserProjectAccessChangedService
prepend EE::UserProjectAccessChangedService prepend EE::UserProjectAccessChangedService
......
# frozen_string_literal: true
require_relative 'base_service' require_relative 'base_service'
class ValidateNewBranchService < BaseService class ValidateNewBranchService < BaseService
......
# frozen_string_literal: true
require 'resolv' require 'resolv'
class VerifyPagesDomainService < BaseService class VerifyPagesDomainService < BaseService
......
# frozen_string_literal: true
class WebHookService class WebHookService
class InternalErrorResponse class InternalErrorResponse
attr_reader :body, :headers, :code attr_reader :body, :headers, :code
......
:plain :plain
job = $("tr#repo_#{@repo_id}") job = $("tr#repo_#{@repo_id}")
job.find(".import-actions").html("<p class='alert alert-danger'>Access denied! Please verify you can add deploy keys to this repository.</p>") job.find(".import-actions").html("<p class='alert alert-danger'>#{_('Access denied! Please verify you can add deploy keys to this repository.')}</p>")
- page_title 'Bitbucket import' - page_title _('Bitbucket import')
- header_title 'Projects', root_path - header_title _('Projects'), root_path
%h3.page-title %h3.page-title
%i.fa.fa-bitbucket %i.fa.fa-bitbucket
Import projects from Bitbucket = _('Import projects from Bitbucket')
- if @repos.any? - if @repos.any?
%p.light %p.light
Select projects you want to import. = _('Select projects you want to import.')
%hr %hr
%p %p
- if @incompatible_repos.any? - if @incompatible_repos.any?
= button_tag class: 'btn btn-import btn-success js-import-all' do = button_tag class: 'btn btn-import btn-success js-import-all' do
Import all compatible projects = _('Import all compatible projects')
= icon('spinner spin', class: 'loading-icon') = icon('spinner spin', class: 'loading-icon')
- else - else
= button_tag class: 'btn btn-import btn-success js-import-all' do = button_tag class: 'btn btn-import btn-success js-import-all' do
Import all projects = _('Import all projects')
= icon('spinner spin', class: 'loading-icon') = icon('spinner spin', class: 'loading-icon')
.table-responsive .table-responsive
...@@ -26,9 +26,9 @@ ...@@ -26,9 +26,9 @@
%colgroup.import-jobs-status-col %colgroup.import-jobs-status-col
%thead %thead
%tr %tr
%th From Bitbucket %th= _('From Bitbucket')
%th To GitLab %th= _('To GitLab')
%th Status %th= _('Status')
%tbody %tbody
- @already_added_projects.each do |project| - @already_added_projects.each do |project|
%tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" }
...@@ -40,10 +40,10 @@ ...@@ -40,10 +40,10 @@
- if project.import_status == 'finished' - if project.import_status == 'finished'
%span %span
%i.fa.fa-check %i.fa.fa-check
done = _('done')
- elsif project.import_status == 'started' - elsif project.import_status == 'started'
%i.fa.fa-spinner.fa-spin %i.fa.fa-spinner.fa-spin
started = _('started')
- else - else
= project.human_import_status_name = project.human_import_status_name
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
= text_field_tag :path, repo.name, class: "input-mini form-control", tabindex: 2, autofocus: true, required: true = text_field_tag :path, repo.name, class: "input-mini form-control", tabindex: 2, autofocus: true, required: true
%td.import-actions.job-status %td.import-actions.job-status
= button_tag class: 'btn btn-import js-add-to-import' do = button_tag class: 'btn btn-import js-add-to-import' do
Import = _('Import')
= icon('spinner spin', class: 'loading-icon') = icon('spinner spin', class: 'loading-icon')
- @incompatible_repos.each do |repo| - @incompatible_repos.each do |repo|
%tr{ id: "repo_#{repo.owner}___#{repo.slug}" } %tr{ id: "repo_#{repo.owner}___#{repo.slug}" }
...@@ -74,16 +74,13 @@ ...@@ -74,16 +74,13 @@
= link_to repo.full_name, "https://bitbucket.org/#{repo.full_name}", target: '_blank', rel: 'noopener noreferrer' = link_to repo.full_name, "https://bitbucket.org/#{repo.full_name}", target: '_blank', rel: 'noopener noreferrer'
%td.import-target %td.import-target
%td.import-actions-job-status %td.import-actions-job-status
= label_tag 'Incompatible Project', nil, class: 'label badge-danger' = label_tag _('Incompatible Project'), nil, class: 'label badge-danger'
- if @incompatible_repos.any? - if @incompatible_repos.any?
%p %p
One or more of your Bitbucket projects cannot be imported into GitLab = _("One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git.")
directly because they use Subversion or Mercurial for version control, - link_to_git = link_to(_('Git'), 'https://www.atlassian.com/git/tutorials/migrating-overview')
rather than Git. Please convert - link_to_import_flow = link_to(_('import flow'), status_import_bitbucket_path)
= link_to 'them to Git,', 'https://www.atlassian.com/git/tutorials/migrating-overview' = _("Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again.").html_safe % { link_to_git: link_to_git, link_to_import_flow: link_to_import_flow }
and go through the
= link_to 'import flow', status_import_bitbucket_path
again.
.js-importer-status{ data: { jobs_import_path: "#{jobs_import_bitbucket_path}", import_path: "#{import_bitbucket_path}" } } .js-importer-status{ data: { jobs_import_path: "#{jobs_import_bitbucket_path}", import_path: "#{import_bitbucket_path}" } }
- page_title "FogBugz Import" - page_title _("FogBugz Import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-bug %i.fa.fa-bug
Import projects from FogBugz = _('Import projects from FogBugz')
%hr %hr
= form_tag callback_import_fogbugz_path do = form_tag callback_import_fogbugz_path do
%p %p
To get started you enter your FogBugz URL and login information below. = _("To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import.")
In the next steps, you'll be able to map users and select the projects
you want to import.
.form-group.row .form-group.row
= label_tag :uri, 'FogBugz URL', class: 'col-form-label col-md-2' = label_tag :uri, _('FogBugz URL'), class: 'col-form-label col-md-2'
.col-md-4 .col-md-4
= text_field_tag :uri, nil, placeholder: 'https://mycompany.fogbugz.com', class: 'form-control' = text_field_tag :uri, nil, placeholder: 'https://mycompany.fogbugz.com', class: 'form-control'
.form-group.row .form-group.row
= label_tag :email, 'FogBugz Email', class: 'col-form-label col-md-2' = label_tag :email, _('FogBugz Email'), class: 'col-form-label col-md-2'
.col-md-4 .col-md-4
= text_field_tag :email, nil, class: 'form-control' = text_field_tag :email, nil, class: 'form-control'
.form-group.row .form-group.row
= label_tag :password, 'FogBugz Password', class: 'col-form-label col-md-2' = label_tag :password, _('FogBugz Password'), class: 'col-form-label col-md-2'
.col-md-4 .col-md-4
= password_field_tag :password, nil, class: 'form-control' = password_field_tag :password, nil, class: 'form-control'
.form-actions .form-actions
= submit_tag 'Continue to the next step', class: 'btn btn-create' = submit_tag _('Continue to the next step'), class: 'btn btn-create'
- page_title 'User map', 'FogBugz import' - page_title _('User map'), _('FogBugz import')
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-bug %i.fa.fa-bug
Import projects from FogBugz = _('Import projects from FogBugz')
%hr %hr
= form_tag create_user_map_import_fogbugz_path do = form_tag create_user_map_import_fogbugz_path do
%p %p
Customize how FogBugz email addresses and usernames are imported into GitLab. = _("Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import.")
In the next step, you'll be able to select the projects you want to import.
%p %p
The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below. = _("The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below.")
%ul %ul
%li %li
%strong Default: Map a FogBugz account ID to a full name %strong= _("Default: Map a FogBugz account ID to a full name")
%p %p
An empty GitLab User field will add the FogBugz user's full name = _("An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator.")
(e.g. "By John Smith") in the description of all issues and comments.
It will also associate and/or assign these issues and comments with
the project creator.
%li %li
%strong Map a FogBugz account ID to a GitLab user %strong= _("Map a FogBugz account ID to a GitLab user")
%p %p
Selecting a GitLab user will add a link to the GitLab user in the descriptions = _('Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. "By <a href="#">@johnsmith</a>"). It will also associate and/or assign these issues and comments with the selected user.').html_safe
of issues and comments (e.g. "By <a href="#">@johnsmith</a>"). It will also
associate and/or assign these issues and comments with the selected user.
.table-holder .table-holder
%table.table %table.table
%thead %thead
%tr %tr
%th ID %th= _("ID")
%th Name %th= _("Name")
%th Email %th= _("Email")
%th GitLab User %th= _("GitLab User")
%tbody %tbody
- @user_map.each do |id, user| - @user_map.each do |id, user|
%tr %tr
...@@ -45,4 +39,4 @@ ...@@ -45,4 +39,4 @@
scope: :all, email_user: true, selected: user[:gitlab_user]) scope: :all, email_user: true, selected: user[:gitlab_user])
.form-actions .form-actions
= submit_tag 'Continue to the next step', class: 'btn btn-create' = submit_tag _('Continue to the next step'), class: 'btn btn-create'
- page_title "FogBugz import" - page_title _("FogBugz import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-bug %i.fa.fa-bug
Import projects from FogBugz = _('Import projects from FogBugz')
- if @repos.any? - if @repos.any?
%p.light %p.light
Select projects you want to import. = _('Select projects you want to import.')
%p.light %p.light
Optionally, you can - link_to_customize = link_to('customize', new_user_map_import_fogbugz_path)
= link_to 'customize', new_user_map_import_fogbugz_path = _('Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab.').html_safe % { link_to_customize: link_to_customize }
how FogBugz email addresses and usernames are imported into GitLab.
%hr %hr
%p %p
= button_tag class: 'btn btn-import btn-success js-import-all' do = button_tag class: 'btn btn-import btn-success js-import-all' do
Import all projects = _('Import all projects')
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
.table-responsive .table-responsive
...@@ -24,9 +23,9 @@ ...@@ -24,9 +23,9 @@
%colgroup.import-jobs-status-col %colgroup.import-jobs-status-col
%thead %thead
%tr %tr
%th From FogBugz %th= _("From FogBugz")
%th To GitLab %th= _("To GitLab")
%th Status %th= _("Status")
%tbody %tbody
- @already_added_projects.each do |project| - @already_added_projects.each do |project|
%tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" }
...@@ -38,10 +37,10 @@ ...@@ -38,10 +37,10 @@
- if project.import_status == 'finished' - if project.import_status == 'finished'
%span %span
%i.fa.fa-check %i.fa.fa-check
done = _("done")
- elsif project.import_status == 'started' - elsif project.import_status == 'started'
%i.fa.fa-spinner.fa-spin %i.fa.fa-spinner.fa-spin
started = _("started")
- else - else
= project.human_import_status_name = project.human_import_status_name
...@@ -53,7 +52,7 @@ ...@@ -53,7 +52,7 @@
#{current_user.username}/#{repo.name} #{current_user.username}/#{repo.name}
%td.import-actions.job-status %td.import-actions.job-status
= button_tag class: "btn btn-import js-add-to-import" do = button_tag class: "btn btn-import js-add-to-import" do
Import = _("Import")
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
.js-importer-status{ data: { jobs_import_path: "#{jobs_import_fogbugz_path}", import_path: "#{import_fogbugz_path}" } } .js-importer-status{ data: { jobs_import_path: "#{jobs_import_fogbugz_path}", import_path: "#{import_fogbugz_path}" } }
- page_title "Gitea Import" - page_title _("Gitea Import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
= custom_icon('go_logo') = custom_icon('go_logo')
Import Projects from Gitea = _('Import Projects from Gitea')
%p %p
To get started, please enter your Gitea Host URL and a - link_to_personal_token = link_to(_('Personal Access Token'), 'https://github.com/gogits/go-gogs-client/wiki#access-token')
= succeed '.' do = _('To get started, please enter your Gitea Host URL and a %{link_to_personal_token}.').html_safe % { link_to_personal_token: link_to_personal_token }
= link_to 'Personal Access Token', 'https://github.com/gogits/go-gogs-client/wiki#access-token'
= form_tag personal_access_token_import_gitea_path do = form_tag personal_access_token_import_gitea_path do
.form-group.row .form-group.row
= label_tag :gitea_host_url, 'Gitea Host URL', class: 'col-form-label col-sm-2' = label_tag :gitea_host_url, _('Gitea Host URL'), class: 'col-form-label col-sm-2'
.col-sm-4 .col-sm-4
= text_field_tag :gitea_host_url, nil, placeholder: 'https://try.gitea.io', class: 'form-control' = text_field_tag :gitea_host_url, nil, placeholder: 'https://try.gitea.io', class: 'form-control'
.form-group.row .form-group.row
= label_tag :personal_access_token, 'Personal Access Token', class: 'col-form-label col-sm-2' = label_tag :personal_access_token, _('Personal Access Token'), class: 'col-form-label col-sm-2'
.col-sm-4 .col-sm-4
= text_field_tag :personal_access_token, nil, class: 'form-control' = text_field_tag :personal_access_token, nil, class: 'form-control'
.form-actions .form-actions
= submit_tag 'List Your Gitea Repositories', class: 'btn btn-create' = submit_tag _('List Your Gitea Repositories'), class: 'btn btn-create'
- page_title "Gitea Import" - page_title _("Gitea Import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
= custom_icon('go_logo') = custom_icon('go_logo')
Import Projects from Gitea = _('Import Projects from Gitea')
= render 'import/githubish_status', provider: 'gitea' = render 'import/githubish_status', provider: 'gitea'
- title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import') - title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import')
- page_title title - page_title title
- breadcrumb_title title - breadcrumb_title title
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
= icon 'github', text: import_github_title = icon 'github', text: import_github_title
......
- title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import') - title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import')
- page_title title - page_title title
- breadcrumb_title title - breadcrumb_title title
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
= icon 'github', text: import_github_title = icon 'github', text: import_github_title
......
- page_title "GitLab.com import" - page_title _("GitLab.com import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-heart %i.fa.fa-heart
Import projects from GitLab.com = _('Import projects from GitLab.com')
%p.light %p.light
Select projects you want to import. = _('Select projects you want to import.')
%hr %hr
%p %p
= button_tag class: "btn btn-import btn-success js-import-all" do = button_tag class: "btn btn-import btn-success js-import-all" do
Import all projects = _('Import all projects')
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
.table-responsive .table-responsive
...@@ -19,9 +19,9 @@ ...@@ -19,9 +19,9 @@
%colgroup.import-jobs-status-col %colgroup.import-jobs-status-col
%thead %thead
%tr %tr
%th From GitLab.com %th= _('From GitLab.com')
%th To this GitLab instance %th= _('To this GitLab instance')
%th Status %th= _('Status')
%tbody %tbody
- @already_added_projects.each do |project| - @already_added_projects.each do |project|
%tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" }
...@@ -33,10 +33,10 @@ ...@@ -33,10 +33,10 @@
- if project.import_status == 'finished' - if project.import_status == 'finished'
%span %span
%i.fa.fa-check %i.fa.fa-check
done = _('done')
- elsif project.import_status == 'started' - elsif project.import_status == 'started'
%i.fa.fa-spinner.fa-spin %i.fa.fa-spinner.fa-spin
started = _('started')
- else - else
= project.human_import_status_name = project.human_import_status_name
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
= import_project_target(repo['namespace']['path'], repo['name']) = import_project_target(repo['namespace']['path'], repo['name'])
%td.import-actions.job-status %td.import-actions.job-status
= button_tag class: "btn btn-import js-add-to-import" do = button_tag class: "btn btn-import js-add-to-import" do
Import = _('Import')
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
.js-importer-status{ data: { jobs_import_path: "#{jobs_import_gitlab_path}", import_path: "#{import_gitlab_path}" } } .js-importer-status{ data: { jobs_import_path: "#{jobs_import_gitlab_path}", import_path: "#{import_gitlab_path}" } }
- page_title "GitLab Import" - page_title _("GitLab Import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
= icon('gitlab') = icon('gitlab')
Import an exported GitLab project = _('Import an exported GitLab project')
%hr %hr
= form_tag import_gitlab_project_path, class: 'new_project', multipart: true do = form_tag import_gitlab_project_path, class: 'new_project', multipart: true do
...@@ -24,19 +24,19 @@ ...@@ -24,19 +24,19 @@
#{user_url(current_user.username)}/ #{user_url(current_user.username)}/
= hidden_field_tag :namespace_id, value: current_user.namespace_id = hidden_field_tag :namespace_id, value: current_user.namespace_id
.form-group.col-12.col-sm-6.project-path .form-group.col-12.col-sm-6.project-path
= label_tag :path, 'Project name', class: 'label-light' = label_tag :path, _('Project name'), class: 'label-light'
= text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control", tabindex: 2, autofocus: true, required: true = text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control", tabindex: 2, autofocus: true, required: true
.row .row
.form-group.col-md-12 .form-group.col-md-12
To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here. = _("To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here.")
.row .row
.form-group.col-sm-12 .form-group.col-sm-12
= hidden_field_tag :namespace_id, @namespace.id = hidden_field_tag :namespace_id, @namespace.id
= label_tag :file, 'GitLab project export', class: 'label-light' = label_tag :file, _('GitLab project export'), class: 'label-light'
.form-group .form-group
= file_field_tag :file, class: '' = file_field_tag :file, class: ''
.row .row
.form-actions.col-sm-12 .form-actions.col-sm-12
= submit_tag 'Import project', class: 'btn btn-create' = submit_tag _('Import project'), class: 'btn btn-create'
= link_to 'Cancel', new_project_path, class: 'btn btn-cancel' = link_to _('Cancel'), new_project_path, class: 'btn btn-cancel'
- page_title "Google Code import" - page_title _("Google Code import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-google %i.fa.fa-google
Import projects from Google Code = _('Import projects from Google Code')
%hr %hr
= form_tag callback_import_google_code_path, multipart: true do = form_tag callback_import_google_code_path, multipart: true do
%p %p
Follow the steps below to export your Google Code project data. = _('Follow the steps below to export your Google Code project data.')
In the next step, you'll be able to select the projects you want to import. = _("In the next step, you'll be able to select the projects you want to import.")
%ol %ol
%li %li
%p %p
Go to - link_to_google_takeout = link_to(_("Google Takeout"), "https://www.google.com/settings/takeout", target: '_blank', rel: 'noopener noreferrer')
#{link_to "Google Takeout", "https://www.google.com/settings/takeout", target: '_blank', rel: 'noopener noreferrer'}. = _("Go to %{link_to_google_takeout}.").html_safe % { link_to_google_takeout: link_to_google_takeout }
%li %li
%p %p
Make sure you're logged into the account that owns the projects you'd like to import. = _("Make sure you're logged into the account that owns the projects you'd like to import.")
%li %li
%p %p
Click the <strong>Select none</strong> button on the right, since we only need "Google Code Project Hosting". = _('Click the <strong>Select none</strong> button on the right, since we only need "Google Code Project Hosting".').html_safe
%li %li
%p %p
Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right. = _('Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right.').html_safe
%li %li
%p %p
Choose <strong>Next</strong> at the bottom of the page. = _('Choose <strong>Next</strong> at the bottom of the page.').html_safe
%li %li
%p %p
Leave the "File type" and "Delivery method" options on their default values. = _('Leave the "File type" and "Delivery method" options on their default values.')
%li %li
%p %p
Choose <strong>Create archive</strong> and wait for archiving to complete. = _('Choose <strong>Create archive</strong> and wait for archiving to complete.').html_safe
%li %li
%p %p
Click the <strong>Download</strong> button and wait for downloading to complete. = _('Click the <strong>Download</strong> button and wait for downloading to complete.').html_safe
%li %li
%p %p
Find the downloaded ZIP file and decompress it. = _('Find the downloaded ZIP file and decompress it.')
%li %li
%p %p
Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file. = _('Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file.').html_safe
%li %li
%p %p
Upload <code>GoogleCodeProjectHosting.json</code> here: = _('Upload <code>GoogleCodeProjectHosting.json</code> here:').html_safe
%p %p
%input{ type: "file", name: "dump_file", id: "dump_file" } %input{ type: "file", name: "dump_file", id: "dump_file" }
%li %li
%p %p
Do you want to customize how Google Code email addresses and usernames are imported into GitLab? = _('Do you want to customize how Google Code email addresses and usernames are imported into GitLab?')
%p %p
= label_tag :create_user_map_0 do = label_tag :create_user_map_0 do
= radio_button_tag :create_user_map, 0, true = radio_button_tag :create_user_map, 0, true
No, directly import the existing email addresses and usernames. = _('No, directly import the existing email addresses and usernames.')
%p %p
= label_tag :create_user_map_1 do = label_tag :create_user_map_1 do
= radio_button_tag :create_user_map, 1, false = radio_button_tag :create_user_map, 1, false
Yes, let me map Google Code users to full names or GitLab users. = _('Yes, let me map Google Code users to full names or GitLab users.')
%li %li
%p %p
= submit_tag 'Continue to the next step', class: "btn btn-create" = submit_tag _('Continue to the next step'), class: "btn btn-create"
- page_title "User map", "Google Code import" - page_title _("User map"), _("Google Code import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-google %i.fa.fa-google
Import projects from Google Code = _('Import projects from Google Code')
%hr %hr
= form_tag create_user_map_import_google_code_path do = form_tag create_user_map_import_google_code_path do
%p %p
Customize how Google Code email addresses and usernames are imported into GitLab. = _("Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import.")
In the next step, you'll be able to select the projects you want to import.
%p %p
The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side. = _("The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.").html_safe
%ul %ul
%li %li
%strong Default: Directly import the Google Code email address or username %strong= _("Default: Directly import the Google Code email address or username")
%p %p
<code>"johnsmith@example.com": "johnsm...@example.com"</code> = _('<code>"johnsmith@example.com": "johnsm...@example.com"</code> will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user\'s privacy.').html_safe
will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com.
The email address or username is masked to ensure the user's privacy.
%li %li
%strong Map a Google Code user to a GitLab user %strong= _("Map a Google Code user to a GitLab user")
%p %p
<code>"johnsmith@example.com": "@johnsmith"</code> = _('<code>"johnsmith@example.com": "@johnsmith"</code> will add "By <a href="#">@johnsmith</a>" to all issues and comments originally created by johnsmith@example.com, and will set <a href="#">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.').html_safe
will add "By <a href="#">@johnsmith</a>" to all issues and comments originally created by johnsmith@example.com,
and will set <a href="#">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.
%li %li
%strong Map a Google Code user to a full name %strong= _("Map a Google Code user to a full name")
%p %p
<code>"johnsmith@example.com": "John Smith"</code> = _('<code>"johnsmith@example.com": "John Smith"</code> will add "By John Smith" to all issues and comments originally created by johnsmith@example.com.').html_safe
will add "By John Smith" to all issues and comments originally created by johnsmith@example.com.
%li %li
%strong Map a Google Code user to a full email address %strong= _("Map a Google Code user to a full email address")
%p %p
<code>"johnsmith@example.com": "johnsmith@example.com"</code> = _('<code>"johnsmith@example.com": "johnsmith@example.com"</code> will add "By <a href="#">johnsmith@example.com</a>" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user\'s privacy. Use this option if you want to show the full email address.').html_safe
will add "By <a href="#">johnsmith@example.com</a>" to all issues and comments originally created by johnsmith@example.com.
By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address.
.form-group.row .form-group.row
.col-sm-12 .col-sm-12
= text_area_tag :user_map, JSON.pretty_generate(@user_map), class: 'form-control', rows: 15 = text_area_tag :user_map, JSON.pretty_generate(@user_map), class: 'form-control', rows: 15
.form-actions .form-actions
= submit_tag 'Continue to the next step', class: "btn btn-create" = submit_tag _('Continue to the next step'), class: "btn btn-create"
- page_title "Google Code import" - page_title _("Google Code import")
- header_title "Projects", root_path - header_title _("Projects"), root_path
%h3.page-title %h3.page-title
%i.fa.fa-google %i.fa.fa-google
Import projects from Google Code = _('Import projects from Google Code')
- if @repos.any? - if @repos.any?
%p.light %p.light
Select projects you want to import. = _('Select projects you want to import.')
%p.light %p.light
Optionally, you can - link_to_customize = link_to(_("customize"), new_user_map_import_google_code_path)
= link_to "customize", new_user_map_import_google_code_path = _("Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab.").html_safe % { link_to_customize: link_to_customize }
how Google Code email addresses and usernames are imported into GitLab.
%hr %hr
%p %p
- if @incompatible_repos.any? - if @incompatible_repos.any?
= button_tag class: "btn btn-import btn-success js-import-all" do = button_tag class: "btn btn-import btn-success js-import-all" do
Import all compatible projects = _("Import all compatible projects")
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
- else - else
= button_tag class: "btn btn-import btn-success js-import-all" do = button_tag class: "btn btn-import btn-success js-import-all" do
Import all projects = _("Import all projects")
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
.table-responsive .table-responsive
...@@ -29,9 +28,9 @@ ...@@ -29,9 +28,9 @@
%colgroup.import-jobs-status-col %colgroup.import-jobs-status-col
%thead %thead
%tr %tr
%th From Google Code %th= _("From Google Code")
%th To GitLab %th= _("To GitLab")
%th Status %th= _("Status")
%tbody %tbody
- @already_added_projects.each do |project| - @already_added_projects.each do |project|
%tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" }
...@@ -43,10 +42,10 @@ ...@@ -43,10 +42,10 @@
- if project.import_status == 'finished' - if project.import_status == 'finished'
%span %span
%i.fa.fa-check %i.fa.fa-check
done = _("done")
- elsif project.import_status == 'started' - elsif project.import_status == 'started'
%i.fa.fa-spinner.fa-spin %i.fa.fa-spinner.fa-spin
started = _("started")
- else - else
= project.human_import_status_name = project.human_import_status_name
...@@ -58,7 +57,7 @@ ...@@ -58,7 +57,7 @@
#{current_user.username}/#{repo.name} #{current_user.username}/#{repo.name}
%td.import-actions.job-status %td.import-actions.job-status
= button_tag class: "btn btn-import js-add-to-import" do = button_tag class: "btn btn-import js-add-to-import" do
Import = _("Import")
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
- @incompatible_repos.each do |repo| - @incompatible_repos.each do |repo|
%tr{ id: "repo_#{repo.id}" } %tr{ id: "repo_#{repo.id}" }
...@@ -66,15 +65,12 @@ ...@@ -66,15 +65,12 @@
= link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank", rel: 'noopener noreferrer' = link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank", rel: 'noopener noreferrer'
%td.import-target %td.import-target
%td.import-actions-job-status %td.import-actions-job-status
= label_tag "Incompatible Project", nil, class: "label badge-danger" = label_tag _("Incompatible Project"), nil, class: "label badge-danger"
- if @incompatible_repos.any? - if @incompatible_repos.any?
%p %p
One or more of your Google Code projects cannot be imported into GitLab = _("One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git.")
directly because they use Subversion or Mercurial for version control, - link_to_import_flow = link_to(_("import flow"), new_import_google_code_path)
rather than Git. Please convert them to Git on Google Code, and go = _("Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again.").html_safe % { link_to_import_flow: link_to_import_flow }
through the
= link_to "import flow", new_import_google_code_path
again.
.js-importer-status{ data: { jobs_import_path: "#{jobs_import_google_code_path}", import_path: "#{import_google_code_path}" } } .js-importer-status{ data: { jobs_import_path: "#{jobs_import_google_code_path}", import_path: "#{import_google_code_path}" } }
---
title: Enable frozen string in apps/uploaders/*.rb
merge_request: 20401
author: gfyoung
type: other
---
title: Add a 10 ms bucket for SQL timings
merge_request:
author:
type: changed
---
title: Update issue closing pattern
merge_request: 20554
author: George Tsiolis
type: changed
...@@ -142,7 +142,7 @@ Settings.gitlab['signup_enabled'] ||= true if Settings.gitlab['signup_enabled']. ...@@ -142,7 +142,7 @@ Settings.gitlab['signup_enabled'] ||= true if Settings.gitlab['signup_enabled'].
Settings.gitlab['signin_enabled'] ||= true if Settings.gitlab['signin_enabled'].nil? Settings.gitlab['signin_enabled'] ||= true if Settings.gitlab['signin_enabled'].nil?
Settings.gitlab['restricted_visibility_levels'] = Settings.__send__(:verify_constant_array, Gitlab::VisibilityLevel, Settings.gitlab['restricted_visibility_levels'], []) Settings.gitlab['restricted_visibility_levels'] = Settings.__send__(:verify_constant_array, Gitlab::VisibilityLevel, Settings.gitlab['restricted_visibility_levels'], [])
Settings.gitlab['username_changing_enabled'] = true if Settings.gitlab['username_changing_enabled'].nil? Settings.gitlab['username_changing_enabled'] = true if Settings.gitlab['username_changing_enabled'].nil?
Settings.gitlab['issue_closing_pattern'] = '((?:[Cc]los(?:e[sd]?|ing)|[Ff]ix(?:e[sd]|ing)?|[Rr]esolv(?:e[sd]?|ing)|[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *, *)?)|([A-Z][A-Z0-9_]+-\d+))+)' if Settings.gitlab['issue_closing_pattern'].nil? Settings.gitlab['issue_closing_pattern'] = '((?:[Cc]los(?:e[sd]?|ing)|[Ff]ix(?:e[sd]|ing)?|[Rr]esolv(?:e[sd]?|ing)|[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *,? *)?)|([A-Z][A-Z0-9_]+-\d+))+)' if Settings.gitlab['issue_closing_pattern'].nil?
Settings.gitlab['default_projects_features'] ||= {} Settings.gitlab['default_projects_features'] ||= {}
Settings.gitlab['webhook_timeout'] ||= 10 Settings.gitlab['webhook_timeout'] ||= 10
Settings.gitlab['max_attachment_size'] ||= 10 Settings.gitlab['max_attachment_size'] ||= 10
......
...@@ -197,4 +197,4 @@ Note: It is recommended to log into the `git` user using `sudo -i -u git` or `su ...@@ -197,4 +197,4 @@ Note: It is recommended to log into the `git` user using `sudo -i -u git` or `su
## GitLab.com ## GitLab.com
We've also detailed [our architecture of GitLab.com](https://about.gitlab.com/handbook/infrastructure/production-architecture/) but this is probably over the top unless you have millions of users. We've also detailed [our architecture of GitLab.com](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/) but this is probably over the top unless you have millions of users.
...@@ -92,9 +92,9 @@ Is the system packaged Git too old? Remove it and compile from source. ...@@ -92,9 +92,9 @@ Is the system packaged Git too old? Remove it and compile from source.
# Download and compile from source # Download and compile from source
cd /tmp cd /tmp
curl --remote-name --progress https://www.kernel.org/pub/software/scm/git/git-2.16.3.tar.gz curl --remote-name --progress https://www.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz
echo 'dda229e9c73f4fbb7d4324e0d993e11311673df03f73b194c554c2e9451e17cd git-2.16.3.tar.gz' | shasum -a256 -c - && tar -xzf git-2.16.3.tar.gz echo '94faf2c0b02a7920b0b46f4961d8e9cad08e81418614102898a55f980fa3e7e4 git-2.18.0.tar.gz' | shasum -a256 -c - && tar -xzf git-2.18.0.tar.gz
cd git-2.16.3/ cd git-2.18.0/
./configure ./configure
make prefix=/usr/local all make prefix=/usr/local all
......
...@@ -20,7 +20,7 @@ module Gitlab ...@@ -20,7 +20,7 @@ module Gitlab
define_histogram :gitlab_sql_duration_seconds do define_histogram :gitlab_sql_duration_seconds do
docstring 'SQL time' docstring 'SQL time'
base_labels Transaction::BASE_LABELS base_labels Transaction::BASE_LABELS
buckets [0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0] buckets [0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0]
end end
def current_transaction def current_transaction
......
This diff is collapsed.
...@@ -379,6 +379,20 @@ describe Gitlab::ClosingIssueExtractor do ...@@ -379,6 +379,20 @@ describe Gitlab::ClosingIssueExtractor do
.to match_array([issue, other_issue, third_issue]) .to match_array([issue, other_issue, third_issue])
end end
it 'allows non-comma-separated issue numbers in single line message' do
message = "Closes #{reference} #{reference2} #{reference3}"
expect(subject.closed_by_message(message))
.to match_array([issue, other_issue, third_issue])
end
it 'allows mixed comma-separated and non-comma-separated issue numbers in single line message' do
message = "Closes #{reference}, #{reference2} and #{reference3}"
expect(subject.closed_by_message(message))
.to match_array([issue, other_issue, third_issue])
end
it 'fetches issues in multi-line message' do it 'fetches issues in multi-line message' do
message = "Awesome commit (closes #{reference})\nAlso fixes #{reference2}" message = "Awesome commit (closes #{reference})\nAlso fixes #{reference2}"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment