summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock3
-rw-r--r--VERSION2
-rw-r--r--app/assets/javascripts/merge_request.js.coffee4
-rw-r--r--app/assets/stylesheets/application.scss8
-rw-r--r--app/assets/stylesheets/generic/common.scss2
-rw-r--r--app/assets/stylesheets/generic/forms.scss28
-rw-r--r--app/assets/stylesheets/generic/jquery.scss4
-rw-r--r--app/assets/stylesheets/generic/selects.scss2
-rw-r--r--app/assets/stylesheets/gl_bootstrap.scss2
-rw-r--r--app/assets/stylesheets/main/variables.scss6
-rw-r--r--app/assets/stylesheets/sections/commits.scss24
-rw-r--r--app/assets/stylesheets/sections/header.scss6
-rw-r--r--app/assets/stylesheets/sections/nav.scss2
-rw-r--r--app/assets/stylesheets/sections/profile.scss15
-rw-r--r--app/assets/stylesheets/themes/ui_basic.scss18
-rw-r--r--app/controllers/admin/projects_controller.rb8
-rw-r--r--app/controllers/application_controller.rb2
-rw-r--r--app/controllers/projects/notes_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb3
-rw-r--r--app/controllers/users_sessions_controller.rb6
-rw-r--r--app/mailers/emails/groups.rb2
-rw-r--r--app/mailers/emails/issues.rb32
-rw-r--r--app/mailers/emails/merge_requests.rb32
-rw-r--r--app/mailers/emails/notes.rb23
-rw-r--r--app/mailers/emails/projects.rb6
-rw-r--r--app/mailers/notify.rb66
-rw-r--r--app/models/event.rb9
-rw-r--r--app/models/note.rb5
-rw-r--r--app/models/project_team.rb19
-rw-r--r--app/models/user.rb36
-rw-r--r--app/models/users_group.rb17
-rw-r--r--app/models/users_project.rb37
-rw-r--r--app/observers/base_observer.rb13
-rw-r--r--app/observers/note_observer.rb20
-rw-r--r--app/observers/project_activity_cache_observer.rb8
-rw-r--r--app/observers/project_observer.rb30
-rw-r--r--app/observers/system_hook_observer.rb17
-rw-r--r--app/observers/user_observer.rb20
-rw-r--r--app/observers/users_group_observer.rb9
-rw-r--r--app/observers/users_project_observer.rb23
-rw-r--r--app/services/base_service.rb4
-rw-r--r--app/services/notes/create_service.rb19
-rw-r--r--app/services/projects/create_service.rb3
-rw-r--r--app/services/projects/destroy_service.rb28
-rw-r--r--app/services/projects/update_service.rb10
-rw-r--r--app/views/dashboard/show.html.haml4
-rw-r--r--app/views/devise/sessions/_new_base.html.haml4
-rw-r--r--app/views/groups/show.html.haml4
-rw-r--r--app/views/layouts/_public_head_panel.html.haml4
-rw-r--r--app/views/layouts/_search.html.haml2
-rw-r--r--app/views/projects/blob/_blob.html.haml2
-rw-r--r--app/views/projects/merge_requests/_show.html.haml3
-rw-r--r--app/views/projects/notes/_form.html.haml4
-rw-r--r--app/views/projects/show.html.haml4
-rw-r--r--app/views/projects/tree/_readme.html.haml2
-rw-r--r--config/application.rb9
-rw-r--r--config/routes.rb2
-rw-r--r--db/fixtures/development/07_milestones.rb4
-rw-r--r--doc/install/requirements.md6
-rw-r--r--doc/release/monthly.md31
-rw-r--r--doc/update/6.0-to-7.0.md (renamed from doc/update/6.0-to-6.8.md)20
-rw-r--r--doc/update/6.9-to-7.0.md4
-rw-r--r--features/admin/projects.feature6
-rw-r--r--features/project/redirects.feature7
-rw-r--r--features/steps/admin/projects.rb26
-rw-r--r--features/steps/project/redirects.rb22
-rw-r--r--lib/api/notes.rb13
-rw-r--r--lib/gitlab/markdown.rb2
-rw-r--r--lib/tasks/cache.rake7
-rw-r--r--spec/features/admin/admin_users_spec.rb18
-rw-r--r--spec/features/profile_spec.rb2
-rw-r--r--spec/features/projects_spec.rb2
-rw-r--r--spec/features/search_spec.rb1
-rw-r--r--spec/mailers/notify_spec.rb53
-rw-r--r--spec/models/event_spec.rb22
-rw-r--r--spec/models/project_spec.rb3
-rw-r--r--spec/models/project_team_spec.rb72
-rw-r--r--spec/models/system_hook_spec.rb9
-rw-r--r--spec/models/user_spec.rb6
-rw-r--r--spec/models/users_group_spec.rb28
-rw-r--r--spec/observers/note_observer_spec.rb56
-rw-r--r--spec/observers/user_observer_spec.rb27
-rw-r--r--spec/observers/users_group_observer_spec.rb32
-rw-r--r--spec/observers/users_project_observer_spec.rb63
-rw-r--r--spec/requests/api/branches_spec.rb2
-rw-r--r--spec/requests/api/commits_spec.rb3
-rw-r--r--spec/requests/api/files_spec.rb3
-rw-r--r--spec/requests/api/internal_spec.rb3
-rw-r--r--spec/requests/api/issues_spec.rb3
-rw-r--r--spec/requests/api/merge_requests_spec.rb2
-rw-r--r--spec/requests/api/milestones_spec.rb6
-rw-r--r--spec/requests/api/namespaces_spec.rb3
-rw-r--r--spec/requests/api/notes_spec.rb7
-rw-r--r--spec/requests/api/project_hooks_spec.rb3
-rw-r--r--spec/requests/api/project_members_spec.rb3
-rw-r--r--spec/requests/api/projects_spec.rb3
-rw-r--r--spec/requests/api/repositories_spec.rb3
-rw-r--r--spec/requests/api/services_spec.rb3
-rw-r--r--spec/services/issues/bulk_update_context_spec.rb13
-rw-r--r--spec/services/issues/close_service_spec.rb2
-rw-r--r--spec/services/issues/update_service_spec.rb2
-rw-r--r--spec/services/merge_requests/close_service_spec.rb2
-rw-r--r--spec/services/merge_requests/update_service_spec.rb2
-rw-r--r--spec/services/notes/create_service_spec.rb27
-rw-r--r--spec/services/projects/create_service_spec.rb19
-rw-r--r--spec/services/projects/image_service_spec.rb3
-rw-r--r--spec/services/projects/transfer_service_spec.rb3
-rw-r--r--spec/services/projects/update_service_spec.rb3
-rw-r--r--spec/services/search_service_spec.rb23
-rw-r--r--spec/spec_helper.rb2
-rw-r--r--spec/support/login_helpers.rb4
-rw-r--r--spec/support/test_env.rb20
113 files changed, 614 insertions, 780 deletions
diff --git a/Gemfile b/Gemfile
index c64213479f7..39ffd95b2e2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -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)
diff --git a/VERSION b/VERSION
index cc3a17b9475..66ce77b7ead 100644
--- a/VERSION
+++ b/VERSION
@@ -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 &amp; 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 &amp; 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)