diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake new file mode 100644 index 00000000..3c1078bc --- /dev/null +++ b/lib/tasks/bulk_import.rake @@ -0,0 +1,94 @@ +IMPORT_DIRECTORY = 'import_projects' +REPOSITORY_DIRECTORY = '/home/git/repositories' + +desc "Imports existing Git repos into new projects from the import_projects folder" +task :import_projects, [:email] => :environment do |t, args| + user_email = args.email + repos_to_import = Dir.glob("#{IMPORT_DIRECTORY}/*") + + puts "Found #{repos_to_import.length} repos to import" + + imported_count = 0 + skipped_count = 0 + failed_count = 0 + repos_to_import.each do |repo_path| + repo_name = File.basename repo_path + repo_full_path = File.join(Rails.root, repo_path) + + puts " Processing #{repo_name}" + + clone_path = "#{REPOSITORY_DIRECTORY}/#{repo_name}.git" + + if Dir.exists? clone_path + puts " INFO: #{clone_path} already exists in repositories directory, skipping." + skipped_count += 1 + next + else + if clone_bare_repo_as_git(repo_full_path, clone_path) + if create_repo_project(repo_name, user_email) + imported_count += 1 + else + failed_count += 1 + end + else + failed_count += 1 + end + 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) + begin + sh "sudo -u git -i git clone --bare '#{existing_path}' #{new_path}" + true + rescue + puts " ERROR: Faild to clone #{existing_path} to #{new_path}" + false + end +end + +# Creats a project in Gitlag 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) + user = User.find_by_email(user_email) + if user + # 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." + false + else + project = Project.create( + name: project_name, + code: project_name, + path: project_name, + owner: user, + description: "Automatically created from CVS on #{Time.now.to_s}" + ) + + # Add user as admin for project + project.users_projects.create!( + :repo_access => Repository::REPO_RW, + :project_access => Project::PROJECT_RWA, + :user => user + ) + + # Per projects_controller.rb#37 + project.update_repository + + if project.valid? + true + else + puts " ERROR: Failed to create project #{project} because #{project.errors}" + false + end + end + else + puts " ERROR: #{user_email} not found, skipping" + false + end +end +