Merge branch 'deploy_keys'
Conflicts: app/views/layouts/project.html.haml db/schema.rb
This commit is contained in:
commit
cbd78922ee
44
app/controllers/deploy_keys_controller.rb
Normal file
44
app/controllers/deploy_keys_controller.rb
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
class DeployKeysController < ApplicationController
|
||||||
|
respond_to :js, :html
|
||||||
|
layout "project"
|
||||||
|
before_filter :project
|
||||||
|
|
||||||
|
# Authorize
|
||||||
|
before_filter :add_project_abilities
|
||||||
|
before_filter :authorize_admin_project!
|
||||||
|
|
||||||
|
def project
|
||||||
|
@project ||= Project.find_by_code(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def index
|
||||||
|
@keys = @project.deploy_keys.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@key = @project.deploy_keys.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
@key = @project.deploy_keys.new
|
||||||
|
|
||||||
|
respond_with(@key)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@key = @project.deploy_keys.new(params[:key])
|
||||||
|
@key.save
|
||||||
|
|
||||||
|
respond_with(@key)
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@key = @project.deploy_keys.find(params[:id])
|
||||||
|
@key.destroy
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html { redirect_to project_deploy_keys_url }
|
||||||
|
format.js { render :nothing => true }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,5 +1,6 @@
|
||||||
class Key < ActiveRecord::Base
|
class Key < ActiveRecord::Base
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
belongs_to :project
|
||||||
|
|
||||||
validates :title,
|
validates :title,
|
||||||
:presence => true,
|
:presence => true,
|
||||||
|
@ -15,7 +16,11 @@ class Key < ActiveRecord::Base
|
||||||
after_destroy :repository_delete_key
|
after_destroy :repository_delete_key
|
||||||
|
|
||||||
def set_identifier
|
def set_identifier
|
||||||
self.identifier = "#{user.identifier}_#{Time.now.to_i}"
|
if is_deploy_key
|
||||||
|
self.identifier = "deploy_#{project.code}_#{Time.now.to_i}"
|
||||||
|
else
|
||||||
|
self.identifier = "#{user.identifier}_#{Time.now.to_i}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_repository
|
def update_repository
|
||||||
|
@ -31,10 +36,18 @@ class Key < ActiveRecord::Base
|
||||||
c.update_projects(projects)
|
c.update_projects(projects)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def is_deploy_key
|
||||||
|
true if project_id
|
||||||
|
end
|
||||||
|
|
||||||
#projects that has this key
|
#projects that has this key
|
||||||
def projects
|
def projects
|
||||||
user.projects
|
if is_deploy_key
|
||||||
|
[project]
|
||||||
|
else
|
||||||
|
user.projects
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
|
|
|
@ -14,6 +14,7 @@ class Project < ActiveRecord::Base
|
||||||
has_many :users, :through => :users_projects
|
has_many :users, :through => :users_projects
|
||||||
has_many :notes, :dependent => :destroy
|
has_many :notes, :dependent => :destroy
|
||||||
has_many :snippets, :dependent => :destroy
|
has_many :snippets, :dependent => :destroy
|
||||||
|
has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key"
|
||||||
has_many :web_hooks, :dependent => :destroy
|
has_many :web_hooks, :dependent => :destroy
|
||||||
|
|
||||||
acts_as_taggable
|
acts_as_taggable
|
||||||
|
@ -199,7 +200,7 @@ class Project < ActiveRecord::Base
|
||||||
def repository_readers
|
def repository_readers
|
||||||
keys = Key.joins({:user => :users_projects}).
|
keys = Key.joins({:user => :users_projects}).
|
||||||
where("users_projects.project_id = ? AND users_projects.repo_access = ?", id, Repository::REPO_R)
|
where("users_projects.project_id = ? AND users_projects.repo_access = ?", id, Repository::REPO_R)
|
||||||
keys.map(&:identifier)
|
keys.map(&:identifier) + deploy_keys.map(&:identifier)
|
||||||
end
|
end
|
||||||
|
|
||||||
def repository_writers
|
def repository_writers
|
||||||
|
|
16
app/views/deploy_keys/_form.html.haml
Normal file
16
app/views/deploy_keys/_form.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
%div
|
||||||
|
= form_for [@project, @key], :url => project_deploy_keys_path, :remote => true do |f|
|
||||||
|
-if @key.errors.any?
|
||||||
|
%ul
|
||||||
|
- @key.errors.full_messages.each do |msg|
|
||||||
|
%li= msg
|
||||||
|
|
||||||
|
.form-row
|
||||||
|
= f.label :title
|
||||||
|
= f.text_field :title, :style => "width:300px"
|
||||||
|
.form-row
|
||||||
|
= f.label :key
|
||||||
|
= f.text_area :key, :style => "width:300px; height:130px"
|
||||||
|
.form-row
|
||||||
|
= f.submit 'Save', :class => "grey-button"
|
||||||
|
|
7
app/views/deploy_keys/_show.html.haml
Normal file
7
app/views/deploy_keys/_show.html.haml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
%a.update-item{:href => project_deploy_key_path(key.project, key)}
|
||||||
|
%span.update-title
|
||||||
|
= key.title
|
||||||
|
%span.update-author
|
||||||
|
Added
|
||||||
|
= time_ago_in_words(key.created_at)
|
||||||
|
ago
|
9
app/views/deploy_keys/create.js.haml
Normal file
9
app/views/deploy_keys/create.js.haml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
- if @key.valid?
|
||||||
|
:plain
|
||||||
|
$("#new_key_dialog").dialog("close");
|
||||||
|
$("#keys-table .data").append("#{escape_javascript(render(:partial => 'show', :locals => {:key => @key} ))}");
|
||||||
|
$("#no_ssh_key_defined").hide();
|
||||||
|
- else
|
||||||
|
:plain
|
||||||
|
$("#new_key_dialog").empty();
|
||||||
|
$("#new_key_dialog").append("#{escape_javascript(render('form'))}");
|
7
app/views/deploy_keys/edit.html.haml
Normal file
7
app/views/deploy_keys/edit.html.haml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
%h1 Editing key
|
||||||
|
|
||||||
|
= render 'form'
|
||||||
|
|
||||||
|
= link_to 'Show', @key
|
||||||
|
\|
|
||||||
|
= link_to 'Back', project_deploy_keys_path
|
11
app/views/deploy_keys/index.html.haml
Normal file
11
app/views/deploy_keys/index.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
= render "repositories/head"
|
||||||
|
|
||||||
|
%div#keys-table{ :class => "update-data ui-box ui-box-small ui-box-big" }
|
||||||
|
.data
|
||||||
|
- @keys.each do |key|
|
||||||
|
= render(:partial => 'show', :locals => {:key => key})
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$('.delete-key').live('ajax:success', function() {
|
||||||
|
$(this).closest('.update-item').fadeOut(); });
|
||||||
|
|
5
app/views/deploy_keys/new.html.haml
Normal file
5
app/views/deploy_keys/new.html.haml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
%h1 New key
|
||||||
|
|
||||||
|
= render 'form'
|
||||||
|
|
||||||
|
= link_to 'Back', project_deploy_keys_path
|
11
app/views/deploy_keys/new.js.haml
Normal file
11
app/views/deploy_keys/new.js.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
:plain
|
||||||
|
var new_key_dialog = $("<div id='new_key_dialog'></div>");
|
||||||
|
new_key_dialog.html("#{escape_javascript(render('form'))}");
|
||||||
|
$(new_key_dialog).dialog({
|
||||||
|
width: 350,
|
||||||
|
resizable: false,
|
||||||
|
draggable: false,
|
||||||
|
title: "Add new public key",
|
||||||
|
close: function(event, ui) { $("#new_key_dialog").remove();},
|
||||||
|
modal: true
|
||||||
|
});
|
10
app/views/deploy_keys/show.html.haml
Normal file
10
app/views/deploy_keys/show.html.haml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.ui-box.width-100p
|
||||||
|
%h3= @key.title
|
||||||
|
.data
|
||||||
|
%pre= @key.key
|
||||||
|
.clear
|
||||||
|
.buttons
|
||||||
|
= link_to 'Remove', project_deploy_key_path(@key.project, @key), :confirm => 'Are you sure?', :method => :delete, :class => "red-button delete-key right"
|
||||||
|
.clear
|
||||||
|
|
||||||
|
|
|
@ -44,5 +44,6 @@
|
||||||
%span{ :class => "number" }= @project.merge_requests.opened.count
|
%span{ :class => "number" }= @project.merge_requests.opened.count
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.project-content
|
.project-content
|
||||||
= yield
|
= yield
|
||||||
|
|
|
@ -11,13 +11,18 @@
|
||||||
= link_to project_hooks_path, :class => "tab #{'active' if controller.controller_name == "hooks" }" do
|
= link_to project_hooks_path, :class => "tab #{'active' if controller.controller_name == "hooks" }" do
|
||||||
%span
|
%span
|
||||||
Hooks
|
Hooks
|
||||||
-#= link_to "#", :class => "tab" do
|
- if can? current_user, :admin_project, @project
|
||||||
%span
|
= link_to project_deploy_keys_path(@project), :class => "tab #{'active' if controller.controller_name == "deploy_keys"}" do
|
||||||
Deploy Keys
|
%span
|
||||||
|
Deploy Keys
|
||||||
|
|
||||||
- if current_page?(project_hooks_path(@project))
|
- if current_page?(project_hooks_path(@project))
|
||||||
- if can? current_user, :admin_project, @project
|
- if can? current_user, :admin_project, @project
|
||||||
= link_to new_project_hook_path(@project), :class => "add_new", :title => "New Web Hook" do
|
= link_to new_project_hook_path(@project), :class => "add_new", :title => "New Web Hook" do
|
||||||
= image_tag "add_new.png", :width => 14
|
= image_tag "add_new.png", :width => 14
|
||||||
|
|
||||||
|
- if current_page?(project_deploy_keys_path(@project))
|
||||||
|
- if can? current_user, :admin_project, @project
|
||||||
|
= link_to new_project_deploy_key_path(@project), :class => "add_new", :title => "New Deploy Key", :remote => true do
|
||||||
|
= image_tag "add_new.png", :width => 14
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,8 @@ Gitlab::Application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resources :deploy_keys
|
||||||
|
|
||||||
resources :refs, :only => [], :path => "/" do
|
resources :refs, :only => [], :path => "/" do
|
||||||
collection do
|
collection do
|
||||||
get "switch"
|
get "switch"
|
||||||
|
|
6
db/migrate/20111231111825_add_project_id_to_key.rb
Normal file
6
db/migrate/20111231111825_add_project_id_to_key.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
class AddProjectIdToKey < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :keys, :project_id, :integer, :null => true
|
||||||
|
change_column :keys, :user_id, :integer, :null => true
|
||||||
|
end
|
||||||
|
end
|
|
@ -39,12 +39,13 @@ ActiveRecord::Schema.define(:version => 20120110180749) do
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "keys", :force => true do |t|
|
create_table "keys", :force => true do |t|
|
||||||
t.integer "user_id", :null => false
|
t.integer "user_id"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.text "key"
|
t.text "key"
|
||||||
t.string "title"
|
t.string "title"
|
||||||
t.string "identifier"
|
t.string "identifier"
|
||||||
|
t.integer "project_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "merge_requests", :force => true do |t|
|
create_table "merge_requests", :force => true do |t|
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe Key do
|
describe Key do
|
||||||
describe "Associations" do
|
describe "Associations" do
|
||||||
it { should belong_to(:user) }
|
it { should belong_to(:user) or belong_to(:project) }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "Validation" do
|
describe "Validation" do
|
||||||
|
|
68
spec/requests/projects_deploy_keys_spec.rb
Normal file
68
spec/requests/projects_deploy_keys_spec.rb
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe "Projects", "DeployKeys" do
|
||||||
|
let(:project) { Factory :project }
|
||||||
|
|
||||||
|
before do
|
||||||
|
login_as :user
|
||||||
|
project.add_access(@user, :read, :write, :admin)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "GET /keys" do
|
||||||
|
before do
|
||||||
|
@key = Factory :key, :project => project
|
||||||
|
visit project_deploy_keys_path(project)
|
||||||
|
end
|
||||||
|
|
||||||
|
subject { page }
|
||||||
|
|
||||||
|
it { should have_content(@key.title) }
|
||||||
|
|
||||||
|
describe "Destroy" do
|
||||||
|
before { visit project_deploy_key_path(project, @key) }
|
||||||
|
|
||||||
|
it "should remove entry" do
|
||||||
|
expect {
|
||||||
|
click_link "Remove"
|
||||||
|
}.to change { project.deploy_keys.count }.by(-1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "New key", :js => true do
|
||||||
|
before do
|
||||||
|
visit project_deploy_keys_path(project)
|
||||||
|
click_link "New Deploy Key"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should open new key popup" do
|
||||||
|
page.should have_content("Add new public key")
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "fill in" do
|
||||||
|
before do
|
||||||
|
fill_in "key_title", :with => "laptop"
|
||||||
|
fill_in "key_key", :with => "publickey234="
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect { click_button "Save" }.to change {Key.count}.by(1) }
|
||||||
|
|
||||||
|
it "should add new key to table" do
|
||||||
|
click_button "Save"
|
||||||
|
|
||||||
|
page.should_not have_content("Add new public key")
|
||||||
|
page.should have_content "laptop"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "Show page" do
|
||||||
|
before do
|
||||||
|
@key = Factory :key, :project => project
|
||||||
|
visit project_deploy_key_path(project, @key)
|
||||||
|
end
|
||||||
|
|
||||||
|
it { page.should have_content @key.title }
|
||||||
|
it { page.should have_content @key.key[0..10] }
|
||||||
|
end
|
||||||
|
end
|
|
@ -105,6 +105,15 @@ describe "Projects" do
|
||||||
it { edit_project_path(@project).should be_denied_for :visitor }
|
it { edit_project_path(@project).should be_denied_for :visitor }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "GET /project_code/deploy_keys" do
|
||||||
|
it { project_deploy_keys_path(@project).should be_allowed_for @u1 }
|
||||||
|
it { project_deploy_keys_path(@project).should be_denied_for @u3 }
|
||||||
|
it { project_deploy_keys_path(@project).should be_denied_for :admin }
|
||||||
|
it { project_deploy_keys_path(@project).should be_denied_for @u2 }
|
||||||
|
it { project_deploy_keys_path(@project).should be_denied_for :user }
|
||||||
|
it { project_deploy_keys_path(@project).should be_denied_for :visitor }
|
||||||
|
end
|
||||||
|
|
||||||
describe "GET /project_code/issues" do
|
describe "GET /project_code/issues" do
|
||||||
it { project_issues_path(@project).should be_allowed_for @u1 }
|
it { project_issues_path(@project).should be_allowed_for @u1 }
|
||||||
it { project_issues_path(@project).should be_allowed_for @u3 }
|
it { project_issues_path(@project).should be_allowed_for @u3 }
|
||||||
|
|
Loading…
Reference in a new issue