From ec01cbef9452dcbe7a09f1709370a7939f66c542 Mon Sep 17 00:00:00 2001 From: Michael van Rooijen Date: Sun, 22 Jul 2012 14:48:23 +0200 Subject: [PATCH] Modified the `repo_dump` and `repo_restore` rake tasks to properly dump and restore repositories based on their `path` rather than their (project) `name`. The project name can be uppercase and may contain spaces. This caused the repository to be restored as a different `path` that it was initially created as, thus, breaking the `git remote` and the web interface can no longer detect the repository either because it searches by `path` and not by `name`. Also, when restoring the permissions are incorrect making it impossible to push new commits to the remote repository. So now on success it'll set the correct permissions (but requires that the `gitlab` user has `sudo` privileges, or this task must be executed as root). --- lib/tasks/gitlab/backup.rake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index 014483d4..5ae51f52 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -121,7 +121,7 @@ namespace :gitlab do backup_path_repo = File.join(Gitlab.config.backup_path, "repositories") FileUtils.mkdir_p(backup_path_repo) until Dir.exists?(backup_path_repo) puts "Dumping repositories:" - project = Project.all.map { |n| [n.name,n.path_to_repo] } + project = Project.all.map { |n| [n.path,n.path_to_repo] } project << ["gitolite-admin.git", File.join(File.dirname(project.first.second), "gitolite-admin.git")] project.each do |project| print "- Dumping repository #{project.first}... " @@ -136,12 +136,14 @@ namespace :gitlab do task :repo_restore => :environment do backup_path_repo = File.join(Gitlab.config.backup_path, "repositories") puts "Restoring repositories:" - project = Project.all.map { |n| [n.name,n.path_to_repo] } + project = Project.all.map { |n| [n.path,n.path_to_repo] } project << ["gitolite-admin.git", File.join(File.dirname(project.first.second), "gitolite-admin.git")] project.each do |project| print "- Restoring repository #{project.first}... " FileUtils.rm_rf(project.second) if File.dirname(project.second) # delet old stuff if Kernel.system("cd #{File.dirname(project.second)} > /dev/null 2>&1 && git clone --bare #{backup_path_repo}/#{project.first}.bundle #{project.first}.git > /dev/null 2>&1") + Kernel.system("sudo chmod -R g+rwX #{Gitlab.config.git_base_path}") + Kernel.system("sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}") puts "[DONE]".green else puts "[FAILED]".red