Fixed: post-receive, project remove, tests

This commit is contained in:
Dmitriy Zaporozhets 2013-02-05 12:47:50 +02:00
parent 39e37677f2
commit 70e3bffd95
9 changed files with 43 additions and 47 deletions

View file

@ -15,11 +15,10 @@ class ProjectObserver < ActiveRecord::Observer
def after_destroy(project) def after_destroy(project)
GitoliteWorker.perform_async( GitoliteWorker.perform_async(
:remove_repository, :remove_repository,
self.path_with_namespace project.path_with_namespace
) )
project.satellite.destroy project.satellite.destroy
project.destroy_repository
log_info("Project \"#{project.name}\" was removed") log_info("Project \"#{project.name}\" was removed")
end end

View file

@ -27,8 +27,9 @@ class PostReceive
User.find_by_email(email) if email User.find_by_email(email) if email
elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier) elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier)
User.find_by_email(identifier) User.find_by_email(identifier)
else elsif identifier =~ /key/
User.find_by_username(identifier.strip) key_id = identifier.gsub("key-", "")
Key.find_by_id(key_id).try(:user)
end end
unless user unless user

View file

@ -1,23 +1,37 @@
module Gitlab module Gitlab
# Access API # Internal access API
class Internal < Grape::API class Internal < Grape::API
namespace 'internal' do
#
# Check if ssh key has access to project code
#
get "/allowed" do
key = Key.find(params[:key_id])
user = key.user
get "/allowed" do project = Project.find_with_namespace(params[:project])
user = User.find_by_username(params[:username]) action = case params[:action]
project = Project.find_with_namespace(params[:project]) when 'git-upload-pack'
action = case params[:action] then :download_code
when 'git-upload-pack' when 'git-receive-pack'
then :download_code then
when 'git-receive-pack' if project.protected_branch?(params[:ref])
then :push_code_to_protected_branches
if project.protected_branch?(params[:ref]) else
:push_code_to_protected_branches :push_code
else end
:push_code
end end
end
user.can?(action, project) user.can?(action, project)
end
#
# Discover user by ssh key
#
get "/discover" do
key = Key.find(params[:key_id])
present key.user, with: Entities::User
end
end end
end end
end end

View file

@ -1,16 +1,15 @@
require 'spec_helper' require 'spec_helper'
describe Gitlab::Gitolite do describe Gitlab::Shell do
let(:project) { double('Project', id: 7, path: 'diaspora') } let(:project) { double('Project', id: 7, path: 'diaspora') }
let(:gitolite) { Gitlab::Gitolite.new } let(:gitolite) { Gitlab::Shell.new }
before do before do
Project.stub(find: project) Project.stub(find: project)
end end
it { should respond_to :set_key } it { should respond_to :add_key }
it { should respond_to :remove_key } it { should respond_to :remove_key }
it { should respond_to :add_repository } it { should respond_to :add_repository }
it { should respond_to :remove_repository } it { should respond_to :remove_repository }

View file

@ -77,8 +77,6 @@ describe Project do
it { should respond_to(:url_to_repo) } it { should respond_to(:url_to_repo) }
it { should respond_to(:repo_exists?) } it { should respond_to(:repo_exists?) }
it { should respond_to(:satellite) } it { should respond_to(:satellite) }
it { should respond_to(:update_repository) }
it { should respond_to(:destroy_repository) }
it { should respond_to(:observe_push) } it { should respond_to(:observe_push) }
it { should respond_to(:update_merge_requests) } it { should respond_to(:update_merge_requests) }
it { should respond_to(:execute_hooks) } it { should respond_to(:execute_hooks) }

View file

@ -24,19 +24,4 @@ describe ProtectedBranch do
it { should validate_presence_of(:project) } it { should validate_presence_of(:project) }
it { should validate_presence_of(:name) } it { should validate_presence_of(:name) }
end end
describe 'Callbacks' do
let(:branch) { build(:protected_branch) }
it 'call update_repository after save' do
branch.should_receive(:update_repository)
branch.save
end
it 'call update_repository after destroy' do
branch.save
branch.should_receive(:update_repository)
branch.destroy
end
end
end end

View file

@ -3,7 +3,7 @@ require 'spec_helper'
describe KeyObserver do describe KeyObserver do
before do before do
@key = double('Key', @key = double('Key',
identifier: 'admin_654654', shell_id: 'key-32',
key: '== a vaild ssh key', key: '== a vaild ssh key',
projects: [], projects: [],
is_deploy_key: false is_deploy_key: false
@ -14,14 +14,14 @@ describe KeyObserver do
context :after_save do context :after_save do
it do it do
GitoliteWorker.should_receive(:perform_async).with(:set_key, @key.identifier, @key.key, @key.projects.map(&:id)) GitoliteWorker.should_receive(:perform_async).with(:add_key, @key.shell_id, @key.key)
@observer.after_save(@key) @observer.after_save(@key)
end end
end end
context :after_destroy do context :after_destroy do
it do it do
GitoliteWorker.should_receive(:perform_async).with(:remove_key, @key.identifier, @key.projects.map(&:id)) GitoliteWorker.should_receive(:perform_async).with(:remove_key, @key.shell_id, @key.key)
@observer.after_destroy(@key) @observer.after_destroy(@key)
end end
end end

View file

@ -48,11 +48,11 @@ module Gitlab
true true
end end
def add_key name, key def add_key id, key
true true
end end
def remove_key key def remove_key id, key
true true
end end
end end

View file

@ -11,7 +11,7 @@ describe PostReceive do
context "web hook" do context "web hook" do
let(:project) { create(:project) } let(:project) { create(:project) }
let(:key) { create(:key, user: project.owner) } let(:key) { create(:key, user: project.owner) }
let(:key_id) { key.identifier } let(:key_id) { key.shell_id }
it "fetches the correct project" do it "fetches the correct project" do
Project.should_receive(:find_with_namespace).with(project.path_with_namespace).and_return(project) Project.should_receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
@ -19,7 +19,7 @@ describe PostReceive do
end end
it "does not run if the author is not in the project" do it "does not run if the author is not in the project" do
Key.stub(find_by_identifier: nil) Key.stub(find_by_id: nil)
project.should_not_receive(:observe_push) project.should_not_receive(:observe_push)
project.should_not_receive(:execute_hooks) project.should_not_receive(:execute_hooks)