Commit 37e39e4176757019fb6e9d437b86229497e63b57
1 parent
36dbac2f
Exists in
master
and in
4 other branches
Added bare import script. Removed old unworking script
Showing
2 changed files
with
54 additions
and
83 deletions
Show diff stats
lib/tasks/bulk_import.rake
| ... | ... | @@ -1,83 +0,0 @@ |
| 1 | -desc "Imports existing Git repos from a directory into new projects in git_base_path" | |
| 2 | -task :import_projects, [:directory,:email] => :environment do |t, args| | |
| 3 | - user_email, import_directory = args.email, args.directory | |
| 4 | - repos_to_import = Dir.glob("#{import_directory}/*") | |
| 5 | - git_base_path = Gitlab.config.git_base_path | |
| 6 | - imported_count, skipped_count, failed_count = 0 | |
| 7 | - | |
| 8 | - puts "Found #{repos_to_import.size} repos to import" | |
| 9 | - | |
| 10 | - repos_to_import.each do |repo_path| | |
| 11 | - repo_name = File.basename repo_path | |
| 12 | - clone_path = "#{git_base_path}#{repo_name}.git" | |
| 13 | - | |
| 14 | - puts " Processing #{repo_name}" | |
| 15 | - | |
| 16 | - if Dir.exists? clone_path | |
| 17 | - if Project.find_by_code(repo_name) | |
| 18 | - puts " INFO: #{clone_path} already exists in repositories directory, skipping." | |
| 19 | - skipped_count += 1 | |
| 20 | - next | |
| 21 | - else | |
| 22 | - puts " INFO: Project doesn't exist for #{repo_name} (but the repo does)." | |
| 23 | - end | |
| 24 | - else | |
| 25 | - # Clone the repo | |
| 26 | - unless clone_bare_repo_as_git(repo_path, clone_path) | |
| 27 | - failed_count += 1 | |
| 28 | - next | |
| 29 | - end | |
| 30 | - end | |
| 31 | - | |
| 32 | - # Create the project and repo | |
| 33 | - if create_repo_project(repo_name, user_email) | |
| 34 | - imported_count += 1 | |
| 35 | - else | |
| 36 | - failed_count += 1 | |
| 37 | - end | |
| 38 | - end | |
| 39 | - | |
| 40 | - puts "Finished importing #{imported_count} projects (skipped #{skipped_count}, failed #{failed_count})." | |
| 41 | -end | |
| 42 | - | |
| 43 | -# Clones a repo as bare git repo using the git_user | |
| 44 | -def clone_bare_repo_as_git(existing_path, new_path) | |
| 45 | - git_user = Gitlab.config.ssh_user | |
| 46 | - begin | |
| 47 | - sh "sudo -u #{git_user} -i git clone --bare '#{existing_path}' #{new_path}" | |
| 48 | - rescue Exception => msg | |
| 49 | - puts " ERROR: Failed to clone #{existing_path} to #{new_path}" | |
| 50 | - puts " Make sure #{git_user} can reach #{existing_path}" | |
| 51 | - puts " Exception-MSG: #{msg}" | |
| 52 | - end | |
| 53 | -end | |
| 54 | - | |
| 55 | -# Creates a project in GitLab given a `project_name` to use | |
| 56 | -# (for name, web url, and code url) and a `user_email` that will be | |
| 57 | -# assigned as the owner of the project. | |
| 58 | -def create_repo_project(project_name, user_email) | |
| 59 | - if user = User.find_by_email(user_email) | |
| 60 | - # Using find_by_code since that's the most important identifer to be unique | |
| 61 | - if Project.find_by_code(project_name) | |
| 62 | - puts " INFO: Project #{project_name} already exists in Gitlab, skipping." | |
| 63 | - else | |
| 64 | - project = Project.create( | |
| 65 | - name: project_name, | |
| 66 | - code: project_name, | |
| 67 | - path: project_name, | |
| 68 | - owner: user, | |
| 69 | - description: "Automatically created from 'import_projects' rake task on #{Time.now}" | |
| 70 | - ) | |
| 71 | - | |
| 72 | - if project.valid? | |
| 73 | - # Add user as admin for project | |
| 74 | - project.users_projects.create!(:project_access => UsersProject::MASTER, :user => user) | |
| 75 | - project.update_repository | |
| 76 | - else | |
| 77 | - puts " ERROR: Failed to create project #{project} because #{project.errors.first}" | |
| 78 | - end | |
| 79 | - end | |
| 80 | - else | |
| 81 | - puts " ERROR: user with #{user_email} not found, skipping" | |
| 82 | - end | |
| 83 | -end |
| ... | ... | @@ -0,0 +1,54 @@ |
| 1 | +namespace :gitlab do | |
| 2 | + namespace :import do | |
| 3 | + # How to use: | |
| 4 | + # | |
| 5 | + # 1. copy your bare repos under git base_path | |
| 6 | + # 2. run bundle exec rake gitlab:import:repos RAILS_ENV=production | |
| 7 | + # | |
| 8 | + # Notes: | |
| 9 | + # * project owner will be a first admin | |
| 10 | + # * existing projects will be skipped | |
| 11 | + # | |
| 12 | + desc "GITLAB | Import bare repositories from git_host -> base_path into GitLab project instance" | |
| 13 | + task :repos => :environment do | |
| 14 | + | |
| 15 | + git_base_path = Gitlab.config.git_base_path | |
| 16 | + repos_to_import = Dir.glob(git_base_path + '/*') | |
| 17 | + | |
| 18 | + repos_to_import.each do |repo_path| | |
| 19 | + repo_name = File.basename repo_path | |
| 20 | + | |
| 21 | + # skip gitolite admin | |
| 22 | + next if repo_name == 'gitolite-admin.git' | |
| 23 | + | |
| 24 | + path = repo_name.sub(/\.git$/, '') | |
| 25 | + | |
| 26 | + project = Project.find_by_path(path) | |
| 27 | + | |
| 28 | + puts "Processing #{repo_name}".yellow | |
| 29 | + | |
| 30 | + if project | |
| 31 | + puts " * #{project.name} (#{repo_name}) exists" | |
| 32 | + else | |
| 33 | + user = User.admins.first | |
| 34 | + | |
| 35 | + project_params = { | |
| 36 | + :name => path, | |
| 37 | + :code => path, | |
| 38 | + :path => path, | |
| 39 | + } | |
| 40 | + | |
| 41 | + project = Project.create_by_user(project_params, user) | |
| 42 | + | |
| 43 | + if project.valid? | |
| 44 | + puts " * Created #{project.name} (#{repo_name})".green | |
| 45 | + else | |
| 46 | + puts " * Failed trying to create #{project.name} (#{repo_name})".red | |
| 47 | + end | |
| 48 | + end | |
| 49 | + end | |
| 50 | + | |
| 51 | + puts "Done!".green | |
| 52 | + end | |
| 53 | + end | |
| 54 | +end | ... | ... |