summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--app/services/merge_requests/base_service.rb4
-rw-r--r--app/views/projects/protected_branches/index.html.haml1
-rw-r--r--doc/install/installation.md4
-rw-r--r--doc/update/6.0-to-6.7.md3
-rw-r--r--doc/update/6.6-to-6.7.md3
-rw-r--r--doc/update/upgrader.md7
-rw-r--r--lib/api/internal.rb4
-rw-r--r--lib/gitlab/git_access.rb20
-rw-r--r--spec/services/merge_requests/close_service_spec.rb35
-rw-r--r--spec/services/merge_requests/create_service_spec.rb25
-rw-r--r--spec/services/merge_requests/update_service_spec.rb44
12 files changed, 140 insertions, 11 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 64a40ca6936..59e3e22524b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,7 @@ v 6.8.0
- Make the repository downloads path configurable
- Create branches via API (sponsored by O'Reilly Media)
- Changed permission of gitlab-satellites directory not to be world accessible
+ - Protected branch does not allow force push
v 6.7.3
- Fix the merge notification email not being sent (Pierre de La Morinerie)
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index a1261972157..c77f5d664ef 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -3,6 +3,10 @@ module MergeRequests
private
+ def create_assignee_note(merge_request)
+ Note.create_assignee_change_note(merge_request, merge_request.project, current_user, merge_request.assignee)
+ end
+
def create_note(merge_request)
Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
end
diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml
index 8b100766e97..4a6e8943a9f 100644
--- a/app/views/projects/protected_branches/index.html.haml
+++ b/app/views/projects/protected_branches/index.html.haml
@@ -9,6 +9,7 @@
%ul
%li keep stable branches secured
%li forced code review before merge to protected branches
+ %li prevents branch from force push
%p Read more about project permissions #{link_to "here", help_permissions_path, class: "underlined-link"}
- if can? current_user, :admin_project, @project
diff --git a/doc/install/installation.md b/doc/install/installation.md
index efcba2f69bf..bc194d33927 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -93,7 +93,7 @@ Then select 'Internet Site' and press enter to confirm the hostname.
# 2. Ruby
-The use of ruby version managers such as [RVM](http://rvm.io/), [rbenv](https://github.com/sstephenson/rbenv) or [chruby](https://github.com/postmodern/chruby) with GitLab in production frequently leads to hard to diagnose problems. Version managers are not supported and we stronly advise everyone to follow the instructions below to use a system ruby.
+The use of ruby version managers such as [RVM](http://rvm.io/), [rbenv](https://github.com/sstephenson/rbenv) or [chruby](https://github.com/postmodern/chruby) with GitLab in production frequently leads to hard to diagnose problems. For example, GitLab Shell is called from OpenSSH and having a version manager can prevent pushing and pulling over SSH. Version managers are not supported and we stronly advise everyone to follow the instructions below to use a system ruby.
Remove the old Ruby 1.8 if present
@@ -202,7 +202,7 @@ You can change `6-6-stable` to `master` if you want the *bleeding edge* version,
# Create directory for satellites
sudo -u git -H mkdir /home/git/gitlab-satellites
- sudo chmod o-rwx /home/git/gitlab-satellites
+ sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites
# Create directories for sockets/pids and make sure GitLab can write to them
sudo -u git -H mkdir tmp/pids/
diff --git a/doc/update/6.0-to-6.7.md b/doc/update/6.0-to-6.7.md
index 5023e34f189..aa1b388fa9a 100644
--- a/doc/update/6.0-to-6.7.md
+++ b/doc/update/6.0-to-6.7.md
@@ -80,6 +80,9 @@ sudo -u git -H bundle exec rake migrate_iids RAILS_ENV=production
# Clean up assets and cache
sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production
+
+# Close access to gitlab-satellites for others
+sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites
```
### 6. Update config files
diff --git a/doc/update/6.6-to-6.7.md b/doc/update/6.6-to-6.7.md
index 8a16e5d67be..0f39c037c9f 100644
--- a/doc/update/6.6-to-6.7.md
+++ b/doc/update/6.6-to-6.7.md
@@ -63,6 +63,9 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
# Update the logrotate configuration (keep logs for 90 days instead of 52 weeks)
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
+
+# Close access to gitlab-satellites for others
+sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites
```
diff --git a/doc/update/upgrader.md b/doc/update/upgrader.md
index 305ef961be5..fd45154ac82 100644
--- a/doc/update/upgrader.md
+++ b/doc/update/upgrader.md
@@ -40,3 +40,10 @@ To make sure you didn't miss anything run a more thorough check with:
sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
If all items are green, then congratulations upgrade is complete!
+
+
+### One line upgrade command
+
+You've read through the entire guide, and probably did all the steps manually. Here is a one liner for convenience, the next time you upgrade:
+
+ cd /home/git/gitlab; sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production; sudo service gitlab stop; sudo -u git -H ruby script/upgrade.rb -y; sudo service gitlab start; sudo service nginx restart; sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
index bcf97574673..06c66ba0b35 100644
--- a/lib/api/internal.rb
+++ b/lib/api/internal.rb
@@ -10,6 +10,7 @@ module API
# project - project path with namespace
# action - git action (git-upload-pack or git-receive-pack)
# ref - branch name
+ # forced_push - forced_push
#
get "/allowed" do
# Check for *.wiki repositories.
@@ -35,7 +36,8 @@ module API
project,
params[:ref],
params[:oldrev],
- params[:newrev]
+ params[:newrev],
+ params[:forced_push]
)
end
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index 1ab8f9213a3..eefdb1833fc 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -5,7 +5,7 @@ module Gitlab
attr_reader :params, :project, :git_cmd, :user
- def allowed?(actor, cmd, project, ref = nil, oldrev = nil, newrev = nil)
+ def allowed?(actor, cmd, project, ref = nil, oldrev = nil, newrev = nil, forced_push = false)
case cmd
when *DOWNLOAD_COMMANDS
if actor.is_a? User
@@ -19,12 +19,12 @@ module Gitlab
end
when *PUSH_COMMANDS
if actor.is_a? User
- push_allowed?(actor, project, ref, oldrev, newrev)
+ push_allowed?(actor, project, ref, oldrev, newrev, forced_push)
elsif actor.is_a? DeployKey
# Deploy key not allowed to push
return false
elsif actor.is_a? Key
- push_allowed?(actor.user, project, ref, oldrev, newrev)
+ push_allowed?(actor.user, project, ref, oldrev, newrev, forced_push)
else
raise 'Wrong actor'
end
@@ -41,13 +41,17 @@ module Gitlab
end
end
- def push_allowed?(user, project, ref, oldrev, newrev)
+ def push_allowed?(user, project, ref, oldrev, newrev, forced_push)
if user && user_allowed?(user)
action = if project.protected_branch?(ref)
- :push_code_to_protected_branches
- else
- :push_code
- end
+ if forced_push.to_s == 'true'
+ :force_push_code_to_protected_branches
+ else
+ :push_code_to_protected_branches
+ end
+ else
+ :push_code
+ end
user.can?(action, project)
else
false
diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb
new file mode 100644
index 00000000000..a504f916b08
--- /dev/null
+++ b/spec/services/merge_requests/close_service_spec.rb
@@ -0,0 +1,35 @@
+require 'spec_helper'
+
+describe MergeRequests::CloseService do
+ let(:user) { create(:user) }
+ let(:user2) { create(:user) }
+ let(:merge_request) { create(:merge_request, assignee: user2) }
+ let(:project) { merge_request.project }
+
+ before do
+ project.team << [user, :master]
+ project.team << [user2, :developer]
+ end
+
+ describe :execute do
+ context "valid params" do
+ before do
+ @merge_request = MergeRequests::CloseService.new(project, user, {}).execute(merge_request)
+ end
+
+ it { @merge_request.should be_valid }
+ it { @merge_request.should be_closed }
+
+ it 'should send email to user2 about assign of new merge_request' do
+ email = ActionMailer::Base.deliveries.last
+ email.to.first.should == user2.email
+ email.subject.should include(merge_request.title)
+ end
+
+ it 'should create system note about merge_request reassign' do
+ note = @merge_request.notes.last
+ note.note.should include "Status changed to closed"
+ end
+ end
+ end
+end
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
new file mode 100644
index 00000000000..cebeb0644d0
--- /dev/null
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe MergeRequests::CreateService do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+
+ describe :execute do
+ context "valid params" do
+ before do
+ project.team << [user, :master]
+ opts = {
+ title: 'Awesome merge_request',
+ description: 'please fix',
+ source_branch: 'stable',
+ target_branch: 'master'
+ }
+
+ @merge_request = MergeRequests::CreateService.new(project, user, opts).execute
+ end
+
+ it { @merge_request.should be_valid }
+ it { @merge_request.title.should == 'Awesome merge_request' }
+ end
+ end
+end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
new file mode 100644
index 00000000000..af5d3a3dc81
--- /dev/null
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -0,0 +1,44 @@
+require 'spec_helper'
+
+describe MergeRequests::UpdateService do
+ let(:user) { create(:user) }
+ let(:user2) { create(:user) }
+ let(:merge_request) { create(:merge_request, :simple) }
+ let(:project) { merge_request.project }
+
+ before do
+ project.team << [user, :master]
+ project.team << [user2, :developer]
+ end
+
+ describe :execute do
+ context "valid params" do
+ before do
+ opts = {
+ title: 'New title',
+ description: 'Also please fix',
+ assignee_id: user2.id,
+ state_event: 'close'
+ }
+
+ @merge_request = MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+ end
+
+ it { @merge_request.should be_valid }
+ it { @merge_request.title.should == 'New title' }
+ it { @merge_request.assignee.should == user2 }
+ it { @merge_request.should be_closed }
+
+ it 'should send email to user2 about assign of new merge_request' do
+ email = ActionMailer::Base.deliveries.last
+ email.to.first.should == user2.email
+ email.subject.should include(merge_request.title)
+ end
+
+ it 'should create system note about merge_request reassign' do
+ note = @merge_request.notes.last
+ note.note.should include "Reassigned to \@#{user2.username}"
+ end
+ end
+ end
+end