diff options
113 files changed, 614 insertions, 780 deletions
@@ -11,7 +11,6 @@ end gem "rails", "~> 4.1.0" gem "protected_attributes" -gem 'rails-observers' # Make links from text gem 'rails_autolink', '~> 1.1' diff --git a/Gemfile.lock b/Gemfile.lock index 6c27b6e3739..382633c2246 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -365,8 +365,6 @@ GEM bundler (>= 1.3.0, < 2.0) railties (= 4.1.1) sprockets-rails (~> 2.0) - rails-observers (0.1.2) - activemodel (~> 4.0) rails_autolink (1.1.6) rails (> 3.1) rails_best_practices (1.14.4) @@ -644,7 +642,6 @@ DEPENDENCIES rack-cors rack-mini-profiler rails (~> 4.1.0) - rails-observers rails_autolink (~> 1.1) rails_best_practices raphael-rails (~> 2.1.2) @@ -1 +1 @@ -7.0.0.rc1 +7.0.0 diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index b04a81c85eb..59e53b69e3d 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -109,10 +109,10 @@ class MergeRequest type: 'GET' url: this.$('.merge-request-tabs .diffs-tab a').attr('href') beforeSend: => - this.$('.status').addClass 'loading' + this.$('.mr-loading-status .loading').show() complete: => @diffs_loaded = true - this.$('.status').removeClass 'loading' + this.$('.mr-loading-status .loading').hide() success: (data) => this.$(".diffs").html(data.html) dataType: 'json' diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 7d058ad7719..b596af38311 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -8,8 +8,6 @@ *= require select2 *= require highlightjs.min *= require_self - *= require nprogress - *= require nprogress-bootstrap *= require dropzone/basic */ @@ -21,6 +19,12 @@ @import 'gl_bootstrap'; /** + * NProgress load bar css + */ +@import 'nprogress'; +@import 'nprogress-bootstrap'; + +/** * Font icons * */ diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index da2c1b0cbd8..f5f86d0bb50 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -55,7 +55,7 @@ pre { .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - background: $bg_style_color; + background: $bg_primary; color: #FFF } diff --git a/app/assets/stylesheets/generic/forms.scss b/app/assets/stylesheets/generic/forms.scss index 5258acca466..2a31cae5dfb 100644 --- a/app/assets/stylesheets/generic/forms.scss +++ b/app/assets/stylesheets/generic/forms.scss @@ -76,30 +76,10 @@ label { } } -.commit-message-container { - background-color: $body-bg; - position: relative; - font-family: $monospace_font; - $left: 12px; - .max-width-marker { - width: 72ch; - color: rgba(0, 0, 0, 0.0); - font-family: inherit; - left: $left; - height: 100%; - border-right: 1px solid mix($input-border, white); - position: absolute; - z-index: 1; - } - > textarea { - background-color: rgba(0, 0, 0, 0.0); - font-family: inherit; - padding-left: $left; - position: relative; - z-index: 2; - } -} - .fieldset-form fieldset { margin-bottom: 20px; } + +.form-control { + @include box-shadow(none); +} diff --git a/app/assets/stylesheets/generic/jquery.scss b/app/assets/stylesheets/generic/jquery.scss index 6b29accb315..bfbbc7d25e3 100644 --- a/app/assets/stylesheets/generic/jquery.scss +++ b/app/assets/stylesheets/generic/jquery.scss @@ -41,8 +41,8 @@ } .ui-state-active { - border: 1px solid $bg_style_color; - background: $bg_style_color; + border: 1px solid $bg_primary; + background: $bg_primary; color: #FFF; } diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss index 0afd85aedf6..e0f508d2695 100644 --- a/app/assets/stylesheets/generic/selects.scss +++ b/app/assets/stylesheets/generic/selects.scss @@ -42,7 +42,7 @@ .select2-results { max-height: 350px; .select2-highlighted { - background: $bg_style_color; + background: $bg_primary; } } } diff --git a/app/assets/stylesheets/gl_bootstrap.scss b/app/assets/stylesheets/gl_bootstrap.scss index 4271a7b310c..34b0608646c 100644 --- a/app/assets/stylesheets/gl_bootstrap.scss +++ b/app/assets/stylesheets/gl_bootstrap.scss @@ -9,7 +9,7 @@ $font-size-base: 13px !default; $nav-pills-active-link-hover-bg: $bg_primary; $pagination-active-bg: $bg_primary; -$list-group-active-bg: $bg_style_color; +$list-group-active-bg: $bg_primary; // Core variables and mixins @import "bootstrap/variables"; diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index 68f7f6b8581..c49f7db788e 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -2,7 +2,6 @@ * General Colors */ $style_color: #474D57; -$bg_style_color: #2299BB; $hover: #D9EDF7; /* @@ -40,3 +39,8 @@ $border_warning: #EB9532; */ $added: #63c363; $deleted: #f77; + +/** + * + */ +$nprogress-color: #3498db; diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index ef8c5f089b9..f00d024f389 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -213,3 +213,27 @@ li.commit { padding: 4px 12px; } } + +.commit-message-container { + background-color: $body-bg; + position: relative; + font-family: $monospace_font; + $left: 12px; + .max-width-marker { + width: 72ch; + color: rgba(0, 0, 0, 0.0); + font-family: inherit; + left: $left; + height: 100%; + border-right: 1px solid mix($input-border, white); + position: absolute; + z-index: 1; + } + > textarea { + background-color: rgba(0, 0, 0, 0.0); + font-family: inherit; + padding-left: $left; + position: relative; + z-index: 2; + } +} diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index b811b0bc665..29cb0f4b87c 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -6,14 +6,12 @@ header { &.navbar-gitlab { margin-bottom: 0; min-height: 40px; + border: none; .navbar-inner { - background: #F1F1F1; - border-bottom: 1px solid #DDD; filter: none; .nav > li > a { - color: $style_color; font-size: 14px; line-height: 32px; padding: 6px 10px; @@ -248,8 +246,6 @@ header { float: left; height: 46px; width: 2px; - background: white; - border-left: 1px solid #DDD; margin-left: 10px; margin-right: 10px; } diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss index 59eaaec9498..f5d09c2df10 100644 --- a/app/assets/stylesheets/sections/nav.scss +++ b/app/assets/stylesheets/sections/nav.scss @@ -3,7 +3,7 @@ margin: 20px 0; margin-top: 0; padding-top: 4px; - border-bottom: 1px solid #E1E1E1; + border-bottom: 1px solid #E9E9E9; ul { padding: 0; diff --git a/app/assets/stylesheets/sections/profile.scss b/app/assets/stylesheets/sections/profile.scss index ed73e1630f2..086875582f3 100644 --- a/app/assets/stylesheets/sections/profile.scss +++ b/app/assets/stylesheets/sections/profile.scss @@ -56,10 +56,10 @@ text-align: center; .prev { - @extend .thumbnail; - height: 30px; - width: 175px; + height: 80px; + width: 160px; margin-bottom: 10px; + @include border-radius(4px); &.classic { background: #31363e; @@ -92,10 +92,13 @@ text-align: center; .prev { - @extend .thumbnail; - height: 151px; - width: 220px; + width: 160px; margin-bottom: 10px; + + img { + max-width: 100%; + @include border-radius(4px); + } } } } diff --git a/app/assets/stylesheets/themes/ui_basic.scss b/app/assets/stylesheets/themes/ui_basic.scss index 30f0bbaf4c8..3e3744fdc33 100644 --- a/app/assets/stylesheets/themes/ui_basic.scss +++ b/app/assets/stylesheets/themes/ui_basic.scss @@ -4,11 +4,21 @@ * */ .ui_basic { - .separator { - background: #F9F9F9; - border-left: 1px solid #DDD; + header { + &.navbar-gitlab { + .navbar-inner { + background: #F1F1F1; + border-bottom: 1px solid #DDD; + .nav > li > a { + color: $style_color; + } + .separator { + background: #F9F9F9; + border-left: 1px solid #DDD; + } + } + } } - .main-nav { background: #FFF; } diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index d2f86369b58..1c7c09d0cd4 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -23,13 +23,9 @@ class Admin::ProjectsController < Admin::ApplicationController end def transfer - result = ::Projects::TransferService.new(@project, current_user, project: params).execute(:admin) + ::Projects::TransferService.new(@project, current_user, params.dup).execute - if result - redirect_to [:admin, @project] - else - render :show - end + redirect_to [:admin, @project.reload] end protected diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 603e89a5e29..d58890fa33b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -48,7 +48,7 @@ class ApplicationController < ActionController::Base flash[:alert] = "Your account is blocked. Retry when an admin has unblocked it." new_user_session_path else - super + @return_to || root_path end end diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb index b5b0446b43f..5df92b29eda 100644 --- a/app/controllers/projects/notes_controller.rb +++ b/app/controllers/projects/notes_controller.rb @@ -21,7 +21,7 @@ class Projects::NotesController < Projects::ApplicationController end def create - @note = Notes::CreateService.new(project, current_user, params).execute + @note = Notes::CreateService.new(project, current_user, params[:note]).execute respond_to do |format| format.json { render_note_json(@note) } diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 9e14af62048..2dcc19bed07 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -98,8 +98,7 @@ class ProjectsController < ApplicationController def destroy return access_denied! unless can?(current_user, :remove_project, project) - project.team.truncate - project.destroy + ::Projects::DestroyService.new(@project, current_user, {}).execute respond_to do |format| format.html { redirect_to root_path } diff --git a/app/controllers/users_sessions_controller.rb b/app/controllers/users_sessions_controller.rb new file mode 100644 index 00000000000..656c92376fd --- /dev/null +++ b/app/controllers/users_sessions_controller.rb @@ -0,0 +1,6 @@ +class UsersSessionsController < Devise::SessionsController + def create + @return_to = params[:return_to] + super + end +end diff --git a/app/mailers/emails/groups.rb b/app/mailers/emails/groups.rb index 39527b00e9f..1654fc55bca 100644 --- a/app/mailers/emails/groups.rb +++ b/app/mailers/emails/groups.rb @@ -4,7 +4,7 @@ module Emails @membership = UsersGroup.find(user_group_id) @group = @membership.group @target_url = group_url(@group) - mail(cc: @membership.user.email, + mail(to: @membership.user.email, subject: subject("Access to group was granted")) end end diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb index 516e3da84c8..a096df9dc0d 100644 --- a/app/mailers/emails/issues.rb +++ b/app/mailers/emails/issues.rb @@ -4,10 +4,10 @@ module Emails @issue = Issue.find(issue_id) @project = @issue.project @target_url = project_issue_url(@project, @issue) - mail_new_thread(@issue, - from: sender(@issue.author_id), - cc: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) + set_message_id("issue_#{issue_id}") + mail(from: sender(@issue.author_id), + to: recipient(recipient_id), + subject: subject("#{@issue.title} (##{@issue.iid})")) end def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id, updated_by_user_id) @@ -15,10 +15,10 @@ module Emails @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id @project = @issue.project @target_url = project_issue_url(@project, @issue) - mail_answer_thread(@issue, - from: sender(updated_by_user_id), - cc: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) + set_reference("issue_#{issue_id}") + mail(from: sender(updated_by_user_id), + to: recipient(recipient_id), + subject: subject("#{@issue.title} (##{@issue.iid})")) end def closed_issue_email(recipient_id, issue_id, updated_by_user_id) @@ -26,10 +26,10 @@ module Emails @project = @issue.project @updated_by = User.find updated_by_user_id @target_url = project_issue_url(@project, @issue) - mail_answer_thread(@issue, - from: sender(updated_by_user_id), - cc: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) + set_reference("issue_#{issue_id}") + mail(from: sender(updated_by_user_id), + to: recipient(recipient_id), + subject: subject("#{@issue.title} (##{@issue.iid})")) end def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id) @@ -38,10 +38,10 @@ module Emails @project = @issue.project @updated_by = User.find updated_by_user_id @target_url = project_issue_url(@project, @issue) - mail_answer_thread(@issue, - from: sender(updated_by_user_id), - cc: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) + set_reference("issue_#{issue_id}") + mail(from: sender(updated_by_user_id), + to: recipient(recipient_id), + subject: subject("#{@issue.title} (##{@issue.iid})")) end end end diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb index c4ca3a3b69b..ea5671c4502 100644 --- a/app/mailers/emails/merge_requests.rb +++ b/app/mailers/emails/merge_requests.rb @@ -4,10 +4,10 @@ module Emails @merge_request = MergeRequest.find(merge_request_id) @project = @merge_request.project @target_url = project_merge_request_url(@project, @merge_request) - mail_new_thread(@merge_request, - from: sender(@merge_request.author_id), - cc: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + set_message_id("merge_request_#{merge_request_id}") + mail(from: sender(@merge_request.author_id), + to: recipient(recipient_id), + subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id, updated_by_user_id) @@ -15,10 +15,10 @@ module Emails @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id @project = @merge_request.project @target_url = project_merge_request_url(@project, @merge_request) - mail_answer_thread(@merge_request, - from: sender(updated_by_user_id), - cc: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + set_reference("merge_request_#{merge_request_id}") + mail(from: sender(updated_by_user_id), + to: recipient(recipient_id), + subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def closed_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) @@ -26,20 +26,20 @@ module Emails @updated_by = User.find updated_by_user_id @project = @merge_request.project @target_url = project_merge_request_url(@project, @merge_request) - mail_answer_thread(@merge_request, - from: sender(updated_by_user_id), - cc: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + set_reference("merge_request_#{merge_request_id}") + mail(from: sender(updated_by_user_id), + to: recipient(recipient_id), + subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) @merge_request = MergeRequest.find(merge_request_id) @project = @merge_request.project @target_url = project_merge_request_url(@project, @merge_request) - mail_answer_thread(@merge_request, - from: sender(updated_by_user_id), - cc: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + set_reference("merge_request_#{merge_request_id}") + mail(from: sender(updated_by_user_id), + to: recipient(recipient_id), + subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end end diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb index acc6d03b5e4..b7fedbd3707 100644 --- a/app/mailers/emails/notes.rb +++ b/app/mailers/emails/notes.rb @@ -5,10 +5,9 @@ module Emails @commit = @note.noteable @project = @note.project @target_url = project_commit_url(@project, @commit, anchor: "note_#{@note.id}") - mail_answer_thread(@commit, - from: sender(@note.author_id), - cc: recipient(recipient_id), - subject: subject("#{@commit.title} (#{@commit.short_id})")) + mail(from: sender(@note.author_id), + to: recipient(recipient_id), + subject: subject("#{@commit.title} (#{@commit.short_id})")) end def note_issue_email(recipient_id, note_id) @@ -16,10 +15,10 @@ module Emails @issue = @note.noteable @project = @note.project @target_url = project_issue_url(@project, @issue, anchor: "note_#{@note.id}") - mail_answer_thread(@issue, - from: sender(@note.author_id), - cc: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) + set_reference("issue_#{@issue.id}") + mail(from: sender(@note.author_id), + to: recipient(recipient_id), + subject: subject("#{@issue.title} (##{@issue.iid})")) end def note_merge_request_email(recipient_id, note_id) @@ -27,10 +26,10 @@ module Emails @merge_request = @note.noteable @project = @note.project @target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{@note.id}") - mail_answer_thread(@merge_request, - from: sender(@note.author_id), - cc: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + set_reference("merge_request_#{@merge_request.id}") + mail(from: sender(@note.author_id), + to: recipient(recipient_id), + subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) end end end diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb index 64878568ef8..6b13a1d746d 100644 --- a/app/mailers/emails/projects.rb +++ b/app/mailers/emails/projects.rb @@ -4,7 +4,7 @@ module Emails @users_project = UsersProject.find user_project_id @project = @users_project.project @target_url = project_url(@project) - mail(cc: @users_project.user.email, + mail(to: @users_project.user.email, subject: subject("Access to project was granted")) end @@ -12,7 +12,7 @@ module Emails @user = User.find user_id @project = Project.find project_id @target_url = project_url(@project) - mail(cc: @user.email, + mail(to: @user.email, subject: subject("Project was moved")) end @@ -32,7 +32,7 @@ module Emails end mail(from: sender(author_id), - cc: recipient, + to: recipient, subject: subject(@subject)) end end diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index d65bead9cfe..84a0da0129d 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -1,6 +1,4 @@ class Notify < ActionMailer::Base - include ActionDispatch::Routing::PolymorphicRoutes - include Emails::Issues include Emails::MergeRequests include Emails::Notes @@ -18,7 +16,6 @@ class Notify < ActionMailer::Base default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root default from: Proc.new { default_sender_address.format } - default to: Proc.new { project_sender_address.format } default reply_to: "noreply@#{Gitlab.config.gitlab.host}" # Just send email with 2 seconds delay @@ -35,17 +32,6 @@ class Notify < ActionMailer::Base address end - # The default email address to send emails to. Includes the project name if possible. - def project_sender_address - if @project - address = default_sender_address - address.display_name = @project.name_with_namespace - address - else - default_sender_address - end - end - # Return an email address that displays the name of the sender. # Only the displayed name changes; the actual email address is always the same. def sender(sender_id) @@ -67,6 +53,14 @@ class Notify < ActionMailer::Base end end + # Set the Message-ID header field + # + # local_part - The local part of the message ID + # + def set_message_id(local_part) + headers["Message-ID"] = "<#{local_part}@#{Gitlab.config.gitlab.host}>" + end + # Set the References header field # # local_part - The local part of the referenced message ID @@ -99,48 +93,4 @@ class Notify < ActionMailer::Base subject << extra.join(' | ') if extra.present? subject end - - # Return a string suitable for inclusion in the 'Message-Id' mail header. - # - # The message-id is generated from the unique URL to a model object. - def message_id(model) - model_name = model.class.model_name.singular_route_key - "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>" - end - - # Send an email that starts a new conversation thread, - # with headers suitable for grouping by thread in email clients. - # - # See: mail_answer_thread - def mail_new_thread(model, headers = {}, &block) - raise ArgumentError, '"To:" header will be overwritten; use "Cc:" or "Bcc:"' unless headers[:to].nil? - headers[:to] = project_sender_address.format - - headers['Message-ID'] = message_id(model) - - mail(headers, &block) - end - - # Send an email that responds to an existing conversation thread, - # with headers suitable for grouping by thread in email clients. - # - # For grouping emails by thread, email clients heuristics require the answers to: - # - # * have a subject that begin by 'Re: ' - # * have a 'In-Reply-To' or 'References' header that references the original 'Message-ID' - # * have stable 'From' and 'To' headers between messages of the same thread - # - def mail_answer_thread(model, headers = {}, &block) - raise ArgumentError, '"To:" header will be overwritten; use "Cc:" or "Bcc:"' unless headers[:to].nil? - headers[:to] = project_sender_address.format - - headers['In-Reply-To'] = message_id(model) - headers['References'] = message_id(model) - - if (headers[:subject]) - headers[:subject].prepend('Re: ') - end - - mail(headers, &block) - end end diff --git a/app/models/event.rb b/app/models/event.rb index b88635ccb59..1a8d55c54b4 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -41,6 +41,9 @@ class Event < ActiveRecord::Base # For Hash only serialize :data + # Callbacks + after_create :reset_project_activity + # Scopes scope :recent, -> { order("created_at DESC") } scope :code_push, -> { where(action: PUSHED) } @@ -303,4 +306,10 @@ class Event < ActiveRecord::Base target.respond_to? :title end end + + def reset_project_activity + if project + project.update_column(:last_activity_at, self.created_at) + end + end end diff --git a/app/models/note.rb b/app/models/note.rb index 659cd752071..01026cd3994 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -57,6 +57,7 @@ class Note < ActiveRecord::Base serialize :st_diff before_create :set_diff, if: ->(n) { n.line_code.present? } + after_update :set_references class << self def create_status_change_note(noteable, project, author, status, source) @@ -314,4 +315,8 @@ class Note < ActiveRecord::Base order('id DESC').limit(100). update_all(updated_at: Time.now) end + + def set_references + notice_added_references(project, author) + end end diff --git a/app/models/project_team.rb b/app/models/project_team.rb index afaca374130..0bbbd3d00e8 100644 --- a/app/models/project_team.rb +++ b/app/models/project_team.rb @@ -118,19 +118,30 @@ class ProjectTeam end def guest?(user) - find_tm(user.id).try(:access_field) == Gitlab::Access::GUEST + max_tm_access(user.id) == Gitlab::Access::GUEST end def reporter?(user) - find_tm(user.id).try(:access_field) == Gitlab::Access::REPORTER + max_tm_access(user.id) == Gitlab::Access::REPORTER end def developer?(user) - find_tm(user.id).try(:access_field) == Gitlab::Access::DEVELOPER + max_tm_access(user.id) == Gitlab::Access::DEVELOPER end def master?(user) - find_tm(user.id).try(:access_field) == Gitlab::Access::MASTER + max_tm_access(user.id) == Gitlab::Access::MASTER + end + + def max_tm_access(user_id) + access = [] + access << project.users_projects.find_by(user_id: user_id).try(:access_field) + + if group + access << group.users_groups.find_by(user_id: user_id).try(:access_field) + end + + access.compact.max end private diff --git a/app/models/user.rb b/app/models/user.rb index 2352f8c050b..8c2045444f0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -132,6 +132,10 @@ class User < ActiveRecord::Base before_validation :sanitize_attrs before_save :ensure_authentication_token + after_save :ensure_namespace_correct + after_create :post_create_hook + after_destroy :post_destroy_hook + alias_attribute :private_token, :authentication_token @@ -490,4 +494,36 @@ class User < ActiveRecord::Base GravatarService.new.execute(email, size) end end + + def ensure_namespace_correct + # Ensure user has namespace + self.create_namespace!(path: self.username, name: self.username) unless self.namespace + + if self.username_changed? + self.namespace.update_attributes(path: self.username, name: self.username) + end + end + + def post_create_hook + log_info("User \"#{self.name}\" (#{self.email}) was created") + notification_service.new_user(self) + system_hook_service.execute_hooks_for(self, :create) + end + + def post_destroy_hook + log_info("User \"#{self.name}\" (#{self.email}) was removed") + system_hook_service.execute_hooks_for(self, :destroy) + end + + def notification_service + NotificationService.new + end + + def log_info message + Gitlab::AppLogger.info message + end + + def system_hook_service + SystemHooksService.new + end end diff --git a/app/models/users_group.rb b/app/models/users_group.rb index 5f8b832d51e..242c8abb3ca 100644 --- a/app/models/users_group.rb +++ b/app/models/users_group.rb @@ -33,6 +33,9 @@ class UsersGroup < ActiveRecord::Base scope :with_group, ->(group) { where(group_id: group.id) } scope :with_user, ->(user) { where(user_id: user.id) } + after_create :notify_create + after_update :notify_update + validates :group_access, inclusion: { in: UsersGroup.group_access_roles.values }, presence: true validates :user_id, presence: true validates :group_id, presence: true @@ -43,4 +46,18 @@ class UsersGroup < ActiveRecord::Base def access_field group_access end + + def notify_create + notification_service.new_group_member(self) + end + + def notify_update + if group_access_changed? + notification_service.update_group_member(self) + end + end + + def notification_service + NotificationService.new + end end diff --git a/app/models/users_project.rb b/app/models/users_project.rb index e8810f56def..6495bed4e61 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -37,6 +37,10 @@ class UsersProject < ActiveRecord::Base scope :in_projects, ->(projects) { where(project_id: projects.map { |p| p.id }) } scope :with_user, ->(user) { where(user_id: user.id) } + after_create :post_create_hook + after_update :post_update_hook + after_destroy :post_destroy_hook + class << self # Add users to project teams with passed access option @@ -114,4 +118,37 @@ class UsersProject < ActiveRecord::Base def owner? project.owner == user end + + def post_create_hook + Event.create( + project_id: self.project.id, + action: Event::JOINED, + author_id: self.user.id + ) + + notification_service.new_team_member(self) + system_hook_service.execute_hooks_for(self, :create) + end + + def post_update_hook + notification_service.update_team_member(self) if self.project_access_changed? + end + + def post_destroy_hook + Event.create( + project_id: self.project.id, + action: Event::LEFT, + author_id: self.user.id + ) + + system_hook_service.execute_hooks_for(self, :destroy) + end + + def notification_service + NotificationService.new + end + + def system_hook_service + SystemHooksService.new + end end diff --git a/app/observers/base_observer.rb b/app/observers/base_observer.rb deleted file mode 100644 index 260d1f05db3..00000000000 --- a/app/observers/base_observer.rb +++ /dev/null @@ -1,13 +0,0 @@ -class BaseObserver < ActiveRecord::Observer - def notification - NotificationService.new - end - - def event_service - EventCreateService.new - end - - def log_info message - Gitlab::AppLogger.info message - end -end diff --git a/app/observers/note_observer.rb b/app/observers/note_observer.rb deleted file mode 100644 index bb0b0876eca..00000000000 --- a/app/observers/note_observer.rb +++ /dev/null @@ -1,20 +0,0 @@ -class NoteObserver < BaseObserver - def after_create(note) - notification.new_note(note) - - # Skip system notes, like status changes and cross-references. - unless note.system - event_service.leave_note(note, note.author) - - # Create a cross-reference note if this Note contains GFM that names an - # issue, merge request, or commit. - note.references.each do |mentioned| - Note.create_cross_reference_note(mentioned, note.noteable, note.author, note.project) - end - end - end - - def after_update(note) - note.notice_added_references(note.project, note.author) - end -end diff --git a/app/observers/project_activity_cache_observer.rb b/app/observers/project_activity_cache_observer.rb deleted file mode 100644 index 96ced90db80..00000000000 --- a/app/observers/project_activity_cache_observer.rb +++ /dev/null @@ -1,8 +0,0 @@ -class ProjectActivityCacheObserver < BaseObserver - observe :event - - def after_create(event) - event.project.update_column(:last_activity_at, event.created_at) if event.project - end -end - diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb deleted file mode 100644 index ad41ddad58f..00000000000 --- a/app/observers/project_observer.rb +++ /dev/null @@ -1,30 +0,0 @@ -class ProjectObserver < BaseObserver - def after_create(project) - log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"") - end - - def after_update(project) - project.send_move_instructions if project.namespace_id_changed? - project.rename_repo if project.path_changed? - end - - def before_destroy(project) - project.repository.expire_cache unless project.empty_repo? - end - - def after_destroy(project) - GitlabShellWorker.perform_async( - :remove_repository, - project.path_with_namespace - ) - - GitlabShellWorker.perform_async( - :remove_repository, - project.path_with_namespace + ".wiki" - ) - - project.satellite.destroy - - log_info("Project \"#{project.name}\" was removed") - end -end diff --git a/app/observers/system_hook_observer.rb b/app/observers/system_hook_observer.rb deleted file mode 100644 index 80de177b9a2..00000000000 --- a/app/observers/system_hook_observer.rb +++ /dev/null @@ -1,17 +0,0 @@ -class SystemHookObserver < BaseObserver - observe :user, :project, :users_project - - def after_create(model) - system_hook_service.execute_hooks_for(model, :create) - end - - def after_destroy(model) - system_hook_service.execute_hooks_for(model, :destroy) - end - - private - - def system_hook_service - SystemHooksService.new - end -end diff --git a/app/observers/user_observer.rb b/app/observers/user_observer.rb deleted file mode 100644 index fba0f1006d9..00000000000 --- a/app/observers/user_observer.rb +++ /dev/null @@ -1,20 +0,0 @@ -class UserObserver < BaseObserver - def after_create(user) - log_info("User \"#{user.name}\" (#{user.email}) was created") - - notification.new_user(user) - end - - def after_destroy user - log_info("User \"#{user.name}\" (#{user.email}) was removed") - end - - def after_save user - # Ensure user has namespace - user.create_namespace!(path: user.username, name: user.username) unless user.namespace - - if user.username_changed? - user.namespace.update_attributes(path: user.username, name: user.username) - end - end -end diff --git a/app/observers/users_group_observer.rb b/app/observers/users_group_observer.rb deleted file mode 100644 index 42a05b5e177..00000000000 --- a/app/observers/users_group_observer.rb +++ /dev/null @@ -1,9 +0,0 @@ -class UsersGroupObserver < BaseObserver - def after_create(membership) - notification.new_group_member(membership) - end - - def after_update(membership) - notification.update_group_member(membership) if membership.group_access_changed? - end -end diff --git a/app/observers/users_project_observer.rb b/app/observers/users_project_observer.rb deleted file mode 100644 index 44c72b30187..00000000000 --- a/app/observers/users_project_observer.rb +++ /dev/null @@ -1,23 +0,0 @@ -class UsersProjectObserver < BaseObserver - def after_create(users_project) - Event.create( - project_id: users_project.project.id, - action: Event::JOINED, - author_id: users_project.user.id - ) - - notification.new_team_member(users_project) - end - - def after_update(users_project) - notification.update_team_member(users_project) if users_project.project_access_changed? - end - - def after_destroy(users_project) - Event.create( - project_id: users_project.project.id, - action: Event::LEFT, - author_id: users_project.user.id - ) - end -end diff --git a/app/services/base_service.rb b/app/services/base_service.rb index 9ad80923152..31b38aca530 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -28,4 +28,8 @@ class BaseService def log_info message Gitlab::AppLogger.info message end + + def system_hook_service + SystemHooksService.new + end end diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index ff6dfb61139..f64006a4edc 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -1,10 +1,25 @@ module Notes class CreateService < BaseService def execute - note = project.notes.new(params[:note]) + note = project.notes.new(params) note.author = current_user note.system = false - note.save + + if note.save + notification_service.new_note(note) + + # Skip system notes, like status changes and cross-references. + unless note.system + event_service.leave_note(note, note.author) + + # Create a cross-reference note if this Note contains GFM that names an + # issue, merge request, or commit. + note.references.each do |mentioned| + Note.create_cross_reference_note(mentioned, note.noteable, note.author, note.project) + end + end + end + note end end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 3d2b9bf4875..dfadcfd296a 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -51,6 +51,9 @@ module Projects @project.creator = current_user if @project.save + log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") + system_hook_service.execute_hooks_for(@project, :create) + unless @project.group @project.users_projects.create( project_access: UsersProject::MASTER, diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb new file mode 100644 index 00000000000..7e1d753b021 --- /dev/null +++ b/app/services/projects/destroy_service.rb @@ -0,0 +1,28 @@ +module Projects + class DestroyService < BaseService + def execute + return false unless can?(current_user, :remove_project, project) + + project.team.truncate + project.repository.expire_cache unless project.empty_repo? + + if project.destroy + GitlabShellWorker.perform_async( + :remove_repository, + project.path_with_namespace + ) + + GitlabShellWorker.perform_async( + :remove_repository, + project.path_with_namespace + ".wiki" + ) + + project.satellite.destroy + + log_info("Project \"#{project.name}\" was removed") + system_hook_service.execute_hooks_for(project, :destroy) + true + end + end + end +end diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index d9d371da5c4..551a3653cad 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -13,7 +13,15 @@ module Projects project.change_head(new_branch) end - project.update_attributes(params[:project], as: role) + if project.update_attributes(params[:project], as: role) + if project.previous_changes.include?('namespace_id') + project.send_move_instructions + end + + if project.previous_changes.include?('path') + project.rename_repo + end + end end end end diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index 306b71717ef..6a08b1aa640 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -1,8 +1,8 @@ - if @has_authorized_projects .dashboard.row - .activities.col-md-8 + %section.activities.col-md-8 = render 'activities' - .side.col-md-4.left.responsive-side + %aside.side.col-md-4.left.responsive-side = render 'sidebar' .fixed.sidebar-expand-button.hidden-lg.hidden-md diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml index a2f85fa3fe2..989fcb4a63f 100644 --- a/app/views/devise/sessions/_new_base.html.haml +++ b/app/views/devise/sessions/_new_base.html.haml @@ -7,8 +7,8 @@ = f.check_box :remember_me %span Remember me %div + = hidden_field_tag 'return_to', params[:return_to] = f.submit "Sign in", class: "btn-create btn" + .pull-right = link_to "Forgot your password?", new_password_path(resource_name), class: "btn" - - diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 06183dd74a9..6db393c882c 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,5 +1,5 @@ .dashboard - .activities.col-md-8.hidden-sm.hidden-xs + %section.activities.col-md-8.hidden-sm.hidden-xs - if current_user = render "events/event_last_push", event: @last_push = link_to dashboard_path, class: 'btn btn-tiny' do @@ -16,7 +16,7 @@ - else .nothing-here-block Project activity will be displayed here = spinner - .side.col-md-4 + %aside.side.col-md-4 .light-well.append-bottom-20 = image_tag group_icon(@group.path), class: "avatar s90" .clearfix.light diff --git a/app/views/layouts/_public_head_panel.html.haml b/app/views/layouts/_public_head_panel.html.haml index 63992a22f32..25984df0444 100644 --- a/app/views/layouts/_public_head_panel.html.haml +++ b/app/views/layouts/_public_head_panel.html.haml @@ -13,10 +13,10 @@ %i.icon-reorder .pull-right.hidden-xs - = link_to "Sign in", new_session_path(:user), class: 'btn btn-sign-in btn-new' + = link_to "Sign in", new_session_path(:user, return_to: request.fullpath), class: 'btn btn-sign-in btn-new' .navbar-collapse.collapse %ul.nav.navbar-nav %li.visible-xs - = link_to "Sign in", new_session_path(:user) + = link_to "Sign in", new_session_path(:user, return_to: request.fullpath) diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml index a0e55b21c32..caf0e39234a 100644 --- a/app/views/layouts/_search.html.haml +++ b/app/views/layouts/_search.html.haml @@ -1,6 +1,6 @@ .search = form_tag search_path, method: :get, class: 'navbar-form pull-left' do |f| - = text_field_tag "search", nil, placeholder: search_placeholder, class: "search-input" + = search_field_tag "search", nil, placeholder: search_placeholder, class: "search-input" = hidden_field_tag :group_id, @group.try(:id) - if @project && @project.persisted? = hidden_field_tag :project_id, @project.id diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 87574d4648b..be785dacedb 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -20,7 +20,7 @@ = render blob_commit, project: @project %div#tree-content-holder.tree-content-holder - .file-holder + %article.file-holder .file-title.clearfix %i.icon-file %span.file_name diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 486454793ba..8fca9f0212b 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -31,7 +31,8 @@ = render "projects/merge_requests/show/diffs" .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } = render "projects/notes/notes_with_form" - .status + .mr-loading-status + = spinner :javascript var merge_request; diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index b62aada3a9a..5ebafb13f1c 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -17,8 +17,8 @@ = f.text_area :note, size: 255, class: 'note_text js-note-text js-gfm-input markdown-area' .light.clearfix - .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'} - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} + .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. .note-preview-holder.hide .js-note-preview diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 7e9f1122aa9..9484dc9464c 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,12 +1,12 @@ = render "home_panel" .row - .col-md-9 + %section.col-md-9 = render "events/event_last_push", event: @last_push = render 'shared/event_filter' .content_list = spinner - .col-md-3.project-side.hidden-sm.hidden-xs + %aside.col-md-3.project-side.hidden-sm.hidden-xs .clearfix - if @project.archived? .alert.alert-warning diff --git a/app/views/projects/tree/_readme.html.haml b/app/views/projects/tree/_readme.html.haml index 0c19109445a..c066b7102fd 100644 --- a/app/views/projects/tree/_readme.html.haml +++ b/app/views/projects/tree/_readme.html.haml @@ -1,4 +1,4 @@ -.readme-holder#README +%article.readme-holder#README %h4.readme-file-title %i.icon-file = readme.name diff --git a/config/application.rb b/config/application.rb index 540426b6672..0a77f58f6d1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -18,15 +18,6 @@ module Gitlab # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] - # Activate observers that should always be running. - config.active_record.observers = :project_activity_cache_observer, - :note_observer, - :project_observer, - :system_hook_observer, - :user_observer, - :users_group_observer, - :users_project_observer - # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' diff --git a/config/routes.rb b/config/routes.rb index 746e532a0ec..779cbad709c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -157,7 +157,7 @@ Gitlab::Application.routes.draw do resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] - devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations , passwords: :passwords} + devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations , passwords: :passwords, sessions: :users_sessions } # # Project Area diff --git a/db/fixtures/development/07_milestones.rb b/db/fixtures/development/07_milestones.rb index 72e6b3ad3d6..6fe7e246770 100644 --- a/db/fixtures/development/07_milestones.rb +++ b/db/fixtures/development/07_milestones.rb @@ -1,5 +1,3 @@ -ActiveRecord::Base.observers.disable(:milestone_observer) - Milestone.seed(:id, [ { id: 1, project_id: 1, title: 'v' + Faker::Address.zip_code }, { id: 2, project_id: 1, title: 'v' + Faker::Address.zip_code }, @@ -18,5 +16,3 @@ Milestone.all.map do |ml| ml.set_iid ml.save end - -ActiveRecord::Base.observers.enable(:milestone_observer) diff --git a/doc/install/requirements.md b/doc/install/requirements.md index d7c4c4da2ed..9f7c03badcf 100644 --- a/doc/install/requirements.md +++ b/doc/install/requirements.md @@ -59,7 +59,11 @@ We love [JRuby](http://jruby.org/) and [Rubinius](http://rubini.us/)) but GitLab ### Memory -- 512MB is the absolute minimum but we do not recommend this amount of memory, you'll need to configure a minimum swap of 256MB, you're memory will only allow you to run one slow unicorn worker, things will case only git ssh access to work because the git http access requires two running workers (one to receive the user request and one for the authorization check), +- 512MB is the absolute minimum but we do not recommend this amount of memory. +You will either need to configure a minimum swap of 256MB and this will only allow you to run one slow unicorn worker. +One unicorn worker will cause only git ssh access to work because the git http access requires two running workers. +It requires one worker to receive the user request and one worker for the authorization check. +Or if you use SSD you can configure 2GB of swap to use two Unicorn workers and have slow operation with http access. - 1GB supports up to 100 users (with individual repositories under 250MB, otherwise git memory usage necessitates configuring swap space) - **2GB** is the **recommended** memory size and supports up to 500 users - 4GB supports up to 2,000 users diff --git a/doc/release/monthly.md b/doc/release/monthly.md index 99f2d4cafed..22824016f26 100644 --- a/doc/release/monthly.md +++ b/doc/release/monthly.md @@ -29,9 +29,14 @@ Consider naming the issue "Release x.x.x.rc1" to make it easier for later search 1. Check the [Git version](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/tasks/gitlab/check.rake#L794) 1. There might be other changes. Ask around. -### **3. Create an update guide** +### **3. Create an update guides** -It's best to copy paste the previous guide and make changes where necessary. The typical steps are listed below with any points you should specifically look at. +1. Create: CE update guide from previous version. Like `from-6-8-to-6.9` +1. Create: CE to EE update guide in EE repository for latest version. +1. Update: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/6.0-to-6.x.md to latest version. + +It's best to copy paste the previous guide and make changes where necessary. +The typical steps are listed below with any points you should specifically look at. #### 0. Any major changes? @@ -115,6 +120,17 @@ Merge the RC1 code into GitLab.com. Once the build is green, deploy in the morni It is important to do this as soon as possible, so we can catch any errors before we release the full version. +### **9. Create a regressions issue** + +On [the GitLab CE issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues/) create an issue titled "GitLab X.X regressions" add the following text: + +This is a meta issue to discuss possible regressions in this monthly release and any patch versions. +Please do not raise issues directly in this issue but link to issues that might warrant a patch release. +The decision to create a patch release or not is with the release manager who is assigned to this issue. +The release manager will comment here about the plans for patch releases. + +Assign the issue to the release manager and /cc all the core-team members active on the issue tracker. If there are any known bugs in the release add them immediately. + # **21st - Preparation ** ### **1. Prepare the blog post** @@ -214,17 +230,6 @@ Include a link to the blog post and keep it short. Proposed email for CE: "We have released a new version of GitLab Community Edition and its packages. See our blog post(<link>) for more information." -### **10. Create a regressions issue** - -On [the GitLab CE issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues/) create an issue titled "GitLab X.X regressions" add the following text: - -This is a meta issue to discuss possible regressions in this monthly release and any patch versions. -Please do not raise issues directly in this issue but link to issues that might warrant a patch release. -The decision to create a patch release or not is with the release manager who is assigned to this issue. -The release manager will comment here about the plans for patch releases. - -Assign the issue to the release manager and /cc all the core-team members active on the issue tracker. If there are any known bugs in the release add them immediately. - # **23rd - Optional Patch Release** # **24th - Update GitLab.com** diff --git a/doc/update/6.0-to-6.8.md b/doc/update/6.0-to-7.0.md index 0205d0d2e22..b73adc8cfb3 100644 --- a/doc/update/6.0-to-6.8.md +++ b/doc/update/6.0-to-7.0.md @@ -1,11 +1,9 @@ -# From 6.0 to 6.8 - -**In 6.1 we remove a lot of deprecated code.** - -**You should update to 6.0 before installing 6.1 or higher so all the necessary conversions are run.** +# From 6.0 to 7.0 ## Deprecations +The 'Wall' feature has been removed in GitLab 7.0. Existing wall comments will remain stored in the database after the upgrade. + ## Global issue numbers As of 6.1 issue numbers are project specific. This means all issues are renumbered and get a new number in their URL. If you use an old issue number URL and the issue number does not exist yet you are redirected to the new one. This conversion does not trigger if the old number already exists for this project, this is unlikely but will happen with old issues and large projects. @@ -34,7 +32,7 @@ sudo -u git -H git fetch --all For GitLab Community Edition: ```bash -sudo -u git -H git checkout 6-8-stable +sudo -u git -H git checkout 7-0-stable ``` OR @@ -42,7 +40,7 @@ OR For GitLab Enterprise Edition: ```bash -sudo -u git -H git checkout 6-8-stable-ee +sudo -u git -H git checkout 7-0-stable-ee ``` @@ -91,12 +89,12 @@ sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites TIP: to see what changed in gitlab.yml.example in this release use next command: ``` -git diff 6-0-stable:config/gitlab.yml.example 6-8-stable:config/gitlab.yml.example +git diff 6-0-stable:config/gitlab.yml.example 7-0-stable:config/gitlab.yml.example ``` -* Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-8-stable/config/gitlab.yml.example but with your settings. -* Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-8-stable/config/unicorn.rb.example but with your settings. -* Make `/etc/nginx/sites-available/nginx` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-8-stable/lib/support/nginx/gitlab but with your settings. +* Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/config/gitlab.yml.example but with your settings. +* Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/config/unicorn.rb.example but with your settings. +* Make `/etc/nginx/sites-available/nginx` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/lib/support/nginx/gitlab but with your settings. * Copy rack attack middleware config ```bash diff --git a/doc/update/6.9-to-7.0.md b/doc/update/6.9-to-7.0.md index d6e9c9f3155..2ddd83c624e 100644 --- a/doc/update/6.9-to-7.0.md +++ b/doc/update/6.9-to-7.0.md @@ -58,6 +58,10 @@ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production # Clean up assets and cache sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production + +# Update init.d script +sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab +sudo chmod +x /etc/init.d/gitlab ``` ### 5. Update config files diff --git a/features/admin/projects.feature b/features/admin/projects.feature index fb07ccdb352..a6c3d6b7822 100644 --- a/features/admin/projects.feature +++ b/features/admin/projects.feature @@ -12,3 +12,9 @@ Feature: Admin Projects When I visit admin projects page And I click on first project Then I should see project details + + Scenario: Transfer project + Given group 'Web' + And I visit admin project page + When I transfer project to group 'Web' + Then I should see project transfered diff --git a/features/project/redirects.feature b/features/project/redirects.feature index ce197912f64..776ab83a876 100644 --- a/features/project/redirects.feature +++ b/features/project/redirects.feature @@ -24,3 +24,10 @@ Feature: Project Redirects Given I sign in as a user When I visit project "Enterprise" page Then page status code should be 404 + + Scenario: I visit a public project without signing in + When I visit project "Community" page + And I should see project "Community" home page + And I click on "Sign In" + And Authenticate + Then I should be redirected to "Community" page diff --git a/features/steps/admin/projects.rb b/features/steps/admin/projects.rb index b410b23851b..992aa46a8bc 100644 --- a/features/steps/admin/projects.rb +++ b/features/steps/admin/projects.rb @@ -19,4 +19,30 @@ class AdminProjects < Spinach::FeatureSteps page.should have_content(project.name_with_namespace) page.should have_content(project.creator.name) end + + step 'I visit admin project page' do + visit admin_project_path(project) + end + + step 'I transfer project to group \'Web\'' do + find(:xpath, "//input[@id='namespace_id']").set group.id + click_button 'Transfer' + end + + step 'group \'Web\'' do + create(:group, name: 'Web') + end + + step 'I should see project transfered' do + page.should have_content 'Web / ' + project.name + page.should have_content 'Namespace: Web' + end + + def project + @project ||= Project.first + end + + def group + Group.find_by(name: 'Web') + end end diff --git a/features/steps/project/redirects.rb b/features/steps/project/redirects.rb index cfa4ce82be3..5a4342dba30 100644 --- a/features/steps/project/redirects.rb +++ b/features/steps/project/redirects.rb @@ -31,5 +31,27 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps project = Project.find_by(name: 'Community') visit project_path(project) + 'DoesNotExist' end + + step 'I click on "Sign In"' do + within '.pull-right' do + click_link "Sign in" + end + end + + step 'Authenticate' do + admin = create(:admin) + project = Project.find_by(name: 'Community') + find(:xpath, "//input[@id='return_to']").set "/#{project.path_with_namespace}" + fill_in "user_login", with: admin.email + fill_in "user_password", with: admin.password + click_button "Sign in" + Thread.current[:current_user] = admin + end + + step 'I should be redirected to "Community" page' do + project = Project.find_by(name: 'Community') + page.current_path.should == "/#{project.path_with_namespace}" + page.status_code.should == 200 + end end diff --git a/lib/api/notes.rb b/lib/api/notes.rb index 413faf0cf2d..0ef9a3c4beb 100644 --- a/lib/api/notes.rb +++ b/lib/api/notes.rb @@ -50,12 +50,15 @@ module API post ":id/#{noteables_str}/:#{noteable_id_str}/notes" do required_attributes! [:body] - @noteable = user_project.send(:"#{noteables_str}").find(params[:"#{noteable_id_str}"]) - @note = @noteable.notes.new(note: params[:body]) - @note.author = current_user - @note.project = user_project + opts = { + note: params[:body], + noteable_type: noteables_str.classify, + noteable_id: params[noteable_id_str] + } + + @note = ::Notes::CreateService.new(user_project, current_user, opts).execute - if @note.save + if @note.valid? present @note, with: Entities::Note else not_found! diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index 73a149621c1..c04be788f07 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -228,7 +228,7 @@ module Gitlab def reference_jira_issue(identifier, project = @project) url = url_for_issue(identifier) - title = Gitlab.config.issues_tracker[@project.issues_tracker]["title"] + title = Gitlab.config.issues_tracker[project.issues_tracker]["title"] options = html_options.merge( title: "Issue in #{title}", diff --git a/lib/tasks/cache.rake b/lib/tasks/cache.rake index 8320b9b2576..753a5a11070 100644 --- a/lib/tasks/cache.rake +++ b/lib/tasks/cache.rake @@ -1,6 +1,11 @@ namespace :cache do desc "GITLAB | Clear redis cache" task :clear => :environment do - Rails.cache.clear + # Hack into Rails.cache until https://github.com/redis-store/redis-store/pull/225 + # is accepted (I hope) and we can update the redis-store gem. + redis_store = Rails.cache.instance_variable_get(:@data) + redis_store.keys.each_slice(1000) do |key_slice| + redis_store.del(*key_slice) + end end end diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index 1aba40966c4..82da19746f8 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -47,20 +47,16 @@ describe "Admin::Users", feature: true do it "should call send mail" do Notify.should_receive(:new_user_email) - User.observers.enable :user_observer do - click_button "Create user" - end + click_button "Create user" end it "should send valid email to user with email & password" do - User.observers.enable :user_observer do - click_button "Create user" - user = User.last - email = ActionMailer::Base.deliveries.last - email.subject.should have_content("Account was created") - email.text_part.body.should have_content(user.email) - email.text_part.body.should have_content('password') - end + click_button "Create user" + user = User.last + email = ActionMailer::Base.deliveries.last + email.subject.should have_content("Account was created") + email.text_part.body.should have_content(user.email) + email.text_part.body.should have_content('password') end end diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb index e8364bbb962..bdf7b59114b 100644 --- a/spec/features/profile_spec.rb +++ b/spec/features/profile_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' describe "Profile account page", feature: true do - before(:each) { enable_observers } - after(:each) {disable_observers} let(:user) { create(:user) } before do diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb index 1e24782c39a..524c4d5fa21 100644 --- a/spec/features/projects_spec.rb +++ b/spec/features/projects_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' describe "Projects", feature: true do - before(:each) { enable_observers } - after(:each) {disable_observers} before { login_as :user } describe "DELETE /projects/:id" do diff --git a/spec/features/search_spec.rb b/spec/features/search_spec.rb index f12eb124296..cce9f06cb69 100644 --- a/spec/features/search_spec.rb +++ b/spec/features/search_spec.rb @@ -2,7 +2,6 @@ require 'spec_helper' describe "Search", feature: true do before do - ActiveRecord::Base.observers.enable(:user_observer) login_as :user @project = create(:project, namespace: @user.namespace) @project.team << [@user, :reporter] diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index ab26b290d77..224b613b477 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -10,7 +10,7 @@ describe Notify do shared_examples 'a multiple recipients email' do it 'is sent to the given recipient' do - should cc_to recipient.email + should deliver_to recipient.email end end @@ -22,23 +22,6 @@ describe Notify do end end - shared_examples 'an email starting a new thread' do |message_id_prefix| - it 'has a discussion identifier' do - should have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/ - end - end - - shared_examples 'an answer to an existing thread' do |thread_id_prefix| - it 'has a subject that begins with Re: ' do - should have_subject /^Re: / - end - - it 'has headers that reference an existing thread' do - should have_header 'References', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/ - should have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/ - end - end - describe 'for new users, the email' do let(:example_site_path) { root_path } let(:new_user) { create(:user, email: 'newguy@example.com', created_by_id: 1) } @@ -158,7 +141,7 @@ describe Notify do end it 'is sent to the assignee' do - should cc_to assignee.email + should deliver_to assignee.email end end @@ -170,7 +153,6 @@ describe Notify do subject { Notify.new_issue_email(issue.assignee_id, issue.id) } it_behaves_like 'an assignee email' - it_behaves_like 'an email starting a new thread', 'issue' it 'has the correct subject' do should have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/ @@ -179,6 +161,10 @@ describe Notify do it 'contains a link to the new issue' do should have_body_text /#{project_issue_path project, issue}/ end + + it 'has the correct message-id set' do + should have_header 'Message-ID', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>" + end end describe 'that are new with a description' do @@ -193,7 +179,6 @@ describe Notify do subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user) } it_behaves_like 'a multiple recipients email' - it_behaves_like 'an answer to an existing thread', 'issue' it 'is sent as the author' do sender = subject.header[:from].addrs[0] @@ -216,14 +201,16 @@ describe Notify do it 'contains a link to the issue' do should have_body_text /#{project_issue_path project, issue}/ end + + it 'has the correct reference set' do + should have_header 'References', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>" + end end describe 'status changed' do let(:status) { 'closed' } subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) } - it_behaves_like 'an answer to an existing thread', 'issue' - it 'is sent as the author' do sender = subject.header[:from].addrs[0] sender.display_name.should eq(current_user.name) @@ -245,6 +232,10 @@ describe Notify do it 'contains a link to the issue' do should have_body_text /#{project_issue_path project, issue}/ end + + it 'has the correct reference set' do + should have_header 'References', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>" + end end end @@ -258,7 +249,6 @@ describe Notify do subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) } it_behaves_like 'an assignee email' - it_behaves_like 'an email starting a new thread', 'merge_request' it 'has the correct subject' do should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/ @@ -293,7 +283,6 @@ describe Notify do subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) } it_behaves_like 'a multiple recipients email' - it_behaves_like 'an answer to an existing thread', 'merge_request' it 'is sent as the author' do sender = subject.header[:from].addrs[0] @@ -322,7 +311,6 @@ describe Notify do subject { Notify.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) } it_behaves_like 'a multiple recipients email' - it_behaves_like 'an answer to an existing thread', 'merge_request' it 'is sent as the merge author' do sender = subject.header[:from].addrs[0] @@ -341,6 +329,10 @@ describe Notify do it 'contains a link to the merge request' do should have_body_text /#{project_merge_request_path project, merge_request}/ end + + it 'has the correct reference set' do + should have_header 'References', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>" + end end end end @@ -402,7 +394,7 @@ describe Notify do end it 'is sent to the given recipient' do - should cc_to recipient.email + should deliver_to recipient.email end it 'contains the message from the note' do @@ -418,7 +410,6 @@ describe Notify do subject { Notify.note_commit_email(recipient.id, note.id) } it_behaves_like 'a note email' - it_behaves_like 'an answer to an existing thread', 'commits' it 'has the correct subject' do should have_subject /#{commit.title} \(#{commit.short_id}\)/ @@ -437,7 +428,6 @@ describe Notify do subject { Notify.note_merge_request_email(recipient.id, note.id) } it_behaves_like 'a note email' - it_behaves_like 'an answer to an existing thread', 'merge_request' it 'has the correct subject' do should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/ @@ -456,7 +446,6 @@ describe Notify do subject { Notify.note_issue_email(recipient.id, note.id) } it_behaves_like 'a note email' - it_behaves_like 'an answer to an existing thread', 'issue' it 'has the correct subject' do should have_subject /#{issue.title} \(##{issue.iid}\)/ @@ -533,7 +522,7 @@ describe Notify do end it 'is sent to recipient' do - should cc_to 'devs@company.name' + should deliver_to 'devs@company.name' end it 'has the correct subject' do @@ -569,7 +558,7 @@ describe Notify do end it 'is sent to recipient' do - should cc_to 'devs@company.name' + should deliver_to 'devs@company.name' end it 'has the correct subject' do diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index f415e750dd5..1fdd959da9d 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -65,26 +65,4 @@ describe Event do it { @event.branch_name.should == "master" } it { @event.author.should == @user } end - - describe 'Team events' do - let(:user_project) { double.as_null_object } - let(:observer) { UsersProjectObserver.instance } - - before { - Event.should_receive :create - observer.stub(notification: double.as_null_object) - } - - describe "Joined project team" do - it "should create event" do - observer.after_create user_project - end - end - - describe "Left project team" do - it "should create event" do - observer.after_destroy user_project - end - end - end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index a2519fbd684..93eae5a9ebd 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -27,9 +27,6 @@ require 'spec_helper' describe Project do - before { enable_observers } - after { disable_observers } - describe "Associations" do it { should belong_to(:group) } it { should belong_to(:namespace) } diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb index 1cc37719e7a..34c1a686c96 100644 --- a/spec/models/project_team_spec.rb +++ b/spec/models/project_team_spec.rb @@ -1,36 +1,66 @@ require "spec_helper" describe ProjectTeam do - let(:group) { create(:group) } - let(:project) { create(:empty_project, group: group) } - let(:master) { create(:user) } let(:reporter) { create(:user) } let(:guest) { create(:user) } let(:nonmember) { create(:user) } - before do - group.add_user(master, Gitlab::Access::MASTER) - group.add_user(reporter, Gitlab::Access::REPORTER) - group.add_user(guest, Gitlab::Access::GUEST) + context 'personal project' do + let(:project) { create(:empty_project) } - # Add group guest as master to this project - # to test project access priority over group members - project.team << [guest, :master] - end + before do + project.team << [master, :master] + project.team << [reporter, :reporter] + project.team << [guest, :guest] + end - describe 'members collection' do - it { project.team.masters.should include(master) } - it { project.team.masters.should include(guest) } - it { project.team.masters.should_not include(reporter) } - it { project.team.masters.should_not include(nonmember) } + describe 'members collection' do + it { project.team.masters.should include(master) } + it { project.team.masters.should_not include(guest) } + it { project.team.masters.should_not include(reporter) } + it { project.team.masters.should_not include(nonmember) } + end + + describe 'access methods' do + it { project.team.master?(master).should be_true } + it { project.team.master?(guest).should be_false } + it { project.team.master?(reporter).should be_false } + it { project.team.master?(nonmember).should be_false } + end end - describe 'access methods' do - it { project.team.master?(master).should be_true } - it { project.team.master?(guest).should be_true } - it { project.team.master?(reporter).should be_false } - it { project.team.master?(nonmember).should be_false } + context 'group project' do + let(:group) { create(:group) } + let(:project) { create(:empty_project, group: group) } + + before do + group.add_user(master, Gitlab::Access::MASTER) + group.add_user(reporter, Gitlab::Access::REPORTER) + group.add_user(guest, Gitlab::Access::GUEST) + + # If user is a group and a project member - GitLab uses highest permission + # So we add group guest as master and add group master as guest + # to this project to test highest access + project.team << [guest, :master] + project.team << [master, :guest] + end + + describe 'members collection' do + it { project.team.reporters.should include(reporter) } + it { project.team.masters.should include(master) } + it { project.team.masters.should include(guest) } + it { project.team.masters.should_not include(reporter) } + it { project.team.masters.should_not include(nonmember) } + end + + describe 'access methods' do + it { project.team.reporter?(reporter).should be_true } + it { project.team.master?(master).should be_true } + it { project.team.master?(guest).should be_true } + it { project.team.master?(reporter).should be_false } + it { project.team.master?(nonmember).should be_false } + end end end diff --git a/spec/models/system_hook_spec.rb b/spec/models/system_hook_spec.rb index 47d6d861d70..2b98acdeb6c 100644 --- a/spec/models/system_hook_spec.rb +++ b/spec/models/system_hook_spec.rb @@ -19,21 +19,20 @@ require "spec_helper" describe SystemHook do describe "execute" do - before(:each) { ActiveRecord::Base.observers.enable(:all) } - before(:each) do @system_hook = create(:system_hook) WebMock.stub_request(:post, @system_hook.url) end it "project_create hook" do - project = create(:project) + Projects::CreateService.new(create(:user), name: 'empty').execute WebMock.should have_requested(:post, @system_hook.url).with(body: /project_create/).once end it "project_destroy hook" do - project = create(:project) - project.destroy + user = create(:user) + project = create(:empty_project, namespace: user.namespace) + Projects::DestroyService.new(project, user, {}).execute WebMock.should have_requested(:post, @system_hook.url).with(body: /project_destroy/).once end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 4e0ebb584d1..0a665b7defb 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -145,7 +145,6 @@ describe User do describe 'projects' do before do - ActiveRecord::Base.observers.enable(:user_observer) @user = create :user @project = create :project, namespace: @user.namespace @project_2 = create :project, group: create(:group) # Grant MASTER access to the user @@ -168,7 +167,6 @@ describe User do describe 'groups' do before do - ActiveRecord::Base.observers.enable(:user_observer) @user = create :user @group = create :group @group.add_owner(@user) @@ -181,7 +179,6 @@ describe User do describe 'group multiple owners' do before do - ActiveRecord::Base.observers.enable(:user_observer) @user = create :user @user2 = create :user @group = create :group @@ -195,7 +192,6 @@ describe User do describe 'namespaced' do before do - ActiveRecord::Base.observers.enable(:user_observer) @user = create :user @project = create :project, namespace: @user.namespace end @@ -339,7 +335,7 @@ describe User do user.all_ssh_keys.should include(key.key) end end - + describe :avatar_type do let(:user) { create(:user) } diff --git a/spec/models/users_group_spec.rb b/spec/models/users_group_spec.rb index acecae07146..05dd97d92d4 100644 --- a/spec/models/users_group_spec.rb +++ b/spec/models/users_group_spec.rb @@ -37,4 +37,32 @@ describe UsersGroup do it { should respond_to(:user_name) } it { should respond_to(:user_email) } end + + context 'notification' do + describe "#after_create" do + it "should send email to user" do + membership = build(:users_group) + membership.stub(notification_service: double('NotificationService').as_null_object) + membership.should_receive(:notification_service) + membership.save + end + end + + describe "#after_update" do + before do + @membership = create :users_group + @membership.stub(notification_service: double('NotificationService').as_null_object) + end + + it "should send email to user" do + @membership.should_receive(:notification_service) + @membership.update_attribute(:group_access, UsersGroup::MASTER) + end + + it "does not send an email when the access level has not changed" do + @membership.should_not_receive(:notification_service) + @membership.update_attribute(:group_access, UsersGroup::OWNER) + end + end + end end diff --git a/spec/observers/note_observer_spec.rb b/spec/observers/note_observer_spec.rb deleted file mode 100644 index f8693355b23..00000000000 --- a/spec/observers/note_observer_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' - -describe NoteObserver do - subject { NoteObserver.instance } - before { subject.stub(notification: double('NotificationService').as_null_object) } - - let(:team_without_author) { (1..2).map { |n| double :user, id: n } } - let(:note) { double(:note).as_null_object } - - describe '#after_create' do - - it 'is called after a note is created' do - subject.should_receive :after_create - - Note.observers.enable :note_observer do - create(:note) - end - end - - it 'sends out notifications' do - subject.should_receive(:notification) - - subject.after_create(note) - end - - it 'creates cross-reference notes as appropriate' do - @p = create(:project) - @referenced = create(:issue, project: @p) - @referencer = create(:issue, project: @p) - @author = create(:user) - - Note.should_receive(:create_cross_reference_note).with(@referenced, @referencer, @author, @p) - - Note.observers.enable :note_observer do - create(:note, project: @p, author: @author, noteable: @referencer, - note: "Duplicate of ##{@referenced.iid}") - end - end - - it "doesn't cross-reference system notes" do - Note.should_receive(:create_cross_reference_note).once - - Note.observers.enable :note_observer do - Note.create_cross_reference_note(create(:issue), create(:issue)) - end - end - end - - describe '#after_update' do - it 'checks for new cross-references' do - note.should_receive(:notice_added_references) - - subject.after_update(note) - end - end -end diff --git a/spec/observers/user_observer_spec.rb b/spec/observers/user_observer_spec.rb deleted file mode 100644 index 9aeade535f9..00000000000 --- a/spec/observers/user_observer_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'spec_helper' - -describe UserObserver do - before(:each) { enable_observers } - after(:each) {disable_observers} - subject { UserObserver.instance } - before { subject.stub(notification: double('NotificationService').as_null_object) } - - it 'calls #after_create when new users are created' do - new_user = build(:user) - subject.should_receive(:after_create).with(new_user) - new_user.save - end - - context 'when a new user is created' do - it 'sends an email' do - subject.should_receive(:notification) - create(:user) - end - - it 'trigger logger' do - user = double(:user, id: 42, password: 'P@ssword!', name: 'John', email: 'u@mail.local', extern_uid?: false) - Gitlab::AppLogger.should_receive(:info) - create(:user) - end - end -end diff --git a/spec/observers/users_group_observer_spec.rb b/spec/observers/users_group_observer_spec.rb deleted file mode 100644 index 2ab99c33b78..00000000000 --- a/spec/observers/users_group_observer_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'spec_helper' - -describe UsersGroupObserver do - before(:each) { enable_observers } - after(:each) { disable_observers } - - subject { UsersGroupObserver.instance } - before { subject.stub(notification: double('NotificationService').as_null_object) } - - describe "#after_create" do - it "should send email to user" do - subject.should_receive(:notification) - create(:users_group) - end - end - - describe "#after_update" do - before do - @membership = create :users_group - end - - it "should send email to user" do - subject.should_receive(:notification) - @membership.update_attribute(:group_access, UsersGroup::MASTER) - end - - it "does not send an email when the access level has not changed" do - subject.should_not_receive(:notification) - @membership.update_attribute(:group_access, UsersGroup::OWNER) - end - end -end diff --git a/spec/observers/users_project_observer_spec.rb b/spec/observers/users_project_observer_spec.rb deleted file mode 100644 index b024465e8c3..00000000000 --- a/spec/observers/users_project_observer_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'spec_helper' - -describe UsersProjectObserver do - before(:each) { enable_observers } - after(:each) { disable_observers } - - let(:user) { create(:user) } - let(:project) { create(:project) } - subject { UsersProjectObserver.instance } - before { subject.stub(notification: double('NotificationService').as_null_object) } - - describe "#after_update" do - before do - @users_project = create :users_project - end - - it "should called when UsersProject updated" do - subject.should_receive(:after_update) - @users_project.update_attribute(:project_access, UsersProject::MASTER) - end - - it "should send email to user" do - subject.should_receive(:notification) - @users_project.update_attribute(:project_access, UsersProject::OWNER) - end - - it "should not called after UsersProject destroyed" do - subject.should_not_receive(:after_update) - @users_project.destroy - end - end - - describe "#after_destroy" do - before do - @users_project = create :users_project - end - - it "should called when UsersProject destroyed" do - subject.should_receive(:after_destroy) - @users_project.destroy - end - - it "should create new event" do - Event.should_receive(:create) - @users_project.destroy - end - end - - describe "#after_create" do - it "should send email to user" do - subject.should_receive(:notification) - Event.stub(create: true) - - create(:users_project) - end - - it "should create new event" do - Event.should_receive(:create) - - create(:users_project) - end - end -end diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index 72589da5d40..b145e620122 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -3,8 +3,6 @@ require 'mime/types' describe API::API, api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) {disable_observers} let(:user) { create(:user) } let(:user2) { create(:user) } diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb index 165276d1435..b56269d275d 100644 --- a/spec/requests/api/commits_spec.rb +++ b/spec/requests/api/commits_spec.rb @@ -3,9 +3,6 @@ require 'mime/types' describe API::API, api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) {disable_observers} - let(:user) { create(:user) } let(:user2) { create(:user) } let!(:project) { create(:project, creator_id: user.id) } diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb index edfe935d985..e84122f2fbc 100644 --- a/spec/requests/api/files_spec.rb +++ b/spec/requests/api/files_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:user) { create(:user) } let!(:project) { create(:project, namespace: user.namespace ) } before { project.team << [user, :developer] } diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb index 8797c3fbbbf..dbe8043c633 100644 --- a/spec/requests/api/internal_spec.rb +++ b/spec/requests/api/internal_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:user) { create(:user) } let(:key) { create(:key, user: user) } let(:project) { create(:project) } diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index e62bc844352..dff7f20cb32 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:user) { create(:user) } let!(:project) { create(:project, namespace: user.namespace ) } let!(:issue) { create(:issue, author: user, assignee: user, project: project) } diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 2fb3684fdf0..3611d9d6dc3 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -2,8 +2,6 @@ require "spec_helper" describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } let(:user) { create(:user) } let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb index 0d2740c5acf..f0619a1c801 100644 --- a/spec/requests/api/milestones_spec.rb +++ b/spec/requests/api/milestones_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) {disable_observers} - let(:user) { create(:user) } let!(:project) { create(:project, namespace: user.namespace ) } let!(:milestone) { create(:milestone, project: project) } @@ -92,9 +89,6 @@ describe API::API, api: true do end describe "PUT /projects/:id/milestones/:milestone_id to test observer on close" do - before { enable_observers } - after { disable_observers } - it "should create an activity event when an milestone is closed" do Event.should_receive(:create) diff --git a/spec/requests/api/namespaces_spec.rb b/spec/requests/api/namespaces_spec.rb index 2de7d1e23c3..d9d52468b15 100644 --- a/spec/requests/api/namespaces_spec.rb +++ b/spec/requests/api/namespaces_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:admin) { create(:admin) } let!(:group1) { create(:group) } let!(:group2) { create(:group) } diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb index 2875db04ee4..7aa53787aed 100644 --- a/spec/requests/api/notes_spec.rb +++ b/spec/requests/api/notes_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:user) { create(:user) } let!(:project) { create(:project, namespace: user.namespace ) } let!(:issue) { create(:issue, project: project, author: user) } @@ -128,14 +125,10 @@ describe API::API, api: true do end describe "POST /projects/:id/noteable/:noteable_id/notes to test observer on create" do - before { enable_observers } - after { disable_observers } - it "should create an activity event when an issue note is created" do Event.should_receive(:create) post api("/projects/#{project.id}/issues/#{issue.id}/notes", user), body: 'hi!' end end - end diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb index 6e281f5a43e..cdb5e3d0612 100644 --- a/spec/requests/api/project_hooks_spec.rb +++ b/spec/requests/api/project_hooks_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, 'ProjectHooks', api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) { disable_observers } - let(:user) { create(:user) } let(:user3) { create(:user) } let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) } diff --git a/spec/requests/api/project_members_spec.rb b/spec/requests/api/project_members_spec.rb index 032f850010c..3c480c2ac4b 100644 --- a/spec/requests/api/project_members_spec.rb +++ b/spec/requests/api/project_members_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) { disable_observers } - let(:user) { create(:user) } let(:user2) { create(:user) } let(:user3) { create(:user) } diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 415735091c3..41841e855fd 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -2,9 +2,6 @@ require 'spec_helper' describe API::API, api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) { disable_observers } - let(:user) { create(:user) } let(:user2) { create(:user) } let(:user3) { create(:user) } diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb index 5afb3bddcb7..94850d0f1ae 100644 --- a/spec/requests/api/repositories_spec.rb +++ b/spec/requests/api/repositories_spec.rb @@ -3,9 +3,6 @@ require 'mime/types' describe API::API, api: true do include ApiHelpers - before(:each) { enable_observers } - after(:each) {disable_observers} - let(:user) { create(:user) } let(:user2) { create(:user) } let!(:project) { create(:project, creator_id: user.id) } diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb index 684f8615999..f883c9e028a 100644 --- a/spec/requests/api/services_spec.rb +++ b/spec/requests/api/services_spec.rb @@ -2,9 +2,6 @@ require "spec_helper" describe API::API, api: true do include ApiHelpers - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:user) { create(:user) } let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } diff --git a/spec/services/issues/bulk_update_context_spec.rb b/spec/services/issues/bulk_update_context_spec.rb index 548109a8450..f4c9148f1a3 100644 --- a/spec/services/issues/bulk_update_context_spec.rb +++ b/spec/services/issues/bulk_update_context_spec.rb @@ -1,12 +1,9 @@ require 'spec_helper' describe Issues::BulkUpdateService do - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - let(:issue) { create(:issue, project: @project) - } + } before do @user = create :user @@ -23,7 +20,7 @@ describe Issues::BulkUpdateService do @issues = 5.times.collect do create(:issue, project: @project) end - @params = { + @params = { update: { status: 'closed', issues_ids: @issues.map(&:id) @@ -48,7 +45,7 @@ describe Issues::BulkUpdateService do @issues = 5.times.collect do create(:closed_issue, project: @project) end - @params = { + @params = { update: { status: 'reopen', issues_ids: @issues.map(&:id) @@ -71,7 +68,7 @@ describe Issues::BulkUpdateService do before do @new_assignee = create :user - @params = { + @params = { update: { issues_ids: [issue.id], assignee_id: @new_assignee.id @@ -93,7 +90,7 @@ describe Issues::BulkUpdateService do before do @milestone = create :milestone - @params = { + @params = { update: { issues_ids: [issue.id], milestone_id: @milestone.id diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb index 7324650d534..d4f2cc1339b 100644 --- a/spec/services/issues/close_service_spec.rb +++ b/spec/services/issues/close_service_spec.rb @@ -22,7 +22,7 @@ describe Issues::CloseService do it 'should send email to user2 about assign of new issue' do email = ActionMailer::Base.deliveries.last - email.cc.first.should == user2.email + email.to.first.should == user2.email email.subject.should include(issue.title) end diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb index 47d18565034..347560414e7 100644 --- a/spec/services/issues/update_service_spec.rb +++ b/spec/services/issues/update_service_spec.rb @@ -31,7 +31,7 @@ describe Issues::UpdateService do it 'should send email to user2 about assign of new issue' do email = ActionMailer::Base.deliveries.last - email.cc.first.should == user2.email + email.to.first.should == user2.email email.subject.should include(issue.title) end diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb index 2c5a7c4f26c..a504f916b08 100644 --- a/spec/services/merge_requests/close_service_spec.rb +++ b/spec/services/merge_requests/close_service_spec.rb @@ -22,7 +22,7 @@ describe MergeRequests::CloseService do it 'should send email to user2 about assign of new merge_request' do email = ActionMailer::Base.deliveries.last - email.cc.first.should == user2.email + email.to.first.should == user2.email email.subject.should include(merge_request.title) end diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb index 42ac05862b3..af5d3a3dc81 100644 --- a/spec/services/merge_requests/update_service_spec.rb +++ b/spec/services/merge_requests/update_service_spec.rb @@ -31,7 +31,7 @@ describe MergeRequests::UpdateService do it 'should send email to user2 about assign of new merge_request' do email = ActionMailer::Base.deliveries.last - email.cc.first.should == user2.email + email.to.first.should == user2.email email.subject.should include(merge_request.title) end diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb new file mode 100644 index 00000000000..106c14bc015 --- /dev/null +++ b/spec/services/notes/create_service_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Notes::CreateService do + let(:project) { create(:empty_project) } + let(:issue) { create(:issue, project: project) } + let(:user) { create(:user) } + + describe :execute do + context "valid params" do + before do + project.team << [user, :master] + opts = { + note: 'Awesome comment', + description: 'please fix', + noteable_type: 'Issue', + noteable_id: issue.id + } + + @note = Notes::CreateService.new(project, user, opts).execute + end + + it { @note.should be_valid } + it { @note.note.should == 'Awesome comment' } + end + end +end + diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 0eac6bed74b..74c23418a28 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe Projects::CreateService do - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - describe :create_by_user do before do @user = create :user @@ -66,11 +63,8 @@ describe Projects::CreateService do @settings.stub(:merge_requests) { true } @settings.stub(:wiki) { true } @settings.stub(:snippets) { true } - stub_const("Settings", Class.new) - @restrictions = double("restrictions") - @restrictions.stub(:restricted_visibility_levels) { [] } - Settings.stub_chain(:gitlab).and_return(@restrictions) - Settings.stub_chain(:gitlab, :default_projects_features).and_return(@settings) + Gitlab.config.gitlab.stub(restricted_visibility_levels: []) + Gitlab.config.gitlab.stub(:default_projects_features).and_return(@settings) end context 'should be public when setting is public' do @@ -109,11 +103,9 @@ describe Projects::CreateService do @settings.stub(:wiki) { true } @settings.stub(:snippets) { true } @settings.stub(:visibility_level) { Gitlab::VisibilityLevel::PRIVATE } - stub_const("Settings", Class.new) - @restrictions = double("restrictions") - @restrictions.stub(:restricted_visibility_levels) { [ Gitlab::VisibilityLevel::PUBLIC ] } - Settings.stub_chain(:gitlab).and_return(@restrictions) - Settings.stub_chain(:gitlab, :default_projects_features).and_return(@settings) + @restrictions = [ Gitlab::VisibilityLevel::PUBLIC ] + Gitlab.config.gitlab.stub(restricted_visibility_levels: @restrictions) + Gitlab.config.gitlab.stub(:default_projects_features).and_return(@settings) end context 'should be private when option is public' do @@ -158,4 +150,3 @@ describe Projects::CreateService do Projects::CreateService.new(user, opts).execute end end - diff --git a/spec/services/projects/image_service_spec.rb b/spec/services/projects/image_service_spec.rb index 070c21698cf..23c4e227ae3 100644 --- a/spec/services/projects/image_service_spec.rb +++ b/spec/services/projects/image_service_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe Projects::ImageService do - before(:each) { enable_observers } - after(:each) { disable_observers } - describe 'Image service' do before do @user = create :user diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index 563a8b0c01c..2508dfc4565 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe Projects::TransferService do - before(:each) { enable_observers } - after(:each) {disable_observers} - let(:user) { create(:user) } let(:group) { create(:group) } let(:group2) { create(:group) } diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index 1854c0d8233..bb0470e3771 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe Projects::UpdateService do - before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } - after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } - describe :update_by_user do before do @user = create :user diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index b467282a5d6..daffe98a8ed 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -1,19 +1,18 @@ require 'spec_helper' describe 'Search::GlobalService' do - let(:user) { create(:user, namespace: found_namespace) } - let(:public_user) { create(:user, namespace: public_namespace) } - let(:internal_user) { create(:user, namespace: internal_namespace) } + let(:user) { create(:user) } + let(:public_user) { create(:user) } + let(:internal_user) { create(:user) } - let(:found_namespace) { create(:namespace, name: 'searchable namespace', path:'another_thing') } - let(:unfound_namespace) { create(:namespace, name: 'unfound namespace', path: 'yet_something_else') } - let(:internal_namespace) { create(:namespace, name: 'searchable internal namespace', path: 'something_internal') } - let(:public_namespace) { create(:namespace, name: 'searchable public namespace', path: 'something_public') } + let!(:found_project) { create(:empty_project, :private, name: 'searchable_project') } + let!(:unfound_project) { create(:empty_project, :private, name: 'unfound_project') } + let!(:internal_project) { create(:empty_project, :internal, name: 'searchable_internal_project') } + let!(:public_project) { create(:empty_project, :public, name: 'searchable_public_project') } - let!(:found_project) { create(:project, :private, name: 'searchable_project', creator_id: user.id, namespace: found_namespace) } - let!(:unfound_project) { create(:project, :private, name: 'unfound_project', creator_id: user.id, namespace: unfound_namespace) } - let!(:internal_project) { create(:project, :internal, name: 'searchable_internal_project', creator_id: internal_user.id, namespace: internal_namespace) } - let!(:public_project) { create(:project, :public, name: 'searchable_public_project', creator_id: public_user.id, namespace: public_namespace) } + before do + found_project.team << [user, :master] + end describe '#execute' do context 'unauthenticated' do @@ -38,7 +37,7 @@ describe 'Search::GlobalService' do end it 'namespace name should be searchable' do - context = Search::GlobalService.new(user, search: "searchable namespace") + context = Search::GlobalService.new(user, search: found_project.namespace.path) results = context.execute results[:projects].should match_array [found_project] end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 65a641bcf12..2181238ae9f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -43,7 +43,7 @@ RSpec.configure do |config| # instead of true. config.before(:suite) do - TestEnv.init(observers: false, init_repos: true, repos: false) + TestEnv.init(init_repos: true, repos: false) end config.before(:each) do TestEnv.setup_stubs diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb index cc0ec2f4e3d..7713e9f17d7 100644 --- a/spec/support/login_helpers.rb +++ b/spec/support/login_helpers.rb @@ -3,9 +3,7 @@ module LoginHelpers # # role - User role (e.g., :admin, :user) def login_as(role) - ActiveRecord::Base.observers.enable(:user_observer) do - @user = create(role) - end + @user = create(role) login_with(@user) end diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb index b1bb65a836e..85059dfa9e9 100644 --- a/spec/support/test_env.rb +++ b/spec/support/test_env.rb @@ -17,14 +17,6 @@ module TestEnv def init(opts = {}) RSpec::Mocks::setup(self) - # Disable observers to improve test speed - # - # You can enable it in whole test case where needed by next string: - # - # before(:each) { enable_observers } - # - disable_observers if opts[:observers] == false - # Disable mailer for spinach tests disable_mailer if opts[:mailer] == false setup_stubs @@ -33,14 +25,6 @@ module TestEnv setup_test_repos(opts) if opts[:repos] == true end - def enable_observers - ActiveRecord::Base.observers.enable(:all) - end - - def disable_observers - ActiveRecord::Base.observers.disable(:all) - end - def disable_mailer NotificationService.any_instance.stub(mailer: double.as_null_object) end @@ -89,10 +73,6 @@ module TestEnv Repository.any_instance.stub( size: 12.45 ) - - BaseObserver.any_instance.stub( - current_user: double("current_user", id: 1) - ) end def clear_repo_dir(namespace, name) |
