From 37e39e4176757019fb6e9d437b86229497e63b57 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 30 Oct 2012 13:04:56 +0200 Subject: [PATCH] Added bare import script. Removed old unworking script --- lib/tasks/bulk_import.rake | 83 ------------------------------------ lib/tasks/gitlab/import.rake | 54 +++++++++++++++++++++++ 2 files changed, 54 insertions(+), 83 deletions(-) delete mode 100644 lib/tasks/bulk_import.rake create mode 100644 lib/tasks/gitlab/import.rake diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake deleted file mode 100644 index 914f920a8d7..00000000000 --- a/lib/tasks/bulk_import.rake +++ /dev/null @@ -1,83 +0,0 @@ -desc "Imports existing Git repos from a directory into new projects in git_base_path" -task :import_projects, [:directory,:email] => :environment do |t, args| - user_email, import_directory = args.email, args.directory - repos_to_import = Dir.glob("#{import_directory}/*") - git_base_path = Gitlab.config.git_base_path - imported_count, skipped_count, failed_count = 0 - - puts "Found #{repos_to_import.size} repos to import" - - repos_to_import.each do |repo_path| - repo_name = File.basename repo_path - clone_path = "#{git_base_path}#{repo_name}.git" - - puts " Processing #{repo_name}" - - if Dir.exists? clone_path - if Project.find_by_code(repo_name) - puts " INFO: #{clone_path} already exists in repositories directory, skipping." - skipped_count += 1 - next - else - puts " INFO: Project doesn't exist for #{repo_name} (but the repo does)." - end - else - # Clone the repo - unless clone_bare_repo_as_git(repo_path, clone_path) - failed_count += 1 - next - end - end - - # Create the project and repo - if create_repo_project(repo_name, user_email) - imported_count += 1 - else - failed_count += 1 - end - end - - puts "Finished importing #{imported_count} projects (skipped #{skipped_count}, failed #{failed_count})." -end - -# Clones a repo as bare git repo using the git_user -def clone_bare_repo_as_git(existing_path, new_path) - git_user = Gitlab.config.ssh_user - begin - sh "sudo -u #{git_user} -i git clone --bare '#{existing_path}' #{new_path}" - rescue Exception => msg - puts " ERROR: Failed to clone #{existing_path} to #{new_path}" - puts " Make sure #{git_user} can reach #{existing_path}" - puts " Exception-MSG: #{msg}" - end -end - -# Creates a project in GitLab given a `project_name` to use -# (for name, web url, and code url) and a `user_email` that will be -# assigned as the owner of the project. -def create_repo_project(project_name, user_email) - if user = User.find_by_email(user_email) - # Using find_by_code since that's the most important identifer to be unique - if Project.find_by_code(project_name) - puts " INFO: Project #{project_name} already exists in Gitlab, skipping." - else - project = Project.create( - name: project_name, - code: project_name, - path: project_name, - owner: user, - description: "Automatically created from 'import_projects' rake task on #{Time.now}" - ) - - if project.valid? - # Add user as admin for project - project.users_projects.create!(:project_access => UsersProject::MASTER, :user => user) - project.update_repository - else - puts " ERROR: Failed to create project #{project} because #{project.errors.first}" - end - end - else - puts " ERROR: user with #{user_email} not found, skipping" - end -end diff --git a/lib/tasks/gitlab/import.rake b/lib/tasks/gitlab/import.rake new file mode 100644 index 00000000000..09f0dc9e459 --- /dev/null +++ b/lib/tasks/gitlab/import.rake @@ -0,0 +1,54 @@ +namespace :gitlab do + namespace :import do + # How to use: + # + # 1. copy your bare repos under git base_path + # 2. run bundle exec rake gitlab:import:repos RAILS_ENV=production + # + # Notes: + # * project owner will be a first admin + # * existing projects will be skipped + # + desc "GITLAB | Import bare repositories from git_host -> base_path into GitLab project instance" + task :repos => :environment do + + git_base_path = Gitlab.config.git_base_path + repos_to_import = Dir.glob(git_base_path + '/*') + + repos_to_import.each do |repo_path| + repo_name = File.basename repo_path + + # skip gitolite admin + next if repo_name == 'gitolite-admin.git' + + path = repo_name.sub(/\.git$/, '') + + project = Project.find_by_path(path) + + puts "Processing #{repo_name}".yellow + + if project + puts " * #{project.name} (#{repo_name}) exists" + else + user = User.admins.first + + project_params = { + :name => path, + :code => path, + :path => path, + } + + project = Project.create_by_user(project_params, user) + + if project.valid? + puts " * Created #{project.name} (#{repo_name})".green + else + puts " * Failed trying to create #{project.name} (#{repo_name})".red + end + end + end + + puts "Done!".green + end + end +end