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,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 @@ | @@ -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 |