create_hooks.patch 4 KB
diff --git a/bin/create-hooks b/bin/create-hooks
new file mode 100755
index 0000000..d6f07c7
--- /dev/null
+++ b/bin/create-hooks
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+# Recreate GitLab hooks in the Git repositories managed by GitLab.
+#
+# This script is used when restoring a GitLab backup.
+
+require_relative '../lib/gitlab_init'
+require File.join(ROOT_PATH, 'lib', 'gitlab_projects')
+
+Dir["#{GitlabConfig.new.repos_path}/*/*.git"].each do |repo|
+  GitlabProjects.create_hooks(repo)
+end
diff --git a/lib/gitlab_projects.rb b/lib/gitlab_projects.rb
index fec204c..b3ff372 100644
--- a/lib/gitlab_projects.rb
+++ b/lib/gitlab_projects.rb
@@ -42,6 +42,12 @@ class GitlabProjects
     end
   end
 
+  def self.create_hooks(path)
+    hook = File.join(path, 'hooks', 'update')
+    File.delete(hook) if File.exists?(hook)
+    File.symlink(File.join(ROOT_PATH, 'hooks', 'update'), hook)
+  end
+
   protected
 
   def create_branch
@@ -74,13 +80,7 @@ class GitlabProjects
     $logger.info "Adding project #{@project_name} at <#{full_path}>."
     FileUtils.mkdir_p(full_path, mode: 0770)
     cmd = %W(git --git-dir=#{full_path} init --bare)
-    system(*cmd) && create_hooks(full_path)
-  end
-
-  def create_hooks(path)
-    hook = File.join(path, 'hooks', 'update')
-    File.delete(hook) if File.exists?(hook)
-    File.symlink(File.join(ROOT_PATH, 'hooks', 'update'), hook)
+    system(*cmd) && self.class.create_hooks(full_path)
   end
 
   def rm_project
@@ -94,7 +94,7 @@ class GitlabProjects
     @source = ARGV.shift
     $logger.info "Importing project #{@project_name} from <#{@source}> to <#{full_path}>."
     cmd = %W(git clone --bare -- #{@source} #{full_path})
-    system(*cmd) && create_hooks(full_path)
+    system(*cmd) && self.class.create_hooks(full_path)
   end
 
   # Move repository from one directory to another
@@ -156,7 +156,7 @@ class GitlabProjects
 
     $logger.info "Forking project from <#{full_path}> to <#{full_destination_path}>."
     cmd = %W(git clone --bare -- #{full_path} #{full_destination_path})
-    system(*cmd) && create_hooks(full_destination_path)
+    system(*cmd) && self.class.create_hooks(full_destination_path)
   end
 
   def update_head
diff --git a/spec/gitlab_projects_spec.rb b/spec/gitlab_projects_spec.rb
index bbe27e2..4341ca5 100644
--- a/spec/gitlab_projects_spec.rb
+++ b/spec/gitlab_projects_spec.rb
@@ -95,7 +95,7 @@ describe GitlabProjects do
 
     it "should create a directory" do
       gl_projects.stub(system: true)
-      gl_projects.stub(create_hooks: true)
+      GitlabProjects.stub(create_hooks: true)
       gl_projects.exec
       File.exists?(tmp_repo_path).should be_true
     end
@@ -103,7 +103,7 @@ describe GitlabProjects do
     it "should receive valid cmd" do
       valid_cmd = ['git', "--git-dir=#{tmp_repo_path}", 'init', '--bare']
       gl_projects.should_receive(:system).with(*valid_cmd).and_return(true)
-      gl_projects.should_receive(:create_hooks).with(tmp_repo_path)
+      GitlabProjects.should_receive(:create_hooks).with(tmp_repo_path)
       gl_projects.exec
     end
 
diff --git a/support/rewrite-hooks.sh b/support/rewrite-hooks.sh
index 3c96b6f..585eaeb 100755
--- a/support/rewrite-hooks.sh
+++ b/support/rewrite-hooks.sh
@@ -1,28 +1,5 @@
 #!/bin/bash
+# This script is deprecated. Use bin/create-hooks instead.
 
-# $1 is an optional argument specifying the location of the repositories directory.
-# Defaults to /home/git/repositories if not provided
-
-home_dir="/home/git"
-src=${1:-"$home_dir/repositories"}
-
-function create_link_in {
-  ln -s -f "$home_dir/gitlab-shell/hooks/update" "$1/hooks/update"
-}
-
-for dir in `ls "$src/"`
-do
-  if [ -d "$src/$dir" ]; then
-    if [[ "$dir" =~ ^.*\.git$ ]]
-    then
-      create_link_in "$src/$dir"
-    else
-      for subdir in `ls "$src/$dir/"`
-      do
-        if [ -d "$src/$dir/$subdir" ] && [[ "$subdir" =~ ^.*\.git$ ]]; then
-          create_link_in "$src/$dir/$subdir"
-        fi
-      done
-    fi
-  fi
-done
+gitlab_shell_dir="$(cd $(dirname $0) && pwd)/.."
+exec ${gitlab_shell_dir}/bin/create-hooks