From 213bad4e2b5554bd26c899654706db8169480cce Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Tue, 25 Feb 2014 16:59:05 +0100 Subject: [PATCH] Patch gitlab-shell 1.8.0 for backup restores --- config/patches/gitlab-shell/create_hooks.patch | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/software/gitlab-shell.rb | 3 +++ 2 files changed, 129 insertions(+), 0 deletions(-) create mode 100644 config/patches/gitlab-shell/create_hooks.patch diff --git a/config/patches/gitlab-shell/create_hooks.patch b/config/patches/gitlab-shell/create_hooks.patch new file mode 100644 index 0000000..330f236 --- /dev/null +++ b/config/patches/gitlab-shell/create_hooks.patch @@ -0,0 +1,126 @@ +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 diff --git a/config/software/gitlab-shell.rb b/config/software/gitlab-shell.rb index 60c0cb7..b98cc7f 100644 --- a/config/software/gitlab-shell.rb +++ b/config/software/gitlab-shell.rb @@ -25,6 +25,9 @@ dependency "rsync" source :git => "https://gitlab.com/gitlab-org/gitlab-shell.git" build do + # patch gitlab-shell 1.8.0 to correctly create hooks during backup restore + patch :source => "create_hooks.patch" + command "mkdir -p #{install_dir}/embedded/service/gitlab-shell" command "#{install_dir}/embedded/bin/rsync -a --delete --exclude=.git/*** --exclude=.gitignore ./ #{install_dir}/embedded/service/gitlab-shell/" block do -- libgit2 0.21.2