Read about our upcoming Code of Conduct on this issue

This instance was upgraded to Heptapod 0.28.1 today

Commit bdc65809 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

refcatoring. cleaning after gitosis

parent 8dc6929aff67
......@@ -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
......
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
......@@ -42,8 +42,8 @@ def create
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|
......
......@@ -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
......
......@@ -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
......@@ -54,8 +54,8 @@ def repository
delegate :repo,
:url_to_repo,
:path_to_repo,
:update_gitosis_project,
:destroy_gitosis_project,
:update_repository,
:destroy_repository,
:tags,
:repo_exists?,
:commit,
......@@ -113,7 +113,7 @@ def writers
@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
......@@ -184,8 +184,8 @@ def check_limit
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
......
......@@ -24,24 +24,20 @@ def repo
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
......
......@@ -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
......@@ -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
......
......@@ -14,7 +14,7 @@
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"
......
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
......@@ -18,12 +18,12 @@
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) }
......@@ -35,9 +35,9 @@
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
......
# 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
......@@ -15,17 +15,17 @@ def path_to_repo
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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment