Commit e14a0eb8d0d22215d5185e023d4c8e3bbe91168b

Authored by Dmitriy Zaporozhets
2 parents e3402769 2d81f488

Merge branch 'gitolite'

@@ -9,6 +9,7 @@ gem "kaminari" @@ -9,6 +9,7 @@ gem "kaminari"
9 gem "haml-rails" 9 gem "haml-rails"
10 gem "jquery-rails" 10 gem "jquery-rails"
11 gem "grit", :git => "https://github.com/gitlabhq/grit.git" 11 gem "grit", :git => "https://github.com/gitlabhq/grit.git"
  12 +gem "gitolite", :git => "https://github.com/gitlabhq/gitolite.git"
12 gem "carrierwave" 13 gem "carrierwave"
13 gem "six" 14 gem "six"
14 gem "therubyracer" 15 gem "therubyracer"
@@ -5,6 +5,14 @@ GIT @@ -5,6 +5,14 @@ GIT
5 annotate (2.4.1.beta1) 5 annotate (2.4.1.beta1)
6 6
7 GIT 7 GIT
  8 + remote: https://github.com/gitlabhq/gitolite.git
  9 + revision: 36dabd226caa40ff052677719adaacbfe667b36c
  10 + specs:
  11 + gitolite (0.0.3.alpha)
  12 + grit (~> 2.4.1)
  13 + hashery (~> 1.4.0)
  14 +
  15 +GIT
8 remote: https://github.com/gitlabhq/grit.git 16 remote: https://github.com/gitlabhq/grit.git
9 revision: ff015074ef35bd94cba943f9c0f98e161ab5851c 17 revision: ff015074ef35bd94cba943f9c0f98e161ab5851c
10 specs: 18 specs:
@@ -101,6 +109,7 @@ GEM @@ -101,6 +109,7 @@ GEM
101 activesupport (~> 3.0) 109 activesupport (~> 3.0)
102 haml (~> 3.0) 110 haml (~> 3.0)
103 railties (~> 3.0) 111 railties (~> 3.0)
  112 + hashery (1.4.0)
104 hike (1.2.1) 113 hike (1.2.1)
105 i18n (0.6.0) 114 i18n (0.6.0)
106 inifile (0.4.1) 115 inifile (0.4.1)
@@ -259,6 +268,7 @@ DEPENDENCIES @@ -259,6 +268,7 @@ DEPENDENCIES
259 drapper 268 drapper
260 faker 269 faker
261 git 270 git
  271 + gitolite!
262 grit! 272 grit!
263 haml-rails 273 haml-rails
264 inifile 274 inifile
@@ -29,7 +29,8 @@ git clone git://github.com/gitlabhq/gitlabhq.git @@ -29,7 +29,8 @@ git clone git://github.com/gitlabhq/gitlabhq.git
29 cd gitlabhq/ 29 cd gitlabhq/
30 30
31 # install this library first 31 # install this library first
32 -sudo easy_install pygments 32 +sudo pip install pygments
  33 +sudo apt-get install python-dev
33 34
34 # give your user access to remove git repo 35 # give your user access to remove git repo
35 # Ex. 36 # Ex.
@@ -56,10 +57,9 @@ Install gitosis, edit `config/gitlab.yml` and start server @@ -56,10 +57,9 @@ Install gitosis, edit `config/gitlab.yml` and start server
56 bundle exec rails s -e production 57 bundle exec rails s -e production
57 ``` 58 ```
58 59
59 -## Install Gitosis 60 +### Create git user
60 61
61 ```bash 62 ```bash
62 -sudo aptitude install gitosis  
63 63
64 sudo adduser \ 64 sudo adduser \
65 --system \ 65 --system \
@@ -70,6 +70,22 @@ sudo adduser \ @@ -70,6 +70,22 @@ sudo adduser \
70 --home /home/git \ 70 --home /home/git \
71 git 71 git
72 72
  73 +
  74 +# Add your user to git group
  75 +usermod -a -G git gitlabhq_user_name
  76 +
  77 +```
  78 +
  79 +## Install Gitolite
  80 +
  81 +### !!! IMPORTANT !!! Gitolite umask should be 0007 so users from git group has read/write access to repo
  82 +
  83 +## Install Gitosis
  84 +
  85 +```bash
  86 +sudo aptitude install gitosis
  87 +
  88 +
73 ssh-keygen -t rsa 89 ssh-keygen -t rsa
74 90
75 sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub 91 sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub
@@ -79,6 +95,7 @@ sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update @@ -79,6 +95,7 @@ sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
79 cd /tmp && git clone git@localhost:gitosis-admin.git 95 cd /tmp && git clone git@localhost:gitosis-admin.git
80 96
81 rm -rf gitosis-admin.git && cd 97 rm -rf gitosis-admin.git && cd
  98 +
82 ``` 99 ```
83 100
84 ## Install ruby 1.9.2 101 ## Install ruby 1.9.2
app/controllers/application_controller.rb
@@ -3,8 +3,8 @@ class ApplicationController &lt; ActionController::Base @@ -3,8 +3,8 @@ class ApplicationController &lt; ActionController::Base
3 protect_from_forgery 3 protect_from_forgery
4 helper_method :abilities, :can? 4 helper_method :abilities, :can?
5 5
6 - rescue_from Gitosis::AccessDenied do |exception|  
7 - render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false 6 + rescue_from Gitlabhq::Gitolite::AccessDenied do |exception|
  7 + render :file => File.join(Rails.root, "public", "githost_error"), :layout => false
8 end 8 end
9 9
10 layout :layout_by_resource 10 layout :layout_by_resource
@@ -70,7 +70,7 @@ class ApplicationController &lt; ActionController::Base @@ -70,7 +70,7 @@ class ApplicationController &lt; ActionController::Base
70 end 70 end
71 71
72 def require_non_empty_project 72 def require_non_empty_project
73 - redirect_to @project unless @project.repo_exists? 73 + redirect_to @project unless @project.repo_exists? && @project.has_commits?
74 end 74 end
75 75
76 def respond_with_notes 76 def respond_with_notes
app/controllers/errors_controller.rb
1 class ErrorsController < ApplicationController 1 class ErrorsController < ApplicationController
2 - def gitosis  
3 - render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false 2 + def githost
  3 + render :file => File.join(Rails.root, "public", "githost_error"), :layout => false
4 end 4 end
5 end 5 end
app/controllers/projects_controller.rb
@@ -8,7 +8,7 @@ class ProjectsController &lt; ApplicationController @@ -8,7 +8,7 @@ class ProjectsController &lt; ApplicationController
8 before_filter :add_project_abilities 8 before_filter :add_project_abilities
9 before_filter :authorize_read_project!, :except => [:index, :new, :create] 9 before_filter :authorize_read_project!, :except => [:index, :new, :create]
10 before_filter :authorize_admin_project!, :only => [:edit, :update, :destroy] 10 before_filter :authorize_admin_project!, :only => [:edit, :update, :destroy]
11 - before_filter :require_non_empty_project, :only => [:blob, :tree] 11 + before_filter :require_non_empty_project, :only => [:blob, :tree, :graph]
12 before_filter :load_refs, :only => :tree # load @branch, @tag & @ref 12 before_filter :load_refs, :only => :tree # load @branch, @tag & @ref
13 13
14 def index 14 def index
@@ -42,8 +42,8 @@ class ProjectsController &lt; ApplicationController @@ -42,8 +42,8 @@ class ProjectsController &lt; ApplicationController
42 format.js 42 format.js
43 end 43 end
44 end 44 end
45 - rescue Gitosis::AccessDenied  
46 - render :js => "location.href = '#{errors_gitosis_path}'" and return 45 + rescue Gitlabhq::Gitolite::AccessDenied
  46 + render :js => "location.href = '#{errors_githost_path}'" and return
47 rescue StandardError => ex 47 rescue StandardError => ex
48 @project.errors.add(:base, "Cant save project. Please try again later") 48 @project.errors.add(:base, "Cant save project. Please try again later")
49 respond_to do |format| 49 respond_to do |format|
@@ -65,7 +65,7 @@ class ProjectsController &lt; ApplicationController @@ -65,7 +65,7 @@ class ProjectsController &lt; ApplicationController
65 end 65 end
66 66
67 def show 67 def show
68 - return render "projects/empty" unless @project.repo_exists? 68 + return render "projects/empty" unless @project.repo_exists? && @project.has_commits?
69 limit = (params[:limit] || 20).to_i 69 limit = (params[:limit] || 20).to_i
70 @activities = @project.cached_updates(limit) 70 @activities = @project.cached_updates(limit)
71 end 71 end
app/controllers/refs_controller.rb
1 class RefsController < ApplicationController 1 class RefsController < ApplicationController
2 before_filter :project 2 before_filter :project
3 - before_filter :ref  
4 - before_filter :define_tree_vars, :only => [:tree, :blob]  
5 - layout "project"  
6 3
7 # Authorize 4 # Authorize
8 before_filter :add_project_abilities 5 before_filter :add_project_abilities
9 before_filter :authorize_read_project! 6 before_filter :authorize_read_project!
10 before_filter :require_non_empty_project 7 before_filter :require_non_empty_project
11 8
  9 + before_filter :ref
  10 + before_filter :define_tree_vars, :only => [:tree, :blob]
  11 + layout "project"
  12 +
12 def switch 13 def switch
13 new_path = if params[:destination] == "tree" 14 new_path = if params[:destination] == "tree"
14 tree_project_ref_path(@project, params[:ref]) 15 tree_project_ref_path(@project, params[:ref])
@@ -51,6 +52,8 @@ class RefsController &lt; ApplicationController @@ -51,6 +52,8 @@ class RefsController &lt; ApplicationController
51 @commit = project.commit(@ref) 52 @commit = project.commit(@ref)
52 @tree = Tree.new(@commit.tree, project, @ref, params[:path]) 53 @tree = Tree.new(@commit.tree, project, @ref, params[:path])
53 @tree = TreeDecorator.new(@tree) 54 @tree = TreeDecorator.new(@tree)
  55 + rescue
  56 + return render_404
54 end 57 end
55 58
56 def ref 59 def ref
app/models/key.rb
@@ -11,29 +11,29 @@ class Key &lt; ActiveRecord::Base @@ -11,29 +11,29 @@ class Key &lt; ActiveRecord::Base
11 :length => { :within => 0..5000 } 11 :length => { :within => 0..5000 }
12 12
13 before_save :set_identifier 13 before_save :set_identifier
14 - after_save :update_gitosis  
15 - after_destroy :gitosis_delete_key 14 + after_save :update_repository
  15 + after_destroy :repository_delete_key
16 16
17 def set_identifier 17 def set_identifier
18 self.identifier = "#{user.identifier}_#{Time.now.to_i}" 18 self.identifier = "#{user.identifier}_#{Time.now.to_i}"
19 end 19 end
20 20
21 - def update_gitosis  
22 - Gitosis.new.configure do |c| 21 + def update_repository
  22 + Gitlabhq::GitHost.system.new.configure do |c|
23 c.update_keys(identifier, key) 23 c.update_keys(identifier, key)
24 24
25 projects.each do |project| 25 projects.each do |project|
26 - c.update_project(project.path, project.gitosis_writers) 26 + c.update_project(project.path, project.repository_writers)
27 end 27 end
28 end 28 end
29 end 29 end
30 30
31 - def gitosis_delete_key  
32 - Gitosis.new.configure do |c| 31 + def repository_delete_key
  32 + Gitlabhq::GitHost.system.new.configure do |c|
33 c.delete_key(identifier) 33 c.delete_key(identifier)
34 34
35 projects.each do |project| 35 projects.each do |project|
36 - c.update_project(project.path, project.gitosis_writers) 36 + c.update_project(project.path, project.repository_writers)
37 end 37 end
38 end 38 end
39 end 39 end
app/models/project.rb
@@ -40,8 +40,8 @@ class Project &lt; ActiveRecord::Base @@ -40,8 +40,8 @@ class Project &lt; ActiveRecord::Base
40 validate :check_limit 40 validate :check_limit
41 validate :repo_name 41 validate :repo_name
42 42
43 - after_destroy :destroy_gitosis_project  
44 - after_save :update_gitosis_project 43 + after_destroy :destroy_repository
  44 + after_save :update_repository
45 45
46 attr_protected :private_flag, :owner_id 46 attr_protected :private_flag, :owner_id
47 47
@@ -54,8 +54,8 @@ class Project &lt; ActiveRecord::Base @@ -54,8 +54,8 @@ class Project &lt; ActiveRecord::Base
54 delegate :repo, 54 delegate :repo,
55 :url_to_repo, 55 :url_to_repo,
56 :path_to_repo, 56 :path_to_repo,
57 - :update_gitosis_project,  
58 - :destroy_gitosis_project, 57 + :update_repository,
  58 + :destroy_repository,
59 :tags, 59 :tags,
60 :repo_exists?, 60 :repo_exists?,
61 :commit, 61 :commit,
@@ -95,6 +95,10 @@ class Project &lt; ActiveRecord::Base @@ -95,6 +95,10 @@ class Project &lt; ActiveRecord::Base
95 notes.where(:noteable_id => commit.id, :noteable_type => "Commit") 95 notes.where(:noteable_id => commit.id, :noteable_type => "Commit")
96 end 96 end
97 97
  98 + def has_commits?
  99 + !!commit
  100 + end
  101 +
98 def add_access(user, *access) 102 def add_access(user, *access)
99 opts = { :user => user } 103 opts = { :user => user }
100 access.each { |name| opts.merge!(name => true) } 104 access.each { |name| opts.merge!(name => true) }
@@ -109,7 +113,7 @@ class Project &lt; ActiveRecord::Base @@ -109,7 +113,7 @@ class Project &lt; ActiveRecord::Base
109 @writers ||= users_projects.includes(:user).where(:write => true).map(&:user) 113 @writers ||= users_projects.includes(:user).where(:write => true).map(&:user)
110 end 114 end
111 115
112 - def gitosis_writers 116 + def repository_writers
113 keys = Key.joins({:user => :users_projects}).where("users_projects.project_id = ? AND users_projects.write = ?", id, true) 117 keys = Key.joins({:user => :users_projects}).where("users_projects.project_id = ? AND users_projects.write = ?", id, true)
114 keys.map(&:identifier) 118 keys.map(&:identifier)
115 end 119 end
@@ -180,8 +184,8 @@ class Project &lt; ActiveRecord::Base @@ -180,8 +184,8 @@ class Project &lt; ActiveRecord::Base
180 end 184 end
181 185
182 def repo_name 186 def repo_name
183 - if path == "gitosis-admin"  
184 - errors.add(:path, " like 'gitosis-admin' is not allowed") 187 + if path == "gitolite-admin"
  188 + errors.add(:path, " like 'gitolite-admin' is not allowed")
185 end 189 end
186 end 190 end
187 191
app/models/repository.rb
  1 +require File.join(Rails.root, "lib", "gitlabhq", "git_host")
  2 +
1 class Repository 3 class Repository
2 attr_accessor :project 4 attr_accessor :project
3 5
@@ -22,25 +24,21 @@ class Repository @@ -22,25 +24,21 @@ class Repository
22 end 24 end
23 25
24 def url_to_repo 26 def url_to_repo
25 - if !GITOSIS["port"] or GITOSIS["port"] == 22  
26 - "#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{path}.git"  
27 - else  
28 - "ssh://#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{GITOSIS["port"]}/#{path}.git"  
29 - end 27 + Gitlabhq::GitHost.url_to_repo(path)
30 end 28 end
31 29
32 def path_to_repo 30 def path_to_repo
33 - GITOSIS["base_path"] + path + ".git" 31 + GIT_HOST["base_path"] + path + ".git"
34 end 32 end
35 33
36 - def update_gitosis_project  
37 - Gitosis.new.configure do |c|  
38 - c.update_project(path, project.gitosis_writers) 34 + def update_repository
  35 + Gitlabhq::GitHost.system.new.configure do |c|
  36 + c.update_project(path, project.repository_writers)
39 end 37 end
40 end 38 end
41 39
42 - def destroy_gitosis_project  
43 - Gitosis.new.configure do |c| 40 + def destroy_repository
  41 + Gitlabhq::GitHost.system.new.configure do |c|
44 c.destroy_project(@project) 42 c.destroy_project(@project)
45 end 43 end
46 end 44 end
app/models/users_project.rb
@@ -4,7 +4,7 @@ class UsersProject &lt; ActiveRecord::Base @@ -4,7 +4,7 @@ class UsersProject &lt; ActiveRecord::Base
4 4
5 attr_protected :project_id, :project 5 attr_protected :project_id, :project
6 6
7 - after_commit :update_gitosis_project 7 + after_commit :update_repository
8 8
9 validates_uniqueness_of :user_id, :scope => [:project_id] 9 validates_uniqueness_of :user_id, :scope => [:project_id]
10 validates_presence_of :user_id 10 validates_presence_of :user_id
@@ -13,9 +13,9 @@ class UsersProject &lt; ActiveRecord::Base @@ -13,9 +13,9 @@ class UsersProject &lt; ActiveRecord::Base
13 13
14 delegate :name, :email, :to => :user, :prefix => true 14 delegate :name, :email, :to => :user, :prefix => true
15 15
16 - def update_gitosis_project 16 + def update_repository
17 Gitosis.new.configure do |c| 17 Gitosis.new.configure do |c|
18 - c.update_project(project.path, project.gitosis_writers) 18 + c.update_project(project.path, project.repository)
19 end 19 end
20 end 20 end
21 21
app/views/projects/_form.html.haml
@@ -20,13 +20,13 @@ @@ -20,13 +20,13 @@
20 %tr 20 %tr
21 %td 21 %td
22 .left= f.label :path 22 .left= f.label :path
23 - %cite.right= "git@#{GITOSIS["host"]}:" 23 + %cite.right= "git@#{GIT_HOST["host"]}:"
24 %td 24 %td
25 = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record? 25 = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record?
26 %tr 26 %tr
27 %td 27 %td
28 .left= f.label :code 28 .left= f.label :code
29 - %cite.right= "http://#{GITOSIS["host"]}/" 29 + %cite.right= "http://#{GIT_HOST["host"]}/"
30 %td= f.text_field :code, :placeholder => "example" 30 %td= f.text_field :code, :placeholder => "example"
31 31
32 %tr 32 %tr
config/environment.rb
@@ -4,4 +4,4 @@ require File.expand_path(&#39;../application&#39;, __FILE__) @@ -4,4 +4,4 @@ require File.expand_path(&#39;../application&#39;, __FILE__)
4 # Initialize the rails application 4 # Initialize the rails application
5 Gitlab::Application.initialize! 5 Gitlab::Application.initialize!
6 6
7 -require File.join(Rails.root, "lib", "gitosis") 7 +require File.join(Rails.root, "lib", "gitlabhq", "git_host")
config/gitlab.yml
@@ -6,9 +6,13 @@ email: @@ -6,9 +6,13 @@ email:
6 from: notify@gitlabhq.com 6 from: notify@gitlabhq.com
7 host: gitlabhq.com 7 host: gitlabhq.com
8 8
9 -# Gitosis congiguration  
10 -gitosis:  
11 - admin_uri: git@localhost:gitosis-admin.git 9 +# Git Hosting congiguration
  10 +# You can use both gitolite & gitosis
  11 +# But gitosis wiil be deprecated &
  12 +# some new features wont work with it
  13 +git_host:
  14 + system: gitolite
  15 + admin_uri: git@localhost:gitolite-admin
12 base_path: /home/git/repositories/ 16 base_path: /home/git/repositories/
13 host: localhost 17 host: localhost
14 git_user: git 18 git_user: git
config/initializers/gitlabhq/10_load_config.rb
1 -GITOSIS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["gitosis"] 1 +GIT_HOST = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git_host"]
2 EMAIL_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["email"] 2 EMAIL_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["email"]
3 GIT_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git"] 3 GIT_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git"]
config/routes.rb
@@ -14,7 +14,7 @@ Gitlab::Application.routes.draw do @@ -14,7 +14,7 @@ Gitlab::Application.routes.draw do
14 root :to => "users#index" 14 root :to => "users#index"
15 end 15 end
16 16
17 - get "errors/gitosis" 17 + get "errors/githost"
18 get "profile/password", :to => "profile#password" 18 get "profile/password", :to => "profile#password"
19 put "profile/password", :to => "profile#password_update" 19 put "profile/password", :to => "profile#password_update"
20 put "profile/reset_private_token", :to => "profile#reset_private_token" 20 put "profile/reset_private_token", :to => "profile#reset_private_token"
db/fixtures/development/001_admin.rb
1 -admin = User.create(  
2 - :email => "admin@local.host",  
3 - :name => "Administrator",  
4 - :password => "5iveL!fe",  
5 - :password_confirmation => "5iveL!fe"  
6 -) 1 +unless User.count > 0
  2 + admin = User.create(
  3 + :email => "admin@local.host",
  4 + :name => "Administrator",
  5 + :password => "5iveL!fe",
  6 + :password_confirmation => "5iveL!fe"
  7 + )
7 8
8 -admin.projects_limit = 10000  
9 -admin.admin = true  
10 -admin.save! 9 + admin.projects_limit = 10000
  10 + admin.admin = true
  11 + admin.save!
11 12
12 -if admin.valid?  
13 -puts %q[  
14 -Administrator account created: 13 + if admin.valid?
  14 + puts %q[
  15 + Administrator account created:
15 16
16 -login.........admin@local.host  
17 -password......5iveL!fe  
18 -] 17 + login.........admin@local.host
  18 + password......5iveL!fe
  19 + ]
  20 + end
19 end 21 end
db/fixtures/development/002_project.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +Project.seed(:id, [
  2 + { :id => 1, :name => "Gitlab HQ", :path => "gitlabhq", :code => "gitlabhq", :owner_id => 1 },
  3 + { :id => 2, :name => "Diaspora", :path => "diaspora", :code => "diaspora", :owner_id => 1 },
  4 + { :id => 3, :name => "Ruby on Rails", :path => "ruby_on_rails", :code => "ruby_on_rails", :owner_id => 1 }
  5 +])
db/fixtures/development/003_users.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +User.seed(:id, [
  2 + { :id => 2, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  3 + { :id => 3, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  4 + { :id => 4, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  5 + { :id => 5, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  6 + { :id => 6, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  7 + { :id => 7, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  8 + { :id => 8, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
  9 + { :id => 9, :name => Faker::Internet.user_name, :email => Faker::Internet.email}
  10 +])
  11 +
db/fixtures/development/004_teams.rb 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +UsersProject.seed(:id, [
  2 + { :id => 1, :project_id => 1, :user_id => 1, :read => true, :write => true, :admin => true },
  3 + { :id => 2, :project_id => 1, :user_id => 2, :read => true, :write => false, :admin => false },
  4 + { :id => 3, :project_id => 1, :user_id => 3, :read => true, :write => false, :admin => false },
  5 + { :id => 4, :project_id => 1, :user_id => 4, :read => true, :write => false, :admin => false },
  6 + { :id => 5, :project_id => 1, :user_id => 5, :read => true, :write => false, :admin => false },
  7 +
  8 + { :id => 6, :project_id => 2, :user_id => 1, :read => true, :write => true, :admin => true },
  9 + { :id => 7, :project_id => 2, :user_id => 2, :read => true, :write => false, :admin => false },
  10 + { :id => 8, :project_id => 2, :user_id => 3, :read => true, :write => false, :admin => false },
  11 + { :id => 9, :project_id => 2, :user_id => 4, :read => true, :write => false, :admin => false },
  12 + { :id => 11, :project_id => 2, :user_id => 5, :read => true, :write => false, :admin => false },
  13 +
  14 + { :id => 12, :project_id => 3, :user_id => 1, :read => true, :write => true, :admin => true },
  15 + { :id => 13, :project_id => 3, :user_id => 2, :read => true, :write => false, :admin => false },
  16 + { :id => 14, :project_id => 3, :user_id => 3, :read => true, :write => false, :admin => false },
  17 + { :id => 15, :project_id => 3, :user_id => 4, :read => true, :write => false, :admin => false },
  18 + { :id => 16, :project_id => 3, :user_id => 5, :read => true, :write => false, :admin => false }
  19 +])
  20 +
  21 +
lib/.directory 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +[Dolphin]
  2 +AdditionalInfoV2=Details_Size,Details_Date,CustomizedDetails
  3 +Timestamp=2011,12,4,1,34,13
  4 +Version=2
  5 +ViewMode=1
lib/gitlabhq/.directory 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +[Dolphin]
  2 +AdditionalInfoV2=Details_Size,Details_Date,CustomizedDetails
  3 +Timestamp=2011,12,4,1,34,17
  4 +Version=2
  5 +ViewMode=1
lib/gitlabhq/git_host.rb 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +require File.join(Rails.root, "lib", "gitlabhq", "gitolite")
  2 +
  3 +module Gitlabhq
  4 + class GitHost
  5 + def self.system
  6 + Gitlabhq::Gitolite
  7 + end
  8 +
  9 + def self.admin_uri
  10 + GIT_HOST["admin_uri"]
  11 + end
  12 +
  13 + def self.url_to_repo(path)
  14 + if !GIT_HOST["port"] or GIT_HOST["port"] == 22
  15 + "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git"
  16 + else
  17 + "ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git"
  18 + end
  19 + end
  20 + end
  21 +end
lib/gitlabhq/gitolite.rb 0 → 100644
@@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
  1 +require 'gitolite'
  2 +require 'timeout'
  3 +require 'fileutils'
  4 +
  5 +module Gitlabhq
  6 + class Gitolite
  7 + class AccessDenied < StandardError; end
  8 +
  9 + def pull
  10 + # create tmp dir
  11 + @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitolite-#{Time.now.to_i}")
  12 + Dir.mkdir @local_dir
  13 +
  14 + `git clone #{GitHost.admin_uri} #{@local_dir}/gitolite`
  15 + end
  16 +
  17 + def push
  18 + Dir.chdir(File.join(@local_dir, "gitolite"))
  19 + `git add -A`
  20 + `git commit -am "Gitlab"`
  21 + `git push`
  22 + Dir.chdir(Rails.root)
  23 +
  24 + FileUtils.rm_rf(@local_dir)
  25 + end
  26 +
  27 + def configure
  28 + status = Timeout::timeout(20) do
  29 + File.open(File.join(Dir.tmpdir,"gitlabhq-gitolite.lock"), "w+") do |f|
  30 + begin
  31 + f.flock(File::LOCK_EX)
  32 + pull
  33 + yield(self)
  34 + push
  35 + ensure
  36 + f.flock(File::LOCK_UN)
  37 + end
  38 + end
  39 + end
  40 + rescue Exception => ex
  41 + raise Gitolite::AccessDenied.new("gitolite timeout")
  42 + end
  43 +
  44 + def destroy_project(project)
  45 + `sudo -u git rm -rf #{project.path_to_repo}`
  46 +
  47 + ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite'))
  48 + conf = ga_repo.config
  49 + conf.rm_repo(project.path)
  50 + ga_repo.save
  51 + end
  52 +
  53 + #update or create
  54 + def update_keys(user, key)
  55 + File.open(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) }
  56 + end
  57 +
  58 + def delete_key(user)
  59 + File.unlink(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"))
  60 + `cd #{File.join(@local_dir,'gitolite')} ; git rm keydir/#{user}.pub`
  61 + end
  62 +
  63 + # update or create
  64 + def update_project(repo_name, name_writers)
  65 + ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite'))
  66 + conf = ga_repo.config
  67 +
  68 + repo = if conf.has_repo?(repo_name)
  69 + conf.get_repo(repo_name)
  70 + else
  71 + ::Gitolite::Config::Repo.new(repo_name)
  72 + end
  73 +
  74 + repo.add_permission("RW+", "", name_writers) unless name_writers.blank?
  75 + conf.add_repo(repo)
  76 +
  77 + ga_repo.save
  78 + end
  79 + end
  80 +end
lib/gitosis.rb
@@ -1,74 +0,0 @@ @@ -1,74 +0,0 @@
1 -require 'inifile'  
2 -require 'timeout'  
3 -require 'fileutils'  
4 -  
5 -class Gitosis  
6 - class AccessDenied < StandardError; end  
7 -  
8 - def pull  
9 - # create tmp dir  
10 - @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitosis-#{Time.now.to_i}")  
11 -  
12 - Dir.mkdir @local_dir  
13 -  
14 - `git clone #{GITOSIS['admin_uri']} #{@local_dir}/gitosis`  
15 - end  
16 -  
17 - def push  
18 - Dir.chdir(File.join(@local_dir, "gitosis"))  
19 - `git add -A`  
20 - `git commit -am "Gitlab"`  
21 - `git push`  
22 - Dir.chdir(Rails.root)  
23 -  
24 - FileUtils.rm_rf(@local_dir)  
25 - end  
26 -  
27 - def configure  
28 - status = Timeout::timeout(20) do  
29 - File.open(File.join(Dir.tmpdir,"gitlabhq-gitosis.lock"), "w+") do |f|  
30 - begin  
31 - f.flock(File::LOCK_EX)  
32 - pull  
33 - yield(self)  
34 - push  
35 - ensure  
36 - f.flock(File::LOCK_UN)  
37 - end  
38 - end  
39 - end  
40 - rescue Exception => ex  
41 - raise Gitosis::AccessDenied.new("gitosis timeout")  
42 - end  
43 -  
44 - def destroy_project(project)  
45 - `sudo -u git rm -rf #{project.path_to_repo}`  
46 -  
47 - conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf'))  
48 -  
49 - conf.delete_section("group #{project.path}")  
50 -  
51 - conf.write  
52 - end  
53 -  
54 - #update or create  
55 - def update_keys(user, key)  
56 - File.open(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) }  
57 - end  
58 -  
59 - def delete_key(user)  
60 - File.unlink(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub"))  
61 - `cd #{File.join(@local_dir,'gitosis')} ; git rm keydir/#{user}.pub`  
62 - end  
63 -  
64 - #update or create  
65 - def update_project(repo_name, name_writers)  
66 - # write config file  
67 - conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf'))  
68 -  
69 - conf["group #{repo_name}"]['writable'] = repo_name  
70 - conf["group #{repo_name}"]['members'] = name_writers.join(' ')  
71 -  
72 - conf.write  
73 - end  
74 -end  
lib/tasks/gitolite_rebuild.rake 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +desc "Rebuild each project at gitolite config"
  2 +task :gitolite_rebuild => :environment do
  3 + puts "Starting Projects"
  4 + Project.find_each(:batch_size => 100) do |project|
  5 + puts
  6 + puts "=== #{project.name}"
  7 + project.update_repository
  8 + puts
  9 + end
  10 + puts "Done with projects"
  11 +
  12 + puts "Starting Key"
  13 + Key.find_each(:batch_size => 100) do |project|
  14 + project.update_repository
  15 + print '.'
  16 + end
  17 + puts "Done with keys"
  18 +end
spec/models/project_spec.rb
@@ -18,12 +18,12 @@ describe Project do @@ -18,12 +18,12 @@ describe Project do
18 describe "Respond to" do 18 describe "Respond to" do
19 it { should respond_to(:readers) } 19 it { should respond_to(:readers) }
20 it { should respond_to(:writers) } 20 it { should respond_to(:writers) }
21 - it { should respond_to(:gitosis_writers) } 21 + it { should respond_to(:repository_writers) }
22 it { should respond_to(:admins) } 22 it { should respond_to(:admins) }
23 it { should respond_to(:add_access) } 23 it { should respond_to(:add_access) }
24 it { should respond_to(:reset_access) } 24 it { should respond_to(:reset_access) }
25 - it { should respond_to(:update_gitosis_project) }  
26 - it { should respond_to(:destroy_gitosis_project) } 25 + it { should respond_to(:update_repository) }
  26 + it { should respond_to(:destroy_repository) }
27 it { should respond_to(:public?) } 27 it { should respond_to(:public?) }
28 it { should respond_to(:private?) } 28 it { should respond_to(:private?) }
29 it { should respond_to(:url_to_repo) } 29 it { should respond_to(:url_to_repo) }
@@ -35,9 +35,9 @@ describe Project do @@ -35,9 +35,9 @@ describe Project do
35 it { should respond_to(:commit) } 35 it { should respond_to(:commit) }
36 end 36 end
37 37
38 - it "should not allow 'gitosis-admin' as repo name" do 38 + it "should not allow 'gitolite-admin' as repo name" do
39 should allow_value("blah").for(:path) 39 should allow_value("blah").for(:path)
40 - should_not allow_value("gitosis-admin").for(:path) 40 + should_not allow_value("gitolite-admin").for(:path)
41 end 41 end
42 42
43 it "should return valid url to repo" do 43 it "should return valid url to repo" do
spec/monkeypatch.rb
1 -# Stubbing Project <-> gitosis path 1 +# Stubbing Project <-> git host path
2 # create project using Factory only 2 # create project using Factory only
3 class Project 3 class Project
4 - def update_gitosis_project 4 + def update_repository
5 true 5 true
6 end 6 end
7 7
8 - def update_gitosis 8 + def update_repository
9 true 9 true
10 end 10 end
11 11
@@ -15,17 +15,17 @@ class Project @@ -15,17 +15,17 @@ class Project
15 end 15 end
16 16
17 class Key 17 class Key
18 - def update_gitosis 18 + def update_repository
19 true 19 true
20 end 20 end
21 21
22 - def gitosis_delete_key 22 + def repository_delete_key
23 true 23 true
24 end 24 end
25 end 25 end
26 26
27 class UsersProject 27 class UsersProject
28 - def update_gitosis_project 28 + def update_repository
29 true 29 true
30 end 30 end
31 end 31 end