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 |