summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-04-01 06:07:50 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-04-01 06:07:50 +0000
commite50050a8756a20b6aa118edbad3369674e4c63ba (patch)
tree0f9ae83c168b01707753e066294f7b55aa0968a5 /app
parent1dffba3bd853076efc1107b2dd63e221e75a210c (diff)
downloadgitlab-ce-e50050a8756a20b6aa118edbad3369674e4c63ba.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/stylesheets/pages/tree.scss1
-rw-r--r--app/helpers/nav_helper.rb4
-rw-r--r--app/helpers/system_note_helper.rb3
-rw-r--r--app/services/merge_requests/merge_service.rb3
-rw-r--r--app/services/merge_requests/post_merge_service.rb23
-rw-r--r--app/services/merge_requests/squash_service.rb14
-rw-r--r--app/views/layouts/header/_default.html.haml3
7 files changed, 34 insertions, 17 deletions
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index 2ec3454630b..a03101c66ac 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -120,6 +120,7 @@
&:hover:not(.tree-truncated-warning) {
td {
background-color: $blue-50;
+ background-clip: padding-box;
border-top: 1px solid $blue-200;
border-bottom: 1px solid $blue-200;
cursor: pointer;
diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb
index 7d48efcff01..6013475acb1 100644
--- a/app/helpers/nav_helper.rb
+++ b/app/helpers/nav_helper.rb
@@ -65,10 +65,6 @@ module NavHelper
%w(groups#issues labels#index milestones#index boards#index boards#show)
end
- def show_user_notification_dot?
- experiment_enabled?(:ci_notification_dot)
- end
-
private
def get_header_links
diff --git a/app/helpers/system_note_helper.rb b/app/helpers/system_note_helper.rb
index 6702a805cb7..d3b6ecf2bd7 100644
--- a/app/helpers/system_note_helper.rb
+++ b/app/helpers/system_note_helper.rb
@@ -26,7 +26,8 @@ module SystemNoteHelper
'duplicate' => 'duplicate',
'locked' => 'lock',
'unlocked' => 'lock-open',
- 'due_date' => 'calendar'
+ 'due_date' => 'calendar',
+ 'health_status' => 'status-health'
}.freeze
def system_note_icon_name(note)
diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb
index 31097b9151a..3405ea389f8 100644
--- a/app/services/merge_requests/merge_service.rb
+++ b/app/services/merge_requests/merge_service.rb
@@ -27,6 +27,7 @@ module MergeRequests
success
end
end
+
log_info("Merge process finished on JID #{merge_jid} with state #{state}")
rescue MergeError => e
handle_merge_error(log_message: e.message, save_message_on_model: true)
@@ -54,7 +55,7 @@ module MergeRequests
error =
if @merge_request.should_be_rebased?
'Only fast-forward merge is allowed for your project. Please update your source branch'
- elsif !@merge_request.mergeable?
+ elsif !@merge_request.merged? && !@merge_request.mergeable?
'Merge request is not mergeable'
end
diff --git a/app/services/merge_requests/post_merge_service.rb b/app/services/merge_requests/post_merge_service.rb
index 0364c0dd479..a3d7f623546 100644
--- a/app/services/merge_requests/post_merge_service.rb
+++ b/app/services/merge_requests/post_merge_service.rb
@@ -8,17 +8,28 @@ module MergeRequests
#
class PostMergeService < MergeRequests::BaseService
def execute(merge_request)
- merge_request.mark_as_merged
- close_issues(merge_request)
- todo_service.merge_merge_request(merge_request, current_user)
- create_event(merge_request)
- create_note(merge_request)
+ # These operations need to happen transactionally
+ ActiveRecord::Base.transaction(requires_new: true) do
+ merge_request.mark_as_merged
+
+ # These options do not call external services and should be
+ # relatively quick enough to put in a Transaction
+ create_event(merge_request)
+ todo_service.merge_merge_request(merge_request, current_user)
+ end
+
+ # These operations are idempotent so can be safely run multiple times
notification_service.merge_mr(merge_request, current_user)
- execute_hooks(merge_request, 'merge')
+ create_note(merge_request)
+ close_issues(merge_request)
invalidate_cache_counts(merge_request, users: merge_request.assignees)
merge_request.update_project_counter_caches
delete_non_latest_diffs(merge_request)
cleanup_environments(merge_request)
+
+ # Anything after this point will be executed at-most-once. Less important activity only
+ # TODO: make all the work in here a separate sidekiq job so it can go in the transaction
+ execute_hooks(merge_request, 'merge')
end
private
diff --git a/app/services/merge_requests/squash_service.rb b/app/services/merge_requests/squash_service.rb
index d25997c925e..09d867f39ae 100644
--- a/app/services/merge_requests/squash_service.rb
+++ b/app/services/merge_requests/squash_service.rb
@@ -4,12 +4,14 @@ module MergeRequests
class SquashService < MergeRequests::BaseService
include Git::Logger
+ def idempotent?
+ true
+ end
+
def execute
# If performing a squash would result in no change, then
# immediately return a success message without performing a squash
- if merge_request.commits_count < 2 && message.nil?
- return success(squash_sha: merge_request.diff_head_sha)
- end
+ return success(squash_sha: merge_request.diff_head_sha) if squash_redundant?
if merge_request.squash_in_progress?
return error(s_('MergeRequests|Squash task canceled: another squash is already in progress.'))
@@ -20,6 +22,12 @@ module MergeRequests
private
+ def squash_redundant?
+ return true if merge_request.merged?
+
+ merge_request.commits_count < 2 && message.nil?
+ end
+
def squash!
squash_sha = repository.squash(current_user, merge_request, message || merge_request.default_squash_commit_message)
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 202a4018050..5636df7d5e0 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -68,8 +68,7 @@
%li.nav-item.header-user.dropdown{ data: { track_label: "profile_dropdown", track_event: "click_dropdown", track_value: "", qa_selector: 'user_menu' }, class: ('mr-0' if has_impersonation_link) }
= link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown" } do
= image_tag avatar_icon_for_user(current_user, 23), width: 23, height: 23, class: "header-user-avatar qa-user-avatar"
- - if show_user_notification_dot?
- %span.header-user-notification-dot.rounded-circle.position-relative
+ = render_if_exists 'layouts/header/user_notification_dot', project: project, namespace: group
= sprite_icon('angle-down', css_class: 'caret-down')
.dropdown-menu.dropdown-menu-right
= render 'layouts/header/current_user_dropdown'