summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2011-12-16 00:59:07 -0800
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2011-12-16 00:59:07 -0800
commitced572c328507e3d327f23e9673ba33584845501 (patch)
tree2794239341261420c14c014587da051b784f6a2f /lib
parentfa3cb28cbed677c5cfed0ec004d8a0e6766b2d41 (diff)
parent3fd3e1fcdf69e8544b25193a6e2a53716c65096c (diff)
downloadgitlab-ce-ced572c328507e3d327f23e9673ba33584845501.tar.gz
Merge pull request #196 from mutewinter/bulk_repo_import
Bulk repo import Rake task
Diffstat (limited to 'lib')
-rw-r--r--lib/tasks/bulk_import.rake112
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake
new file mode 100644
index 00000000000..de00a68ad4d
--- /dev/null
+++ b/lib/tasks/bulk_import.rake
@@ -0,0 +1,112 @@
+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
+ 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_full_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)
+ 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 = nil
+ if Project.find_by_code(project_name)
+ puts " ERROR: Project already exists #{project_name}"
+ return false
+ project = Project.find_by_code(project_name)
+ else
+ project = Project.create(
+ name: project_name,
+ code: project_name,
+ path: project_name,
+ owner: user,
+ description: "Automatically created from Rake on #{Time.now.to_s}"
+ )
+ end
+
+ unless project.valid?
+ puts " ERROR: Failed to create project #{project} because #{project.errors.first}"
+ return false
+ end
+
+ # 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.first}"
+ false
+ end
+ end
+ else
+ puts " ERROR: #{user_email} not found, skipping"
+ false
+ end
+end