OSDN Git Service

gitolite & gitosis support
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sat, 3 Dec 2011 23:44:59 +0000 (01:44 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sat, 3 Dec 2011 23:44:59 +0000 (01:44 +0200)
14 files changed:
app/controllers/application_controller.rb
app/controllers/projects_controller.rb
app/models/key.rb
app/models/repository.rb
app/views/projects/_form.html.haml
config/environment.rb
config/gitlab.yml
config/initializers/gitlabhq/10_load_config.rb
lib/.directory [new file with mode: 0644]
lib/gitlabhq/.directory [new file with mode: 0644]
lib/gitlabhq/git_host.rb [new file with mode: 0644]
lib/gitlabhq/gitolite.rb [new file with mode: 0644]
lib/gitlabhq/gitosis.rb [new file with mode: 0644]
lib/gitosis.rb [deleted file]

index b37deaf..380336f 100644 (file)
@@ -3,7 +3,7 @@ class ApplicationController < ActionController::Base
   protect_from_forgery
   helper_method :abilities, :can?
 
-  rescue_from Gitosis::AccessDenied do |exception|
+  rescue_from Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied do |exception|
     render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false
   end
 
index 717f859..11b4f0b 100644 (file)
@@ -42,7 +42,7 @@ class ProjectsController < ApplicationController
         format.js
       end
     end
-  rescue Gitosis::AccessDenied
+  rescue Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied
     render :js => "location.href = '#{errors_gitosis_path}'" and return
   rescue StandardError => ex
     @project.errors.add(:base, "Cant save project. Please try again later")
index 8231c30..f2f0134 100644 (file)
@@ -19,7 +19,7 @@ class Key < ActiveRecord::Base
   end
 
   def update_gitosis
-    Gitosis.new.configure do |c|
+    GitoProxy.system.new.configure do |c|
       c.update_keys(identifier, key)
 
       projects.each do |project|
@@ -29,7 +29,7 @@ class Key < ActiveRecord::Base
   end
 
   def gitosis_delete_key
-    Gitosis.new.configure do |c|
+    GitoProxy.system.new.configure do |c|
       c.delete_key(identifier)
 
       projects.each do |project|
index b87a1fb..a3e2e1e 100644 (file)
@@ -22,25 +22,25 @@ class Repository
   end
 
   def url_to_repo
-    if !GITOSIS["port"] or GITOSIS["port"] == 22
-      "#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{path}.git"
+    if !GIT_HOST["port"] or GIT_HOST["port"] == 22
+      "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git"
     else
-      "ssh://#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{GITOSIS["port"]}/#{path}.git"
+      "ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git"
     end
   end
 
   def path_to_repo
-    GITOSIS["base_path"] + path + ".git"
+    GIT_HOST["base_path"] + path + ".git"
   end
 
   def update_gitosis_project
-    Gitosis.new.configure do |c|
+    GitProxy.system.new.configure do |c|
       c.update_project(path, project.gitosis_writers)
     end
   end
 
   def destroy_gitosis_project
-    Gitosis.new.configure do |c|
+    GitProxy.system.new.configure do |c|
       c.destroy_project(@project)
     end
   end
index 234dee9..ce2fd06 100644 (file)
       %tr
         %td
           .left= f.label :path
-          %cite.right= "git@#{GITOSIS["host"]}:"
+          %cite.right= "git@#{GIT_HOST["host"]}:"
         %td
           = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record?
       %tr
         %td
           .left= f.label :code
-          %cite.right= "http://#{GITOSIS["host"]}/"
+          %cite.right= "http://#{GIT_HOST["host"]}/"
         %td= f.text_field :code, :placeholder => "example"
 
       %tr
index 1c2d723..9b09be0 100644 (file)
@@ -4,4 +4,4 @@ require File.expand_path('../application', __FILE__)
 # Initialize the rails application
 Gitlab::Application.initialize!
 
-require File.join(Rails.root, "lib", "gitosis")
+require File.join(Rails.root, "lib", "gitlabhq", "git_host")
index 3afd9c1..c61d382 100644 (file)
@@ -7,7 +7,8 @@ email:
   host: gitlabhq.com
 
 # Gitosis congiguration
-gitosis:
+git_host:
+  system: gitolite# or gitosis
   admin_uri: git@localhost:gitolite-admin
   base_path: /home/git/repositories/
   host: localhost
index cfda096..9691959 100644 (file)
@@ -1,3 +1,3 @@
-GITOSIS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["gitosis"]
+GIT_HOST = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git_host"]
 EMAIL_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["email"]
 GIT_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git"]
diff --git a/lib/.directory b/lib/.directory
new file mode 100644 (file)
index 0000000..c0d0b18
--- /dev/null
@@ -0,0 +1,5 @@
+[Dolphin]
+AdditionalInfoV2=Details_Size,Details_Date,CustomizedDetails
+Timestamp=2011,12,4,1,34,13
+Version=2
+ViewMode=1
diff --git a/lib/gitlabhq/.directory b/lib/gitlabhq/.directory
new file mode 100644 (file)
index 0000000..fcaf533
--- /dev/null
@@ -0,0 +1,5 @@
+[Dolphin]
+AdditionalInfoV2=Details_Size,Details_Date,CustomizedDetails
+Timestamp=2011,12,4,1,34,17
+Version=2
+ViewMode=1
diff --git a/lib/gitlabhq/git_host.rb b/lib/gitlabhq/git_host.rb
new file mode 100644 (file)
index 0000000..48f5a15
--- /dev/null
@@ -0,0 +1,18 @@
+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"] == "gitolite"
+        Gitlabhq::Gitolite
+      else 
+        Gitlabhq::Gitosis
+      end
+    end
+
+    def self.admin_uri
+      GIT_HOST["admin_uri"]
+    end
+  end
+end
diff --git a/lib/gitlabhq/gitolite.rb b/lib/gitlabhq/gitolite.rb
new file mode 100644 (file)
index 0000000..de8241f
--- /dev/null
@@ -0,0 +1,80 @@
+require 'gitolite'
+require 'timeout'
+require 'fileutils'
+
+module Gitlabhq
+  class Gitolite
+    class AccessDenied < StandardError; end
+
+    def pull
+      # create tmp dir
+      @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitolite-#{Time.now.to_i}")
+      Dir.mkdir @local_dir
+
+      `git clone #{GitHost.admin_uri} #{@local_dir}/gitolite`
+    end
+
+    def push
+      Dir.chdir(File.join(@local_dir, "gitolite"))
+      `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-gitolite.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 Gitolite::AccessDenied.new("gitolite timeout")
+    end
+
+    def destroy_project(project)
+      `sudo -u git rm -rf #{project.path_to_repo}`
+      
+      ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite'))
+      conf = ga_repo.config
+      conf.rm_repo(project.path)
+      ga_repo.save
+    end
+
+     #update or create
+    def update_keys(user, key)
+      File.open(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) }
+    end
+
+    def delete_key(user)
+      File.unlink(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"))
+      `cd #{File.join(@local_dir,'gitolite')} ; git rm keydir/#{user}.pub`
+    end
+
+    # update or create
+    def update_project(repo_name, name_writers)
+      ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite'))
+      conf = ga_repo.config
+
+      repo = if conf.has_repo?(repo_name)
+               conf.get_repo(repo_name)
+             else 
+               ::Gitolite::Config::Repo.new(repo_name)
+             end
+
+      repo.add_permission("RW+", "", name_writers) unless name_writers.blank?
+      conf.add_repo(repo)
+
+      ga_repo.save
+    end
+  end
+end
diff --git a/lib/gitlabhq/gitosis.rb b/lib/gitlabhq/gitosis.rb
new file mode 100644 (file)
index 0000000..a3dbcc8
--- /dev/null
@@ -0,0 +1,76 @@
+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
diff --git a/lib/gitosis.rb b/lib/gitosis.rb
deleted file mode 100644 (file)
index 6aa3284..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-require 'gitolite'
-
-require 'inifile'
-require 'timeout'
-require 'fileutils'
-
-class Gitosis
-  class AccessDenied < StandardError; end
-
-  def pull
-    # create tmp dir
-    @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitolite-#{Time.now.to_i}")
-
-    Dir.mkdir @local_dir
-
-    `git clone #{GITOSIS['admin_uri']} #{@local_dir}/gitolite`
-  end
-
-  def push
-    Dir.chdir(File.join(@local_dir, "gitolite"))
-    `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-gitolite.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("gitolite timeout")
-  end
-
-  def destroy_project(project)
-    `sudo -u git rm -rf #{project.path_to_repo}`
-    
-    conf = IniFile.new(File.join(@local_dir,'gitolite', 'conf', 'gitolite.conf'))
-
-    conf.delete_section("group #{project.path}")
-
-    conf.write
-  end
-
-   #update or create
-  def update_keys(user, key)
-    File.open(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) }
-  end
-
-  def delete_key(user)
-    File.unlink(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"))
-    `cd #{File.join(@local_dir,'gitolite')} ; git rm keydir/#{user}.pub`
-  end
-
-  #update or create
-  def update_project(repo_name, name_writers)
-    ga_repo = Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite'))
-    conf = ga_repo.config
-
-    repo = if conf.has_repo?(repo_name)
-             conf.get_repo(repo_name)
-           else 
-             Gitolite::Config::Repo.new(repo_name)
-           end
-
-    repo.add_permission("RW+", "", name_writers) unless name_writers.blank?
-
-    conf.add_repo(repo)
-
-    ga_repo.save
-  end
-end