Commit 08b88d89 authored by GitLab Bot's avatar GitLab Bot

Merge remote-tracking branch 'upstream/master' into ce-to-ee-2018-03-06

# Conflicts:
#	app/models/group.rb
#	app/services/merge_requests/update_service.rb
#	app/views/projects/_home_panel.html.haml
#	app/views/projects/new.html.haml
#	app/views/shared/_import_form.html.haml
#	changelogs/unreleased/wip-new-mr-cmd.yml
#	db/schema.rb
#	doc/api/projects.md
#	doc/user/project/import/repo_by_url.md
#	lib/api/entities.rb
#	locale/gitlab.pot
#	spec/models/group_spec.rb

[ci skip]
parents c44db787 2e87923d
...@@ -197,6 +197,17 @@ release. There are two levels of priority labels: ...@@ -197,6 +197,17 @@ release. There are two levels of priority labels:
milestone. If these issues are not done in the current release, they will milestone. If these issues are not done in the current release, they will
strongly be considered for the next release. strongly be considered for the next release.
### Severity labels (~S1, ~S2, etc.)
Severity labels help us clearly communicate the impact of a ~bug on users.
| Label | Meaning | Example |
|-------|------------------------------------------|---------|
| ~S1 | Feature broken, no workaround | Unable to create an issue |
| ~S2 | Feature broken, workaround unacceptable | Can push commits, but only via the command line |
| ~S3 | Feature broken, workaround acceptable | Can create merge requests only from the Merge Requests page, not through the Issue |
| ~S4 | Cosmetic issue | Label colors are incorrect / not being displayed |
### Label for community contributors (~"Accepting Merge Requests") ### Label for community contributors (~"Accepting Merge Requests")
Issues that are beneficial to our users, 'nice to haves', that we currently do Issues that are beneficial to our users, 'nice to haves', that we currently do
......
...@@ -426,7 +426,7 @@ group :ed25519 do ...@@ -426,7 +426,7 @@ group :ed25519 do
end end
# Gitaly GRPC client # Gitaly GRPC client
gem 'gitaly-proto', '~> 0.87.0', require: 'gitaly' gem 'gitaly-proto', '~> 0.88.0', require: 'gitaly'
# Locked until https://github.com/google/protobuf/issues/4210 is closed # Locked until https://github.com/google/protobuf/issues/4210 is closed
gem 'google-protobuf', '= 3.5.1' gem 'google-protobuf', '= 3.5.1'
......
...@@ -309,7 +309,7 @@ GEM ...@@ -309,7 +309,7 @@ GEM
po_to_json (>= 1.0.0) po_to_json (>= 1.0.0)
rails (>= 3.2.0) rails (>= 3.2.0)
gherkin-ruby (0.3.2) gherkin-ruby (0.3.2)
gitaly-proto (0.87.0) gitaly-proto (0.88.0)
google-protobuf (~> 3.1) google-protobuf (~> 3.1)
grpc (~> 1.0) grpc (~> 1.0)
github-linguist (5.3.3) github-linguist (5.3.3)
...@@ -630,7 +630,7 @@ GEM ...@@ -630,7 +630,7 @@ GEM
atomic (>= 1.0.0) atomic (>= 1.0.0)
mysql2 mysql2
peek peek
peek-performance_bar (1.3.0) peek-performance_bar (1.3.1)
peek (>= 0.1.0) peek (>= 0.1.0)
peek-pg (1.3.0) peek-pg (1.3.0)
concurrent-ruby concurrent-ruby
...@@ -1091,7 +1091,7 @@ DEPENDENCIES ...@@ -1091,7 +1091,7 @@ DEPENDENCIES
gettext (~> 3.2.2) gettext (~> 3.2.2)
gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.2.0) gettext_i18n_rails_js (~> 1.2.0)
gitaly-proto (~> 0.87.0) gitaly-proto (~> 0.88.0)
github-linguist (~> 5.3.3) github-linguist (~> 5.3.3)
gitlab-flowdock-git-hook (~> 1.0.1) gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-license (~> 1.0) gitlab-license (~> 1.0)
......
...@@ -216,6 +216,9 @@ export default class MilestoneSelect { ...@@ -216,6 +216,9 @@ export default class MilestoneSelect {
$value.html(milestoneLinkNoneTemplate); $value.html(milestoneLinkNoneTemplate);
return $sidebarCollapsedValue.find('span').text('No'); return $sidebarCollapsedValue.find('span').text('No');
} }
})
.catch(() => {
$loading.fadeOut();
}); });
} }
} }
......
...@@ -9,7 +9,6 @@ class Admin::ImpersonationTokensController < Admin::ApplicationController ...@@ -9,7 +9,6 @@ class Admin::ImpersonationTokensController < Admin::ApplicationController
@impersonation_token = finder.build(impersonation_token_params) @impersonation_token = finder.build(impersonation_token_params)
if @impersonation_token.save if @impersonation_token.save
flash[:impersonation_token] = @impersonation_token.token
redirect_to admin_user_impersonation_tokens_path, notice: "A new impersonation token has been created." redirect_to admin_user_impersonation_tokens_path, notice: "A new impersonation token has been created."
else else
set_index_vars set_index_vars
......
...@@ -62,7 +62,7 @@ class InvitesController < ApplicationController ...@@ -62,7 +62,7 @@ class InvitesController < ApplicationController
case source case source
when Project when Project
project = member.source project = member.source
label = "project #{project.name_with_namespace}" label = "project #{project.full_name}"
path = project_path(project) path = project_path(project)
when Group when Group
group = member.source group = member.source
......
...@@ -38,7 +38,7 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -38,7 +38,7 @@ class Projects::BlobController < Projects::ApplicationController
end end
format.json do format.json do
page_title @blob.path, @ref, @project.name_with_namespace page_title @blob.path, @ref, @project.full_name
show_json show_json
end end
......
...@@ -17,10 +17,8 @@ class Projects::CompareController < Projects::ApplicationController ...@@ -17,10 +17,8 @@ class Projects::CompareController < Projects::ApplicationController
def show def show
apply_diff_view_cookie! apply_diff_view_cookie!
# n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37430
Gitlab::GitalyClient.allow_n_plus_1_calls do render
render
end
end end
def diff_for_path def diff_for_path
......
...@@ -36,7 +36,7 @@ class Projects::TreeController < Projects::ApplicationController ...@@ -36,7 +36,7 @@ class Projects::TreeController < Projects::ApplicationController
end end
format.json do format.json do
page_title @path.presence || _("Files"), @ref, @project.name_with_namespace page_title @path.presence || _("Files"), @ref, @project.full_name
# n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/38261 # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/38261
Gitlab::GitalyClient.allow_n_plus_1_calls do Gitlab::GitalyClient.allow_n_plus_1_calls do
......
...@@ -132,7 +132,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -132,7 +132,7 @@ class ProjectsController < Projects::ApplicationController
return access_denied! unless can?(current_user, :remove_project, @project) return access_denied! unless can?(current_user, :remove_project, @project)
::Projects::DestroyService.new(@project, current_user, {}).async_execute ::Projects::DestroyService.new(@project, current_user, {}).async_execute
flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.name_with_namespace } flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.full_name }
redirect_to dashboard_projects_path, status: 302 redirect_to dashboard_projects_path, status: 302
rescue Projects::DestroyService::DestroyError => ex rescue Projects::DestroyService::DestroyError => ex
......
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
# non_archived: boolean # non_archived: boolean
# iids: integer[] # iids: integer[]
# my_reaction_emoji: string # my_reaction_emoji: string
# created_after: datetime
# created_before: datetime
# updated_after: datetime
# updated_before: datetime
# #
class IssuableFinder class IssuableFinder
prepend FinderWithCrossProjectAccess prepend FinderWithCrossProjectAccess
...@@ -79,6 +83,7 @@ class IssuableFinder ...@@ -79,6 +83,7 @@ class IssuableFinder
def filter_items(items) def filter_items(items)
items = by_scope(items) items = by_scope(items)
items = by_created_at(items) items = by_created_at(items)
items = by_updated_at(items)
items = by_state(items) items = by_state(items)
items = by_group(items) items = by_group(items)
items = by_search(items) items = by_search(items)
...@@ -283,6 +288,13 @@ class IssuableFinder ...@@ -283,6 +288,13 @@ class IssuableFinder
end end
end end
def by_updated_at(items)
items = items.updated_after(params[:updated_after]) if params[:updated_after].present?
items = items.updated_before(params[:updated_before]) if params[:updated_before].present?
items
end
def by_state(items) def by_state(items)
case params[:state].to_s case params[:state].to_s
when 'closed' when 'closed'
......
...@@ -17,6 +17,10 @@ ...@@ -17,6 +17,10 @@
# my_reaction_emoji: string # my_reaction_emoji: string
# public_only: boolean # public_only: boolean
# due_date: date or '0', '', 'overdue', 'week', or 'month' # due_date: date or '0', '', 'overdue', 'week', or 'month'
# created_after: datetime
# created_before: datetime
# updated_after: datetime
# updated_before: datetime
# #
class IssuesFinder < IssuableFinder class IssuesFinder < IssuableFinder
prepend EE::IssuesFinder prepend EE::IssuesFinder
......
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
# my_reaction_emoji: string # my_reaction_emoji: string
# source_branch: string # source_branch: string
# target_branch: string # target_branch: string
# created_after: datetime
# created_before: datetime
# updated_after: datetime
# updated_before: datetime
# #
class MergeRequestsFinder < IssuableFinder class MergeRequestsFinder < IssuableFinder
def klass def klass
......
...@@ -8,10 +8,32 @@ module ImportHelper ...@@ -8,10 +8,32 @@ module ImportHelper
"#{namespace}/#{name}" "#{namespace}/#{name}"
end end
def provider_project_link(provider, path_with_namespace) def provider_project_link(provider, full_path)
url = __send__("#{provider}_project_url", path_with_namespace) # rubocop:disable GitlabSecurity/PublicSend url = __send__("#{provider}_project_url", full_path) # rubocop:disable GitlabSecurity/PublicSend
link_to path_with_namespace, url, target: '_blank', rel: 'noopener noreferrer' link_to full_path, url, target: '_blank', rel: 'noopener noreferrer'
end
def import_will_timeout_message(_ci_cd_only)
timeout = time_interval_in_words(Gitlab.config.gitlab_shell.git_timeout)
_('The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination.') % { timeout: timeout }
end
def import_svn_message(_ci_cd_only)
svn_link = link_to _('this document'), help_page_path('user/project/import/svn')
_('To import an SVN repository, check out %{svn_link}.').html_safe % { svn_link: svn_link }
end
def import_in_progress_title
if @project.forked?
_('Forking in progress')
else
_('Import in progress')
end
end
def import_wait_and_refresh_message
_('Please wait while we import the repository for you. Refresh at will.')
end end
def import_will_timeout_message(_ci_cd_only) def import_will_timeout_message(_ci_cd_only)
...@@ -38,8 +60,8 @@ module ImportHelper ...@@ -38,8 +60,8 @@ module ImportHelper
private private
def github_project_url(path_with_namespace) def github_project_url(full_path)
"#{github_root_url}/#{path_with_namespace}" "#{github_root_url}/#{full_path}"
end end
def github_root_url def github_root_url
...@@ -49,7 +71,7 @@ module ImportHelper ...@@ -49,7 +71,7 @@ module ImportHelper
@github_url = provider.fetch('url', 'https://github.com') if provider @github_url = provider.fetch('url', 'https://github.com') if provider
end end
def gitea_project_url(path_with_namespace) def gitea_project_url(full_path)
"#{@gitea_host_url.sub(%r{/+\z}, '')}/#{path_with_namespace}" "#{@gitea_host_url.sub(%r{/+\z}, '')}/#{full_path}"
end end
end end
...@@ -99,7 +99,7 @@ module IssuablesHelper ...@@ -99,7 +99,7 @@ module IssuablesHelper
project = Project.find_by(id: project_id) project = Project.find_by(id: project_id)
if project if project
project.name_with_namespace project.full_name
else else
default_label default_label
end end
......
...@@ -99,13 +99,13 @@ module ProjectsHelper ...@@ -99,13 +99,13 @@ module ProjectsHelper
end end
def remove_project_message(project) def remove_project_message(project)
_("You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?") % _("You are going to remove %{project_full_name}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?") %
{ project_name_with_namespace: project.name_with_namespace } { project_full_name: project.full_name }
end end
def transfer_project_message(project) def transfer_project_message(project)
_("You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?") % _("You are going to transfer %{project_full_name} to another owner. Are you ABSOLUTELY sure?") %
{ project_name_with_namespace: project.name_with_namespace } { project_full_name: project.full_name }
end end
def remove_fork_project_message(project) def remove_fork_project_message(project)
......
...@@ -120,7 +120,7 @@ module SearchHelper ...@@ -120,7 +120,7 @@ module SearchHelper
category: "Projects", category: "Projects",
id: p.id, id: p.id,
value: "#{search_result_sanitize(p.name)}", value: "#{search_result_sanitize(p.name)}",
label: "#{search_result_sanitize(p.name_with_namespace)}", label: "#{search_result_sanitize(p.full_name)}",
url: project_path(p) url: project_path(p)
} }
end end
......
...@@ -114,7 +114,7 @@ module TodosHelper ...@@ -114,7 +114,7 @@ module TodosHelper
projects = current_user.authorized_projects.sorted_by_activity.non_archived.with_route projects = current_user.authorized_projects.sorted_by_activity.non_archived.with_route
projects = projects.map do |project| projects = projects.map do |project|
{ id: project.id, text: project.name_with_namespace } { id: project.id, text: project.full_name }
end end
projects.unshift({ id: '', text: 'Any Project' }).to_json projects.unshift({ id: '', text: 'Any Project' }).to_json
......
...@@ -19,6 +19,7 @@ module Issuable ...@@ -19,6 +19,7 @@ module Issuable
include AfterCommitQueue include AfterCommitQueue
include Sortable include Sortable
include CreatedAtFilterable include CreatedAtFilterable
include UpdatedAtFilterable
# This object is used to gather issuable meta data for displaying # This object is used to gather issuable meta data for displaying
# upvotes, downvotes, notes and closing merge requests count for issues and merge requests # upvotes, downvotes, notes and closing merge requests count for issues and merge requests
......
module UpdatedAtFilterable
extend ActiveSupport::Concern
included do
scope :updated_before, ->(date) { where(scoped_table[:updated_at].lteq(date)) }
scope :updated_after, ->(date) { where(scoped_table[:updated_at].gteq(date)) }
def self.scoped_table
arel_table.alias(table_name)
end
end
end
...@@ -164,7 +164,7 @@ class Event < ActiveRecord::Base ...@@ -164,7 +164,7 @@ class Event < ActiveRecord::Base
def project_name def project_name
if project if project
project.name_with_namespace project.full_name
else else
"(deleted project)" "(deleted project)"
end end
......
...@@ -36,9 +36,12 @@ class Group < Namespace ...@@ -36,9 +36,12 @@ class Group < Namespace
has_many :hooks, dependent: :destroy, class_name: 'GroupHook' # rubocop:disable Cop/ActiveRecordDependent has_many :hooks, dependent: :destroy, class_name: 'GroupHook' # rubocop:disable Cop/ActiveRecordDependent
has_many :uploads, as: :model, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :uploads, as: :model, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
<<<<<<< HEAD
# We cannot simply set `has_many :audit_events, as: :entity, dependent: :destroy` # We cannot simply set `has_many :audit_events, as: :entity, dependent: :destroy`
# here since Group inherits from Namespace, the entity_type would be set to `Namespace`. # here since Group inherits from Namespace, the entity_type would be set to `Namespace`.
has_many :audit_events, -> { where(entity_type: Group) }, foreign_key: 'entity_id' has_many :audit_events, -> { where(entity_type: Group) }, foreign_key: 'entity_id'
=======
>>>>>>> upstream/master
has_many :badges, class_name: 'GroupBadge' has_many :badges, class_name: 'GroupBadge'
accepts_nested_attributes_for :variables, allow_destroy: true accepts_nested_attributes_for :variables, allow_destroy: true
......
...@@ -197,10 +197,6 @@ class MergeRequestDiff < ActiveRecord::Base ...@@ -197,10 +197,6 @@ class MergeRequestDiff < ActiveRecord::Base
CompareService.new(project, head_commit_sha).execute(project, sha, straight: true) CompareService.new(project, head_commit_sha).execute(project, sha, straight: true)
end end
def commits_count
super || merge_request_diff_commits.size
end
private private
def create_merge_request_diff_files(diffs) def create_merge_request_diff_files(diffs)
......
...@@ -68,7 +68,7 @@ http://app.asana.com/-/account_api' ...@@ -68,7 +68,7 @@ http://app.asana.com/-/account_api'
end end
user = data[:user_name] user = data[:user_name]
project_name = project.name_with_namespace project_name = project.full_name
data[:commits].each do |commit| data[:commits].each do |commit|
push_msg = "#{user} pushed to branch #{branch} of #{project_name} ( #{commit[:url]} ):" push_msg = "#{user} pushed to branch #{branch} of #{project_name} ( #{commit[:url]} ):"
......
...@@ -86,7 +86,7 @@ class CampfireService < Service ...@@ -86,7 +86,7 @@ class CampfireService < Service
after = push[:after] after = push[:after]
message = "" message = ""
message << "[#{project.name_with_namespace}] " message << "[#{project.full_name}] "
message << "#{push[:user_name]} " message << "#{push[:user_name]} "
if Gitlab::Git.blank_ref?(before) if Gitlab::Git.blank_ref?(before)
......
...@@ -129,7 +129,7 @@ class ChatNotificationService < Service ...@@ -129,7 +129,7 @@ class ChatNotificationService < Service
end end
def project_name def project_name
project.name_with_namespace.gsub(/\s/, '') project.full_name.gsub(/\s/, '')
end end
def project_url def project_url
......
...@@ -120,7 +120,7 @@ class HipchatService < Service ...@@ -120,7 +120,7 @@ class HipchatService < Service
else else
message << "pushed to #{ref_type} <a href=\""\ message << "pushed to #{ref_type} <a href=\""\
"#{project.web_url}/commits/#{CGI.escape(ref)}\">#{ref}</a> " "#{project.web_url}/commits/#{CGI.escape(ref)}\">#{ref}</a> "
message << "of <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/, '')}</a> " message << "of <a href=\"#{project.web_url}\">#{project.full_name.gsub!(/\s/, '')}</a> "
message << "(<a href=\"#{project.web_url}/compare/#{before}...#{after}\">Compare changes</a>)" message << "(<a href=\"#{project.web_url}/compare/#{before}...#{after}\">Compare changes</a>)"
push[:commits].take(MAX_COMMITS).each do |commit| push[:commits].take(MAX_COMMITS).each do |commit|
...@@ -275,7 +275,7 @@ class HipchatService < Service ...@@ -275,7 +275,7 @@ class HipchatService < Service
end end
def project_name def project_name
project.name_with_namespace.gsub(/\s/, '') project.full_name.gsub(/\s/, '')
end end
def project_url def project_url
......
class JiraService < IssueTrackerService class JiraService < IssueTrackerService
include Gitlab::Routing include Gitlab::Routing
include ApplicationHelper
include ActionView::Helpers::AssetUrlHelper
validates :url, url: true, presence: true, if: :activated? validates :url, url: true, presence: true, if: :activated?
validates :api_url, url: true, allow_blank: true validates :api_url, url: true, allow_blank: true
...@@ -268,7 +270,9 @@ class JiraService < IssueTrackerService ...@@ -268,7 +270,9 @@ class JiraService < IssueTrackerService
url: url, url: url,
title: title, title: title,
status: status, status: status,
icon: { title: 'GitLab', url16x16: 'https://gitlab.com/favicon.ico' } icon: {
title: 'GitLab', url16x16: asset_url('favicon.ico', host: gitlab_config.url)
}
} }
} }
end end
......
...@@ -37,7 +37,7 @@ class MattermostSlashCommandsService < SlashCommandsService ...@@ -37,7 +37,7 @@ class MattermostSlashCommandsService < SlashCommandsService
private private
def command(params) def command(params)
pretty_project_name = project.name_with_namespace pretty_project_name = project.full_name
params.merge( params.merge(
auto_complete: true, auto_complete: true,
......
...@@ -88,10 +88,10 @@ class PushoverService < Service ...@@ -88,10 +88,10 @@ class PushoverService < Service
user: user_key, user: user_key,
device: device, device: device,
priority: priority, priority: priority,
title: "#{project.name_with_namespace}", title: "#{project.full_name}",
message: message, message: message,
url: data[:project][:web_url], url: data[:project][:web_url],
url_title: "See project #{project.name_with_namespace}" url_title: "See project #{project.full_name}"
} }
# Sound parameter MUST NOT be sent to API if not selected # Sound parameter MUST NOT be sent to API if not selected
......
...@@ -260,7 +260,7 @@ class Repository ...@@ -260,7 +260,7 @@ class Repository
# branches or tags, but we want to keep some of these commits around, for # branches or tags, but we want to keep some of these commits around, for
# example if they have comments or CI builds. # example if they have comments or CI builds.
def keep_around(sha) def keep_around(sha)
return unless sha && commit_by(oid: sha) return unless sha.present? && commit_by(oid: sha)
return if kept_around?(sha) return if kept_around?(sha)
......
...@@ -111,6 +111,7 @@ module MergeRequests ...@@ -111,6 +111,7 @@ module MergeRequests
private private
<<<<<<< HEAD
def reset_approvals(merge_request) def reset_approvals(merge_request)
target_project = merge_request.target_project target_project = merge_request.target_project
...@@ -119,6 +120,8 @@ module MergeRequests ...@@ -119,6 +120,8 @@ module MergeRequests
end end
end end
=======
>>>>>>> upstream/master
def create_branch_change_note(issuable, branch_type, old_branch, new_branch) def create_branch_change_note(issuable, branch_type, old_branch, new_branch)
SystemNoteService.change_branch( SystemNoteService.change_branch(
issuable, issuable.project, current_user, branch_type, issuable, issuable.project, current_user, branch_type,
......
...@@ -22,8 +22,8 @@ class SystemHooksService ...@@ -22,8 +22,8 @@ class SystemHooksService
def build_event_data(model, event) def build_event_data(model, event)
data = { data = {
event_name: build_event_name(model, event), event_name: build_event_name(model, event),
created_at: model.created_at.xmlschema, created_at: model.created_at&.xmlschema,
updated_at: model.updated_at.xmlschema updated_at: model.updated_at&.xmlschema
} }
case model case model
......
...@@ -190,7 +190,7 @@ ...@@ -190,7 +190,7 @@
%h4 Latest projects %h4 Latest projects
- @projects.each do |project| - @projects.each do |project|
%p %p
= link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated-60' = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated-60'
%span.light.pull-right %span.light.pull-right
#{time_ago_with_tooltip(project.created_at)} #{time_ago_with_tooltip(project.created_at)}
.col-md-4 .col-md-4
......
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
- @projects.each do |project| - @projects.each do |project|
%li %li
%strong %strong
= link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project]
%span.badge %span.badge
= storage_counter(project.statistics.storage_size) = storage_counter(project.statistics.storage_size)
%span.pull-right.light %span.pull-right.light
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
- @group.shared_projects.sort_by(&:name).each do |project| - @group.shared_projects.sort_by(&:name).each do |project|
%li %li
%strong %strong
= link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project]
%span.badge %span.badge
= storage_counter(project.statistics.storage_size) = storage_counter(project.statistics.storage_size)
%span.pull-right.light %span.pull-right.light
......
- add_to_breadcrumbs "Projects", admin_projects_path - add_to_breadcrumbs "Projects", admin_projects_path
- breadcrumb_title @project.name_with_namespace - breadcrumb_title @project.full_name
- page_title @project.name_with_namespace, "Projects" - page_title @project.full_name, "Projects"
%h3.page-title %h3.page-title
Project: #{@project.name_with_namespace} Project: #{@project.full_name}
= link_to edit_project_path(@project), class: "btn btn-nr pull-right" do = link_to edit_project_path(@project), class: "btn btn-nr pull-right" do
%i.fa.fa-pencil-square-o %i.fa.fa-pencil-square-o
Edit Edit
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
%tr.alert-info %tr.alert-info
%td %td
%strong %strong
= project.name_with_namespace = project.full_name
%td %td
.pull-right .pull-right
= link_to 'Disable', [:admin, project.namespace.becomes(Namespace), project, runner_project], method: :delete, class: 'btn btn-danger btn-xs' = link_to 'Disable', [:admin, project.namespace.becomes(Namespace), project, runner_project], method: :delete, class: 'btn btn-danger btn-xs'
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
- @projects.each do |project| - @projects.each do |project|
%tr %tr
%td %td
= project.name_with_namespace = project.full_name
%td %td
.pull-right .pull-right
= form_for [:admin, project.namespace.becomes(Namespace), project, project.runner_projects.new] do |f| = form_for [:admin, project.namespace.becomes(Namespace), project, project.runner_projects.new] do |f|
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
%td.status %td.status
- if project - if project
= project.name_with_namespace = project.full_name
%td.build-link %td.build-link
- if project - if project
......
...@@ -29,12 +29,12 @@ ...@@ -29,12 +29,12 @@
.panel.panel-default .panel.panel-default
.panel-heading Joined projects (#{@joined_projects.count}) .panel-heading Joined projects (#{@joined_projects.count})
%ul.well-list %ul.well-list
- @joined_projects.sort_by(&:name_with_namespace).each do |project| - @joined_projects.sort_by(&:full_name).each do |project|
- member = project.team.find_member(@user.id) - member = project.team.find_member(@user.id)
%li.project_member %li.project_member
.list-item-name .list-item-name
= link_to admin_project_path(project), class: dom_class(project) do = link_to admin_project_path(project), class: dom_class(project) do
= project.name_with_namespace = project.full_name
- if member - if member
.pull-right .pull-right
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
.list-item-name .list-item-name
%span{ class: visibility_level_color(project.visibility_level) } %span{ class: visibility_level_color(project.visibility_level) }
= visibility_level_icon(project.visibility_level) = visibility_level_icon(project.visibility_level)
%strong= link_to project.name_with_namespace, project %strong= link_to project.full_name, project
.pull-right .pull-right
- if project.archived - if project.archived
%span.label.label-warning archived %span.label.label-warning archived
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
- project = @member.source - project = @member.source
project project
%strong %strong
= link_to project.name_with_namespace, project_url(project) = link_to project.full_name, project_url(project)
- when Group - when Group
- group = @member.source - group = @member.source
group group
......
- project_meta = { id: @project.id, name: @project.name, namespace: @project.name_with_namespace, web_url: project_path(@project), avatar_url: @project.avatar_url } if @project&.persisted? - project_meta = { id: @project.id, name: @project.name, namespace: @project.full_name, web_url: project_path(@project), avatar_url: @project.avatar_url } if @project&.persisted?
.projects-dropdown-container .projects-dropdown-container
.project-dropdown-sidebar.qa-projects-dropdown-sidebar .project-dropdown-sidebar.qa-projects-dropdown-sidebar
%ul %ul
......
- page_title @project.name_with_namespace - page_title @project.full_name
- page_description @project.description unless page_description - page_description @project.description unless page_description
- header_title project_title(@project) unless header_title - header_title project_title(@project) unless header_title
- nav "project" - nav "project"
......
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
%p %p
The project export can be downloaded from: The project export can be downloaded from:
= link_to download_export_project_url(@project), rel: 'nofollow', download: '' do = link_to download_export_project_url(@project), rel: 'nofollow', download: '' do
= @project.name_with_namespace + " export" = @project.full_name + " export"
%p %p
The download link will expire in 24 hours. The download link will expire in 24 hours.
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%p %p
The project is now located under The project is now located under
= link_to project_url(@project) do = link_to project_url(@project) do
= @project.name_with_namespace = @project.full_name
%p %p
To update the remote url in your local repository run (for ssh): To update the remote url in your local repository run (for ssh):
%p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } %p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
%td %td
%strong %strong
- if can?(current_user, :read_project, project) - if can?(current_user, :read_project, project)
= link_to project.name_with_namespace, project_path(project) = link_to project.full_name, project_path(project)
- else - else
.light N/A .light N/A
%td %td
......
...@@ -12,7 +12,9 @@ ...@@ -12,7 +12,9 @@
Add an SSH key Add an SSH key
%p.profile-settings-content %p.profile-settings-content
Before you can add an SSH key you need to Before you can add an SSH key you need to
= link_to "generate it.", help_page_path("ssh/README") = link_to "generate one", help_page_path("ssh/README", anchor: 'generating-a-new-ssh-key-pair')
or use an
= link_to "existing key.", help_page_path("ssh/README", anchor: 'locating-an-existing-ssh-key-pair')
= render 'form' = render 'form'
%hr %hr
%h5 %h5
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
- deleted_message = s_('ForkedFromProjectPath|Forked from %{project_name} (deleted)') - deleted_message = s_('ForkedFromProjectPath|Forked from %{project_name} (deleted)')
= deleted_message % { project_name: fork_source_name(@project) } = deleted_message % { project_name: fork_source_name(@project) }
<<<<<<< HEAD
- if @project.mirror? - if @project.mirror?
- import_url = @project.safe_import_url - import_url = @project.safe_import_url
%p %p
...@@ -30,6 +31,8 @@ ...@@ -30,6 +31,8 @@
%br %br
= render "shared/mirror_status" = render "shared/mirror_status"
=======
>>>>>>> upstream/master
.project-badges .project-badges
- @project.badges.each do |badge| - @project.badges.each do |badge|
- badge_link_url = badge.rendered_link_url(@project) - badge_link_url = badge.rendered_link_url(@project)
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
- if admin - if admin
%td %td
- if job.project - if job.project
= link_to job.project.name_with_namespace, admin_project_path(job.project) = link_to job.project.full_name, admin_project_path(job.project)
%td %td
- if job.try(:runner) - if job.try(:runner)
= runner_link(job.runner) = runner_link(job.runner)
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
- if admin - if admin
%td %td
- if generic_commit_status.project - if generic_commit_status.project
= link_to generic_commit_status.project.name_with_namespace, admin_project_path(generic_commit_status.project) = link_to generic_commit_status.project.full_name, admin_project_path(generic_commit_status.project)
%td %td
- if generic_commit_status.try(:runner) - if generic_commit_status.try(:runner)
= runner_link(generic_commit_status.runner) = runner_link(generic_commit_status.runner)
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
- unless @issue.project.id == merge_request.target_project.id - unless @issue.project.id == merge_request.target_project.id
in in
- project = merge_request.target_project - project = merge_request.target_project
= link_to project.name_with_namespace, project_path(project) = link_to project.full_name, project_path(project)
- if merge_request.merged? - if merge_request.merged?
%span.merge-request-status.prepend-left-10.merged %span.merge-request-status.prepend-left-10.merged
......
...@@ -19,9 +19,12 @@ ...@@ -19,9 +19,12 @@
%p %p
= _('All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings.') = _('All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings.')
-# EE-specific start -# EE-specific start
<<<<<<< HEAD
- if ci_cd_projects_available? - if ci_cd_projects_available?
%p %p
= _('To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>.').html_safe = _('To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>.').html_safe
=======
>>>>>>> upstream/master
-# EE-specific end -# EE-specific end
.md .md
= brand_new_project_guidelines = brand_new_project_guidelines
...@@ -47,7 +50,10 @@ ...@@ -47,7 +50,10 @@
%span.hidden-xs Import project %span.hidden-xs Import project
%span.visible-xs Import %span.visible-xs Import
-# EE-specific start -# EE-specific start
<<<<<<< HEAD
= render 'new_ci_cd_only_project_tab', active_tab: active_tab = render 'new_ci_cd_only_project_tab', active_tab: active_tab
=======
>>>>>>> upstream/master
-# EE-specific end -# EE-specific end
.tab-content.gitlab-tab-content .tab-content.gitlab-tab-content
...@@ -116,7 +122,10 @@ ...@@ -116,7 +122,10 @@
-# EE-specific start -# EE-specific start
<<<<<<< HEAD
= render 'new_ci_cd_only_project_pane', active_tab: active_tab = render 'new_ci_cd_only_project_pane', active_tab: active_tab
=======
>>>>>>> upstream/master
-# EE-specific end -# EE-specific end
.save-project-loader.hide .save-project-loader.hide
......
- run_actions_text = "Perform common operations on GitLab project: #{@project.name_with_namespace}" - run_actions_text = "Perform common operations on GitLab project: #{@project.full_name}"
%p To setup this service: %p To setup this service:
%ul.list-unstyled.indent-list %ul.list-unstyled.indent-list
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
.form-group .form-group
= label_tag :display_name, 'Display name', class: 'col-sm-2 col-xs-12 control-label' = label_tag :display_name, 'Display name', class: 'col-sm-2 col-xs-12 control-label'
.col-sm-10.col-xs-12.input-group .col-sm-10.col-xs-12.input-group
= text_field_tag :display_name, "GitLab / #{@project.name_with_namespace}", class: 'form-control input-sm', readonly: 'readonly' = text_field_tag :display_name, "GitLab / #{@project.full_name}", class: 'form-control input-sm', readonly: 'readonly'
.input-group-btn .input-group-btn
= clipboard_button(target: '#display_name') = clipboard_button(target: '#display_name')
......
- pretty_name = defined?(@project) ? @project.name_with_namespace : 'namespace / path' - pretty_name = defined?(@project) ? @project.full_name : 'namespace / path'
- run_actions_text = "Perform common operations on GitLab project: #{pretty_name}" - run_actions_text = "Perform common operations on GitLab project: #{pretty_name}"
.well .well
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
%span.dropdown-toggle-text %span.dropdown-toggle-text
Project: Project:
- if @project.present? - if @project.present?
= @project.name_with_namespace = @project.full_name
- else - else
Any Any
= icon("chevron-down") = icon("chevron-down")
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
= search_entries_info(@search_objects, @scope, @search_term) = search_entries_info(@search_objects, @scope, @search_term)
- unless @show_snippets - unless @show_snippets
- if @project - if @project
in project #{link_to @project.name_with_namespace, [@project.namespace.becomes(Namespace), @project]} in project #{link_to @project.full_name, [@project.namespace.becomes(Namespace), @project]}
- elsif @group - elsif @group
in group #{link_to @group.name, @group} in group #{link_to @group.name, @group}
= render 'shared/promotions/promote_advanced_search' = render 'shared/promotions/promote_advanced_search'
......
...@@ -10,4 +10,4 @@ ...@@ -10,4 +10,4 @@
.description.term .description.term
= search_md_sanitize(issue, :description) = search_md_sanitize(issue, :description)
%span.light %span.light
#{issue.project.name_with_namespace} #{issue.project.full_name}
...@@ -11,4 +11,4 @@ ...@@ -11,4 +11,4 @@
.description.term .description.term
= search_md_sanitize(merge_request, :description) = search_md_sanitize(merge_request, :description)
%span.light %span.light
#{merge_request.project.name_with_namespace} #{merge_request.project.full_name}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
%i.fa.fa-comment %i.fa.fa-comment
= link_to_member(project, note.author, avatar: false) = link_to_member(project, note.author, avatar: false)
commented on commented on
= link_to project.name_with_namespace, project = link_to project.full_name, project
&middot; &middot;
- if note.for_commit? - if note.for_commit?
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
%small.pull-right.cgray %small.pull-right.cgray
- if snippet_title.project_id? - if snippet_title.project_id?
= link_to snippet_title.project.name_with_namespace, project_path(snippet_title.project) = link_to snippet_title.project.full_name, project_path(snippet_title.project)
.snippet-info .snippet-info
= snippet_title.to_reference = snippet_title.to_reference
......
- noteable = @sent_notification.noteable - noteable = @sent_notification.noteable
- noteable_type = @sent_notification.noteable_type.titleize.downcase - noteable_type = @sent_notification.noteable_type.titleize.downcase
- noteable_text = %(#{noteable.title} (#{noteable.to_reference})) - noteable_text = %(#{noteable.title} (#{noteable.to_reference}))
- page_title "Unsubscribe", noteable_text, noteable_type.pluralize, @sent_notification.project.name_with_namespace - page_title "Unsubscribe", noteable_text, noteable_type.pluralize, @sent_notification.project.full_name
%h3.page-title %h3.page-title
Unsubscribe from #{noteable_type} Unsubscribe from #{noteable_type}
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
%ul %ul
%li %li
= _('The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>.').html_safe = _('The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>.').html_safe
<<<<<<< HEAD
%li %li
= _('If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>.').html_safe = _('If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>.').html_safe
%li %li
...@@ -26,4 +27,14 @@ ...@@ -26,4 +27,14 @@
-# EE-specific start -# EE-specific start
= render 'shared/ee/import_form', f: f unless ci_cd_only = render 'shared/ee/import_form', f: f unless ci_cd_only
=======
%li
= _('If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>.').html_safe
%li
= import_will_timeout_message(ci_cd_only)
%li
= import_svn_message(ci_cd_only)
-# EE-specific start
>>>>>>> upstream/master
-# EE-specific end -# EE-specific end
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
- if show_project_name - if show_project_name
%strong #{project.name} &middot; %strong #{project.name} &middot;
- elsif show_full_project_name - elsif show_full_project_name
%strong #{project.name_with_namespace} &middot; %strong #{project.full_name} &middot;
- if issuable.is_a?(Issue) - if issuable.is_a?(Issue)
= confidential_icon(issuable) = confidential_icon(issuable)
= link_to issuable.title, issuable_url_args, title: issuable.title = link_to issuable.title, issuable_url_args, title: issuable.title
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
- milestone.milestones.each do |milestone| - milestone.milestones.each do |milestone|
= link_to milestone_path(milestone) do = link_to milestone_path(milestone) do
%span.label.label-gray %span.label.label-gray
= dashboard ? milestone.project.name_with_namespace : milestone.project.name = dashboard ? milestone.project.full_name : milestone.project.name
- if @group - if @group
.col-sm-6.milestone-actions .col-sm-6.milestone-actions
- if can?(current_user, :admin_milestones, @group) - if can?(current_user, :admin_milestones, @group)
......
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
- milestone.milestones.each do |ms| - milestone.milestones.each do |ms|
%tr %tr
%td %td
- project_name = group ? ms.project.name : ms.project.name_with_namespace - project_name = group ? ms.project.name : ms.project.full_name
= link_to project_name, project_milestone_path(ms.project, ms) = link_to project_name, project_milestone_path(ms.project, ms)
%td %td
= ms.issues_visible_to_user(current_user).opened.count = ms.issues_visible_to_user(current_user).opened.count
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
%span.hidden-xs %span.hidden-xs
in in
= link_to project_path(snippet.project) do = link_to project_path(snippet.project) do
= snippet.project.name_with_namespace = snippet.project.full_name
.pull-right.snippet-updated-at .pull-right.snippet-updated-at
%span updated #{time_ago_with_tooltip(snippet.updated_at, placement: 'bottom')} %span updated #{time_ago_with_tooltip(snippet.updated_at, placement: 'bottom')}
...@@ -22,7 +22,7 @@ module Gitlab ...@@ -22,7 +22,7 @@ module Gitlab
importer_class.new(object, project, client).execute importer_class.new(object, project, client).execute
counter.increment(project: project.path_with_namespace) counter.increment(project: project.full_path)
end end
def counter def counter
......
...@@ -44,6 +44,10 @@ class GitGarbageCollectWorker ...@@ -44,6 +44,10 @@ class GitGarbageCollectWorker
# Refresh the branch cache in case garbage collection caused a ref lookup to fail # Refresh the branch cache in case garbage collection caused a ref lookup to fail
flush_ref_caches(project) if task == :gc flush_ref_caches(project) if task == :gc
# In case pack files are deleted, release libgit2 cache and open file
# descriptors ASAP instead of waiting for Ruby garbage collection
project.cleanup
ensure ensure
cancel_lease(lease_key, lease_uuid) if lease_key.present? && lease_uuid.present? cancel_lease(lease_key, lease_uuid) if lease_key.present? && lease_uuid.present?
end end
......
...@@ -16,7 +16,7 @@ module Gitlab ...@@ -16,7 +16,7 @@ module Gitlab
def report_import_time(project) def report_import_time(project)
duration = Time.zone.now - project.created_at duration = Time.zone.now - project.created_at
path = project.path_with_namespace path = project.full_path
histogram.observe({ project: path }, duration) histogram.observe({ project: path }, duration)
counter.increment counter.increment
......
...@@ -30,10 +30,9 @@ class ProcessCommitWorker ...@@ -30,10 +30,9 @@ class ProcessCommitWorker
end end
def process_commit_message(project, commit, user, author, default = false) def process_commit_message(project, commit, user, author, default = false)
# this is a GitLab generated commit message, ignore it. # Ignore closing references from GitLab-generated commit messages.
return if commit.merged_merge_request?(user) find_closing_issues = default && !commit.merged_merge_request?(user)
closed_issues = find_closing_issues ? commit.closes_issues(user) : []
closed_issues = default ? commit.closes_issues(user) : []
close_issues(project, user, author, commit, closed_issues) if closed_issues.any? close_issues(project, user, author, commit, closed_issues) if closed_issues.any?
commit.create_cross_references!(author, closed_issues) commit.create_cross_references!(author, closed_issues)
......
---
title: Adds updated_at filter to issues and merge_requests API
merge_request: 17417
author: Jacopo Beschi @jacopo-beschi
type: added
---
title: Render htmlentities correctly for links not supported by Rinku
merge_request:
author:
type: fixed
---
title: Add search param to Branches API
merge_request: 17005
author: bunufi
type: added
---
title: Update SSH key link to include existing keys
merge_request:
author: Brendan O'Leary
type: changed
---
title: Stop loading spinner on error of milestone update on issue
merge_request: 17507
author: Takuya Noguchi
type: fixed
---
title: Upgrade Workhorse to version 3.8.0 to support structured logging
merge_request:
author:
type: other
---
title: Count comments on diffs as contributions for the contributions calendar
merge_request: 17418
author: Riccardo Padovani
type: fixed
---
title: Use host URL to build JIRA remote link icon
merge_request:
author:
type: other
---
title: Port Labels Select dropdown to Vue
merge_request: 17411
author:
type: other
---
title: Make oauth provider login generic
merge_request: 8809
author: Horatiu Eugen Vlad
\ No newline at end of file
---
title: Release libgit2 cache and open file descriptors after `git gc` run
merge_request:
author:
type: fixed
---
title: Don't error out in system hook if user has `nil` datetime columns
merge_request:
author:
type: fixed
<<<<<<< HEAD
--- ---
=======
>>>>>>> upstream/master
title: Port /wip quick action command to Merge Request creation (on description) title: Port /wip quick action command to Merge Request creation (on description)
merge_request: 17463 merge_request: 17463
author: Adam Pahlevi author: Adam Pahlevi
......
...@@ -23,5 +23,6 @@ warmup do |app| ...@@ -23,5 +23,6 @@ warmup do |app|
end end
map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do
use Gitlab::Middleware::ReleaseEnv
run Gitlab::Application run Gitlab::Application
end end
class CleanCommitsCountMigration < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
Gitlab::BackgroundMigration.steal('AddMergeRequestDiffCommitsCount')
end
def down
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180301084653) do ActiveRecord::Schema.define(version: 20180304204842) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
...@@ -254,6 +254,7 @@ ActiveRecord::Schema.define(version: 20180301084653) do ...@@ -254,6 +254,7 @@ ActiveRecord::Schema.define(version: 20180301084653) do
add_index "badges", ["group_id"], name: "index_badges_on_group_id", using: :btree add_index "badges", ["group_id"], name: "index_badges_on_group_id", using: :btree
add_index "badges", ["project_id"], name: "index_badges_on_project_id", using: :btree add_index "badges", ["project_id"], name: "index_badges_on_project_id", using: :btree
<<<<<<< HEAD
create_table "board_assignees", force: :cascade do |t| create_table "board_assignees", force: :cascade do |t|
t.integer "board_id", null: false t.integer "board_id", null: false
t.integer "assignee_id", null: false t.integer "assignee_id", null: false
...@@ -268,6 +269,8 @@ ActiveRecord::Schema.define(version: 20180301084653) do ...@@ -268,6 +269,8 @@ ActiveRecord::Schema.define(version: 20180301084653) do
add_index "board_labels", ["board_id", "label_id"], name: "index_board_labels_on_board_id_and_label_id", unique: true, using: :btree add_index "board_labels", ["board_id", "label_id"], name: "index_board_labels_on_board_id_and_label_id", unique: true, using: :btree
=======
>>>>>>> upstream/master
create_table "boards", force: :cascade do |t| create_table "boards", force: :cascade do |t|
t.integer "project_id" t.integer "project_id"
t.datetime "created_at", null: false t.datetime "created_at", null: false
...@@ -2512,6 +2515,7 @@ ActiveRecord::Schema.define(version: 20180301084653) do ...@@ -2512,6 +2515,7 @@ ActiveRecord::Schema.define(version: 20180301084653) do
add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree
add_index "web_hooks", ["type"], name: "index_web_hooks_on_type", using: :btree add_index "web_hooks", ["type"], name: "index_web_hooks_on_type", using: :btree
<<<<<<< HEAD
add_foreign_key "approvals", "merge_requests", name: "fk_310d714958", on_delete: :cascade add_foreign_key "approvals", "merge_requests", name: "fk_310d714958", on_delete: :cascade
add_foreign_key "approver_groups", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "approver_groups", "namespaces", column: "group_id", on_delete: :cascade
add_foreign_key "badges", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "badges", "namespaces", column: "group_id", on_delete: :cascade
...@@ -2521,6 +2525,10 @@ ActiveRecord::Schema.define(version: 20180301084653) do ...@@ -2521,6 +2525,10 @@ ActiveRecord::Schema.define(version: 20180301084653) do
add_foreign_key "board_labels", "boards", on_delete: :cascade add_foreign_key "board_labels", "boards", on_delete: :cascade
add_foreign_key "board_labels", "labels", on_delete: :cascade add_foreign_key "board_labels", "labels", on_delete: :cascade
add_foreign_key "boards", "namespaces", column: "group_id", name: "fk_1e9a074a35", on_delete: :cascade add_foreign_key "boards", "namespaces", column: "group_id", name: "fk_1e9a074a35", on_delete: :cascade
=======
add_foreign_key "badges", "namespaces", column: "group_id", on_delete: :cascade
add_foreign_key "badges", "projects", on_delete: :cascade
>>>>>>> upstream/master
add_foreign_key "boards", "projects", name: "fk_f15266b5f9", on_delete: :cascade add_foreign_key "boards", "projects", name: "fk_f15266b5f9", on_delete: :cascade
add_foreign_key "chat_teams", "namespaces", on_delete: :cascade add_foreign_key "chat_teams", "namespaces", on_delete: :cascade
add_foreign_key "ci_build_trace_section_names", "projects", on_delete: :cascade add_foreign_key "ci_build_trace_section_names", "projects", on_delete: :cascade
......
...@@ -13,6 +13,7 @@ GET /projects/:id/repository/branches ...@@ -13,6 +13,7 @@ GET /projects/:id/repository/branches
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
| `search` | string | no | Return list of branches matching the search criteria. |
```bash ```bash
curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/5/repository/branches curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/5/repository/branches
......
...@@ -46,6 +46,10 @@ GET /issues?my_reaction_emoji=star ...@@ -46,6 +46,10 @@ GET /issues?my_reaction_emoji=star
| `order_by` | string | no | Return issues ordered by `created_at` or `updated_at` fields. Default is `created_at` | | `order_by` | string | no | Return issues ordered by `created_at` or `updated_at` fields. Default is `created_at` |
| `sort` | string | no | Return issues sorted in `asc` or `desc` order. Default is `desc` | | `sort` | string | no | Return issues sorted in `asc` or `desc` order. Default is `desc` |
| `search` | string | no | Search issues against their `title` and `description` | | `search` | string | no | Search issues against their `title` and `description` |
| `created_after` | datetime | no | Return issues created on or after the given time |
| `created_before` | datetime | no | Return issues created on or before the given time |
| `updated_after` | datetime | no | Return issues updated on or after the given time |
| `updated_before` | datetime | no | Return issues updated on or before the given time |
```bash ```bash
curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/issues curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/issues
...@@ -153,6 +157,10 @@ GET /groups/:id/issues?my_reaction_emoji=star ...@@ -153,6 +157,10 @@ GET /groups/:id/issues?my_reaction_emoji=star
| `order_by` | string | no | Return issues ordered by `created_at` or `updated_at` fields. Default is `created_at` | | `order_by` | string | no | Return issues ordered by `created_at` or `updated_at` fields. Default is `created_at` |
| `sort` | string | no | Return issues sorted in `asc` or `desc` order. Default is `desc` | | `sort` | string | no | Return issues sorted in `asc` or `desc` order. Default is `desc` |
| `search` | string | no | Search group issues against their `title` and `description` | | `search` | string | no | Search group issues against their `title` and `description` |
| `created_after` | datetime | no | Return issues created on or after the given time |
| `created_before` | datetime | no | Return issues created on or before the given time |
| `updated_after` | datetime | no | Return issues updated on or after the given time |
| `updated_before` | datetime | no | Return issues updated on or before the given time |
```bash ```bash
...@@ -261,8 +269,10 @@ GET /projects/:id/issues?my_reaction_emoji=star ...@@ -261,8 +269,10 @@ GET /projects/:id/issues?my_reaction_emoji=star
| `order_by` | string | no | Return issues ordered by `created_at` or `updated_at` fields. Default is `created_at` | | `order_by` | string | no | Return issues ordered by `created_at` or `updated_at` fields. Default is `created_at` |
| `sort` | string | no | Return issues sorted in `asc` or `desc` order. Default is `desc` | | `sort` | string | no | Return issues sorted in `asc` or `desc` order. Default is `desc` |
| `search` | string | no | Search project issues against their `title` and `description` | | `search` | string | no | Search project issues against their `title` and `description` |
| `created_after` | datetime | no | Return issues created after the given time (inclusive) | | `created_after` | datetime | no | Return issues created on or after the given time |
| `created_before` | datetime | no | Return issues created before the given time (inclusive) | | `created_before` | datetime | no | Return issues created on or before the given time |
| `updated_after` | datetime | no | Return issues updated on or after the given time |
| `updated_before` | datetime | no | Return issues updated on or before the given time |
```bash ```bash
curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/4/issues curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/4/issues
......
...@@ -41,8 +41,10 @@ Parameters: ...@@ -41,8 +41,10 @@ Parameters:
| `milestone` | string | no | Return merge requests for a specific milestone | | `milestone` | string | no | Return merge requests for a specific milestone |
| `view` | string | no | If `simple`, returns the `iid`, URL, title, description, and basic state of merge request | | `view` | string | no | If `simple`, returns the `iid`, URL, title, description, and basic state of merge request |
| `labels` | string | no | Return merge requests matching a comma separated list of labels | | `labels` | string | no | Return merge requests matching a comma separated list of labels |
| `created_after` | datetime | no | Return merge requests created after the given time (inclusive) | | `created_after` | datetime | no | Return merge requests created on or after the given time |
| `created_before` | datetime | no | Return merge requests created before the given time (inclusive) | | `created_before` | datetime | no | Return merge requests created on or before the given time |
| `updated_after` | datetime | no | Return merge requests updated on or after the given time |
| `updated_before` | datetime | no | Return merge requests updated on or before the given time |
| `scope` | string | no | Return merge requests for the given scope: `created-by-me`, `assigned-to-me` or `all`. Defaults to `created-by-me` | | `scope` | string | no | Return merge requests for the given scope: `created-by-me`, `assigned-to-me` or `all`. Defaults to `created-by-me` |
| `author_id` | integer | no | Returns merge requests created by the given user `id`. Combine with `scope=all` or `scope=assigned-to-me` | | `author_id` | integer | no | Returns merge requests created by the given user `id`. Combine with `scope=all` or `scope=assigned-to-me` |
| `assignee_id` | integer | no | Returns merge requests assigned to the given user `id` | | `assignee_id` | integer | no | Returns merge requests assigned to the given user `id` |
...@@ -158,8 +160,10 @@ Parameters: ...@@ -158,8 +160,10 @@ Parameters:
| `milestone` | string | no | Return merge requests for a specific milestone | | `milestone` | string | no | Return merge requests for a specific milestone |
| `view` | string | no | If `simple`, returns the `iid`, URL, title, description, and basic state of merge request | | `view` | string | no | If `simple`, returns the `iid`, URL, title, description, and basic state of merge request |
| `labels` | string | no | Return merge requests matching a comma separated list of labels | | `labels` | string | no | Return merge requests matching a comma separated list of labels |
| `created_after` | datetime | no | Return merge requests created after the given time (inclusive) | | `created_after` | datetime | no | Return merge requests created on or after the given time |
| `created_before` | datetime | no | Return merge requests created before the given time (inclusive) | | `created_before` | datetime | no | Return merge requests created on or before the given time |
| `updated_after` | datetime | no | Return merge requests updated on or after the given time |
| `updated_before` | datetime | no | Return merge requests updated on or before the given time |
| `scope` | string | no | Return merge requests for the given scope: `created-by-me`, `assigned-to-me` or `all` _([Introduced][ce-13060] in GitLab 9.5)_ | | `scope` | string | no | Return merge requests for the given scope: `created-by-me`, `assigned-to-me` or `all` _([Introduced][ce-13060] in GitLab 9.5)_ |
| `author_id` | integer | no | Returns merge requests created by the given user `id` _([Introduced][ce-13060] in GitLab 9.5)_ | | `author_id` | integer | no | Returns merge requests created by the given user `id` _([Introduced][ce-13060] in GitLab 9.5)_ |
| `assignee_id` | integer | no | Returns merge requests assigned to the given user `id` _([Introduced][ce-13060] in GitLab 9.5)_ | | `assignee_id` | integer | no | Returns merge requests assigned to the given user `id` _([Introduced][ce-13060] in GitLab 9.5)_ |
......
...@@ -1439,6 +1439,7 @@ Read more in the [Project import/export](project_import_export.md) documentation ...@@ -1439,6 +1439,7 @@ Read more in the [Project import/export](project_import_export.md) documentation
Read more in the [Project members](members.md) documentation. Read more in the [Project members](members.md) documentation.
<<<<<<< HEAD
## Start the pull mirroring process for a Project ## Start the pull mirroring process for a Project
> Introduced in GitLab 10.3. **Note:** Available in [GitLab Starter](https://about.gitlab.com/products). > Introduced in GitLab 10.3. **Note:** Available in [GitLab Starter](https://about.gitlab.com/products).
...@@ -1451,6 +1452,8 @@ POST /projects/:id/mirror/pull ...@@ -1451,6 +1452,8 @@ POST /projects/:id/mirror/pull
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
=======
>>>>>>> upstream/master
## Project badges ## Project badges
Read more in the [Project Badges](project_badges.md) documentation. Read more in the [Project Badges](project_badges.md) documentation.
...@@ -10,6 +10,7 @@ You can import your existing repositories by providing the Git URL: ...@@ -10,6 +10,7 @@ You can import your existing repositories by providing the Git URL:
1. Once complete, you will be redirected to your newly created project 1. Once complete, you will be redirected to your newly created project
![Import project by repo URL](img/import_projects_from_repo_url.png) ![Import project by repo URL](img/import_projects_from_repo_url.png)
<<<<<<< HEAD
## CI/CD for external repositories ## CI/CD for external repositories
...@@ -28,3 +29,5 @@ but [can be re-enabled later on](../settings/index.md#sharing-and-permissions). ...@@ -28,3 +29,5 @@ but [can be re-enabled later on](../settings/index.md#sharing-and-permissions).
[ee-4642]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/4642 [ee-4642]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/4642
[eep]: https://about.gitlab.com/products/ [eep]: https://about.gitlab.com/products/
=======
>>>>>>> upstream/master
...@@ -31,7 +31,8 @@ with all their related data and be moved into a new GitLab instance. ...@@ -31,7 +31,8 @@ with all their related data and be moved into a new GitLab instance.
| GitLab version | Import/Export version | | GitLab version | Import/Export version |
| ---------------- | --------------------- | | ---------------- | --------------------- |
| 10.4 to current | 0.2.2 | | 10.6 to current | 0.2.3 |
| 10.4 | 0.2.2 |
| 10.3 | 0.2.1 | | 10.3 | 0.2.1 |
| 10.0 | 0.2.0 | | 10.0 | 0.2.0 |
| 9.4.0 | 0.1.8 | | 9.4.0 | 0.1.8 |
......
...@@ -16,6 +16,10 @@ module API ...@@ -16,6 +16,10 @@ module API
render_api_error!('The branch refname is invalid', 400) render_api_error!('The branch refname is invalid', 400)
end end
end end
params :filter_params do
optional :search, type: String, desc: 'Return list of branches matching the search criteria'
end
end end
params do params do
...@@ -27,15 +31,23 @@ module API ...@@ -27,15 +31,23 @@ module API
end end
params do params do
use :pagination use :pagination
use :filter_params
end end
get ':id/repository/branches' do get ':id/repository/branches' do
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42329') Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42329')
repository = user_project.repository repository = user_project.repository
branches = ::Kaminari.paginate_array(repository.branches.sort_by(&:name))
branches = BranchesFinder.new(repository, declared_params(include_missing: false)).execute
merged_branch_names = repository.merged_branch_names(branches.map(&:name)) merged_branch_names = repository.merged_branch_names(branches.map(&:name))
present paginate(branches), with: Entities::Branch, project: user_project, merged_branch_names: merged_branch_names present(
paginate(::Kaminari.paginate_array(branches)),
with: Entities::Branch,
project: user_project,
merged_branch_names: merged_branch_names
)
end end
resource ':id/repository/branches/:branch', requirements: BRANCH_ENDPOINT_REQUIREMENTS do resource ':id/repository/branches/:branch', requirements: BRANCH_ENDPOINT_REQUIREMENTS do
......
...@@ -1255,6 +1255,7 @@ module API ...@@ -1255,6 +1255,7 @@ module API
badge.type == 'ProjectBadge' ? 'project' : 'group' badge.type == 'ProjectBadge' ? 'project' : 'group'
end end
end end
<<<<<<< HEAD
def self.prepend_entity(klass, with: nil) def self.prepend_entity(klass, with: nil)
if with.nil? if with.nil?
...@@ -1264,6 +1265,8 @@ module API ...@@ -1264,6 +1265,8 @@ module API
klass.descendants.each { |descendant| descendant.prepend(with) } klass.descendants.each { |descendant| descendant.prepend(with) }
klass.prepend(with) klass.prepend(with)
end end
=======
>>>>>>> upstream/master
end end
end end
......
...@@ -32,6 +32,8 @@ module API ...@@ -32,6 +32,8 @@ module API
optional :search, type: String, desc: 'Search issues for text present in the title or description' optional :search, type: String, desc: 'Search issues for text present in the title or description'
optional :created_after, type: DateTime, desc: 'Return issues created after the specified time' optional :created_after, type: DateTime, desc: 'Return issues created after the specified time'
optional :created_before, type: DateTime, desc: 'Return issues created before the specified time' optional :created_before, type: DateTime, desc: 'Return issues created before the specified time'
optional :updated_after, type: DateTime, desc: 'Return issues updated after the specified time'
optional :updated_before, type: DateTime, desc: 'Return issues updated before the specified time'
optional :author_id, type: Integer, desc: 'Return issues which are authored by the user with the given ID' optional :author_id, type: Integer, desc: 'Return issues which are authored by the user with the given ID'
optional :assignee_id, type: Integer, desc: 'Return issues which are assigned to the user with the given ID' optional :assignee_id, type: Integer, desc: 'Return issues which are assigned to the user with the given ID'
optional :scope, type: String, values: %w[created-by-me assigned-to-me all], optional :scope, type: String, values: %w[created-by-me assigned-to-me all],
......
...@@ -42,6 +42,8 @@ module API ...@@ -42,6 +42,8 @@ module API
optional :labels, type: String, desc: 'Comma-separated list of label names' optional :labels, type: String, desc: 'Comma-separated list of label names'
optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time' optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time'
optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time' optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time'
optional :updated_after, type: DateTime, desc: 'Return merge requests updated after the specified time'
optional :updated_before, type: DateTime, desc: 'Return merge requests updated before the specified time'
optional :view, type: String, values: %w[simple], desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request' optional :view, type: String, values: %w[simple], desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request'
optional :author_id, type: Integer, desc: 'Return merge requests which are authored by the user with the given ID' optional :author_id, type: Integer, desc: 'Return merge requests which are authored by the user with the given ID'
optional :assignee_id, type: Integer, desc: 'Return merge requests which are assigned to the user with the given ID' optional :assignee_id, type: Integer, desc: 'Return merge requests which are assigned to the user with the given ID'
......
...@@ -25,8 +25,8 @@ module Banzai ...@@ -25,8 +25,8 @@ module Banzai
# period or comma for punctuation without those characters being included # period or comma for punctuation without those characters being included
# in the generated link. # in the generated link.
# #
# Rubular: http://rubular.com/r/cxjPyZc7Sb # Rubular: http://rubular.com/r/JzPhi6DCZp
LINK_PATTERN = %r{([a-z][a-z0-9\+\.-]+://\S+)(?<!,|\.)} LINK_PATTERN = %r{([a-z][a-z0-9\+\.-]+://[^\s>]+)(?<!,|\.)}
# Text matching LINK_PATTERN inside these elements will not be linked # Text matching LINK_PATTERN inside these elements will not be linked
IGNORE_PARENTS = %w(a code kbd pre script style).to_set IGNORE_PARENTS = %w(a code kbd pre script style).to_set
...@@ -35,53 +35,19 @@ module Banzai ...@@ -35,53 +35,19 @@ module Banzai
TEXT_QUERY = %Q(descendant-or-self::text()[ TEXT_QUERY = %Q(descendant-or-self::text()[
not(#{IGNORE_PARENTS.map { |p| "ancestor::#{p}" }.join(' or ')}) not(#{IGNORE_PARENTS.map { |p| "ancestor::#{p}" }.join(' or ')})
and contains(., '://') and contains(., '://')
and not(starts-with(., 'http'))
and not(starts-with(., 'ftp'))
]).freeze ]).freeze
PUNCTUATION_PAIRS = {
"'" => "'",
'"' => '"',
')' => '(',
']' => '[',
'}' => '{'
}.freeze
def call def call
return doc if context[:autolink] == false return doc if context[:autolink] == false
rinku_parse
text_parse
end
private
# Run the text through Rinku as a first pass
#
# This will quickly autolink http(s) and ftp links.
#
# `@doc` will be re-parsed with the HTML String from Rinku.
def rinku_parse
# Convert the options from a Hash to a String that Rinku expects
options = tag_options(link_options)
# NOTE: We don't parse email links because it will erroneously match
# external Commit and CommitRange references.
#
# The final argument tells Rinku to link short URLs that don't include a
# period (e.g., http://localhost:3000/)
rinku = Rinku.auto_link(html, :urls, options, IGNORE_PARENTS.to_a, 1)
return if rinku == html
# Rinku returns a String, so parse it back to a Nokogiri::XML::Document
# for further processing.
@doc = parse_html(rinku)
end
# Return true if any of the UNSAFE_PROTOCOLS strings are included in the URI scheme
def contains_unsafe?(scheme)
return false unless scheme
scheme = scheme.strip.downcase
Banzai::Filter::SanitizationFilter::UNSAFE_PROTOCOLS.any? { |protocol| scheme.include?(protocol) }
end
# Autolinks any text matching LINK_PATTERN that Rinku didn't already
# replace
def text_parse
doc.xpath(TEXT_QUERY).each do |node| doc.xpath(TEXT_QUERY).each do |node|
content = node.to_html content = node.to_html
...@@ -97,6 +63,16 @@ module Banzai ...@@ -97,6 +63,16 @@ module Banzai
doc doc
end end
private
# Return true if any of the UNSAFE_PROTOCOLS strings are included in the URI scheme
def contains_unsafe?(scheme)
return false unless scheme
scheme = scheme.strip.downcase
Banzai::Filter::SanitizationFilter::UNSAFE_PROTOCOLS.any? { |protocol| scheme.include?(protocol) }
end
def autolink_match(match) def autolink_match(match)
# start by stripping out dangerous links # start by stripping out dangerous links
begin begin
...@@ -112,12 +88,30 @@ module Banzai ...@@ -112,12 +88,30 @@ module Banzai
match.gsub!(/((?:&[\w#]+;)+)\z/, '') match.gsub!(/((?:&[\w#]+;)+)\z/, '')
dropped = ($1 || '').html_safe dropped = ($1 || '').html_safe
# To match the behaviour of Rinku, if the matched link ends with a
# closing part of a matched pair of punctuation, we remove that trailing
# character unless there are an equal number of closing and opening
# characters in the link.
if match.end_with?(*PUNCTUATION_PAIRS.keys)
close_character = match[-1]
close_count = match.count(close_character)
open_character = PUNCTUATION_PAIRS[close_character]
open_count = match.count(open_character)
if open_count != close_count || open_character == close_character
dropped += close_character
match = match[0..-2]
end
end
options = link_options.merge(href: match) options = link_options.merge(href: match)
content_tag(:a, match, options) + dropped content_tag(:a, match.html_safe, options) + dropped
end end
def autolink_filter(text) def autolink_filter(text)
text.gsub(LINK_PATTERN) { |match| autolink_match(match) } Gitlab::StringRegexMarker.new(CGI.unescapeHTML(text), text.html_safe).mark(LINK_PATTERN) do |link, left:, right:|
autolink_match(link)
end
end end
def link_options def link_options
......
...@@ -42,8 +42,8 @@ module Gitlab ...@@ -42,8 +42,8 @@ module Gitlab
end end
def find_with_user_password(login, password) def find_with_user_password(login, password)
# Avoid resource intensive login checks if password is not provided # Avoid resource intensive checks if login credentials are not provided
return unless password.present? return unless login.present? && password.present?
# Nothing to do here if internal auth is disabled and LDAP is # Nothing to do here if internal auth is disabled and LDAP is
# not configured # not configured
...@@ -52,14 +52,26 @@ module Gitlab ...@@ -52,14 +52,26 @@ module Gitlab
Gitlab::Auth::UniqueIpsLimiter.limit_user! do Gitlab::Auth::UniqueIpsLimiter.limit_user! do
user = User.by_login(login) user = User.by_login(login)
# If no user is found, or it's an LDAP server, try LDAP. return if user && !user.active?
# LDAP users are only authenticated via LDAP
if user.nil? || user.ldap_user? authenticators = []
# Second chance - try LDAP authentication
Gitlab::Auth::LDAP::Authentication.login(login, password) if user
elsif Gitlab::CurrentSettings.password_authentication_enabled_for_git? authenticators << Gitlab::Auth::OAuth::Provider.authentication(user, 'database')
user if user.active? && user.valid_password?(password)
# Add authenticators for all identities if user is not nil
user&.identities&.each do |identity|
authenticators << Gitlab::Auth::OAuth::Provider.authentication(user, identity.provider)
end
else
# If no user is provided, try LDAP.
# LDAP users are only authenticated via LDAP
authenticators << Gitlab::Auth::LDAP::Authentication
end end
authenticators.compact!
user if authenticators.find { |auth| auth.login(login, password) }
end end
end end
......
# These calls help to authenticate to OAuth provider by providing username and password
#
module Gitlab
module Auth
module Database
class Authentication < Gitlab::Auth::OAuth::Authentication
def login(login, password)
return false unless Gitlab::CurrentSettings.password_authentication_enabled_for_git?
user&.valid_password?(password)
end
end
end
end
end
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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