Skip to content
Snippets Groups Projects
Commit bdc65809 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

refcatoring. cleaning after gitosis

parent 8134fe0e
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -3,8 +3,8 @@ class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :abilities, :can?
 
rescue_from Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied do |exception|
render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false
rescue_from Gitlabhq::Gitolite::AccessDenied do |exception|
render :file => File.join(Rails.root, "public", "githost_error"), :layout => false
end
 
layout :layout_by_resource
Loading
Loading
class ErrorsController < ApplicationController
def gitosis
render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false
def githost
render :file => File.join(Rails.root, "public", "githost_error"), :layout => false
end
end
Loading
Loading
@@ -42,8 +42,8 @@ class ProjectsController < ApplicationController
format.js
end
end
rescue Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied
render :js => "location.href = '#{errors_gitosis_path}'" and return
rescue Gitlabhq::Gitolite::AccessDenied
render :js => "location.href = '#{errors_githost_path}'" and return
rescue StandardError => ex
@project.errors.add(:base, "Cant save project. Please try again later")
respond_to do |format|
Loading
Loading
Loading
Loading
@@ -11,29 +11,29 @@ class Key < ActiveRecord::Base
:length => { :within => 0..5000 }
 
before_save :set_identifier
after_save :update_gitosis
after_destroy :gitosis_delete_key
after_save :update_repository
after_destroy :repository_delete_key
 
def set_identifier
self.identifier = "#{user.identifier}_#{Time.now.to_i}"
end
 
def update_gitosis
def update_repository
Gitlabhq::GitHost.system.new.configure do |c|
c.update_keys(identifier, key)
 
projects.each do |project|
c.update_project(project.path, project.gitosis_writers)
c.update_project(project.path, project.repository_writers)
end
end
end
 
def gitosis_delete_key
def repository_delete_key
Gitlabhq::GitHost.system.new.configure do |c|
c.delete_key(identifier)
 
projects.each do |project|
c.update_project(project.path, project.gitosis_writers)
c.update_project(project.path, project.repository_writers)
end
end
end
Loading
Loading
Loading
Loading
@@ -40,8 +40,8 @@ class Project < ActiveRecord::Base
validate :check_limit
validate :repo_name
 
after_destroy :destroy_gitosis_project
after_save :update_gitosis_project
after_destroy :destroy_repository
after_save :update_repository
 
attr_protected :private_flag, :owner_id
 
Loading
Loading
@@ -54,8 +54,8 @@ class Project < ActiveRecord::Base
delegate :repo,
:url_to_repo,
:path_to_repo,
:update_gitosis_project,
:destroy_gitosis_project,
:update_repository,
:destroy_repository,
:tags,
:repo_exists?,
:commit,
Loading
Loading
@@ -113,7 +113,7 @@ class Project < ActiveRecord::Base
@writers ||= users_projects.includes(:user).where(:write => true).map(&:user)
end
 
def gitosis_writers
def repository_writers
keys = Key.joins({:user => :users_projects}).where("users_projects.project_id = ? AND users_projects.write = ?", id, true)
keys.map(&:identifier)
end
Loading
Loading
@@ -184,8 +184,8 @@ class Project < ActiveRecord::Base
end
 
def repo_name
if path == "gitosis-admin" && path == "gitolite-admin"
errors.add(:path, " like 'gitosis-admin' is not allowed")
if path == "gitolite-admin"
errors.add(:path, " like 'gitolite-admin' is not allowed")
end
end
 
Loading
Loading
Loading
Loading
@@ -24,24 +24,20 @@ class Repository
end
 
def url_to_repo
if !GIT_HOST["port"] or GIT_HOST["port"] == 22
"#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git"
else
"ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git"
end
Gitlabhq::GitHost.url_to_repo(path)
end
 
def path_to_repo
GIT_HOST["base_path"] + path + ".git"
end
 
def update_gitosis_project
def update_repository
Gitlabhq::GitHost.system.new.configure do |c|
c.update_project(path, project.gitosis_writers)
c.update_project(path, project.repository_writers)
end
end
 
def destroy_gitosis_project
def destroy_repository
Gitlabhq::GitHost.system.new.configure do |c|
c.destroy_project(@project)
end
Loading
Loading
Loading
Loading
@@ -4,7 +4,7 @@ class UsersProject < ActiveRecord::Base
 
attr_protected :project_id, :project
 
after_commit :update_gitosis_project
after_commit :update_repository
 
validates_uniqueness_of :user_id, :scope => [:project_id]
validates_presence_of :user_id
Loading
Loading
@@ -13,9 +13,9 @@ class UsersProject < ActiveRecord::Base
 
delegate :name, :email, :to => :user, :prefix => true
 
def update_gitosis_project
def update_repository
Gitosis.new.configure do |c|
c.update_project(project.path, project.gitosis_writers)
c.update_project(project.path, project.repository)
end
end
 
Loading
Loading
Loading
Loading
@@ -14,7 +14,7 @@ Gitlab::Application.routes.draw do
root :to => "users#index"
end
 
get "errors/gitosis"
get "errors/githost"
get "profile/password", :to => "profile#password"
put "profile/password", :to => "profile#password_update"
put "profile/reset_private_token", :to => "profile#reset_private_token"
Loading
Loading
require File.join(Rails.root, "lib", "gitlabhq", "gitolite")
require File.join(Rails.root, "lib", "gitlabhq", "gitosis")
 
module Gitlabhq
class GitHost
def self.system
if GIT_HOST["system"] == "gitosis"
Gitlabhq::Gitosis
else
Gitlabhq::Gitolite
end
Gitlabhq::Gitolite
end
 
def self.admin_uri
GIT_HOST["admin_uri"]
end
def self.url_to_repo(path)
if !GIT_HOST["port"] or GIT_HOST["port"] == 22
"#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git"
else
"ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git"
end
end
end
end
require 'inifile'
require 'timeout'
require 'fileutils'
module Gitlabhq
class Gitosis
class AccessDenied < StandardError; end
def pull
# create tmp dir
@local_dir = File.join(Dir.tmpdir,"gitlabhq-gitosis-#{Time.now.to_i}")
Dir.mkdir @local_dir
`git clone #{GitHost.admin_uri} #{@local_dir}/gitosis`
end
def push
Dir.chdir(File.join(@local_dir, "gitosis"))
`git add -A`
`git commit -am "Gitlab"`
`git push`
Dir.chdir(Rails.root)
FileUtils.rm_rf(@local_dir)
end
def configure
status = Timeout::timeout(20) do
File.open(File.join(Dir.tmpdir,"gitlabhq-gitosis.lock"), "w+") do |f|
begin
f.flock(File::LOCK_EX)
pull
yield(self)
push
ensure
f.flock(File::LOCK_UN)
end
end
end
rescue Exception => ex
raise Gitosis::AccessDenied.new("gitosis timeout")
end
def destroy_project(project)
`sudo -u git rm -rf #{project.path_to_repo}`
conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf'))
conf.delete_section("group #{project.path}")
conf.write
end
#update or create
def update_keys(user, key)
File.open(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) }
end
def delete_key(user)
File.unlink(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub"))
`cd #{File.join(@local_dir,'gitosis')} ; git rm keydir/#{user}.pub`
end
#update or create
def update_project(repo_name, name_writers)
# write config file
conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf'))
conf["group #{repo_name}"]['writable'] = repo_name
conf["group #{repo_name}"]['members'] = name_writers.join(' ')
conf.write
end
end
end
desc "Rebuild each project at gitolite config"
task :gitolite_rebuild => :environment do
puts "Starting..."
Project.find_each(:batch_size => 100) do |project|
puts
puts "=== #{project.name}"
project.update_repository
puts
end
puts "Done"
end
Loading
Loading
@@ -18,12 +18,12 @@ describe Project do
describe "Respond to" do
it { should respond_to(:readers) }
it { should respond_to(:writers) }
it { should respond_to(:gitosis_writers) }
it { should respond_to(:repository_writers) }
it { should respond_to(:admins) }
it { should respond_to(:add_access) }
it { should respond_to(:reset_access) }
it { should respond_to(:update_gitosis_project) }
it { should respond_to(:destroy_gitosis_project) }
it { should respond_to(:update_repository) }
it { should respond_to(:destroy_repository) }
it { should respond_to(:public?) }
it { should respond_to(:private?) }
it { should respond_to(:url_to_repo) }
Loading
Loading
@@ -35,9 +35,9 @@ describe Project do
it { should respond_to(:commit) }
end
 
it "should not allow 'gitosis-admin' as repo name" do
it "should not allow 'gitolite-admin' as repo name" do
should allow_value("blah").for(:path)
should_not allow_value("gitosis-admin").for(:path)
should_not allow_value("gitolite-admin").for(:path)
end
 
it "should return valid url to repo" do
Loading
Loading
# Stubbing Project <-> gitosis path
# Stubbing Project <-> git host path
# create project using Factory only
class Project
def update_gitosis_project
def update_repository
true
end
 
def update_gitosis
def update_repository
true
end
 
Loading
Loading
@@ -15,17 +15,17 @@ class Project
end
 
class Key
def update_gitosis
def update_repository
true
end
 
def gitosis_delete_key
def repository_delete_key
true
end
end
 
class UsersProject
def update_gitosis_project
def update_repository
true
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment