From e38fa32822a34f8dbb7bb9af6885f30a5f0ce2a7 Mon Sep 17 00:00:00 2001 From: Jeremy Mack Date: Tue, 13 Dec 2011 09:18:36 -0500 Subject: Calling update_repository - Better comment too --- lib/tasks/bulk_import.rake | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 lib/tasks/bulk_import.rake (limited to 'lib/tasks') diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake new file mode 100644 index 00000000000..3c1078bc80b --- /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 + -- cgit v1.2.1 From 2201ef80200d0a3f896a30fe10aa3a2c71b7bde1 Mon Sep 17 00:00:00 2001 From: Jeremy Mack Date: Tue, 13 Dec 2011 08:49:08 -0500 Subject: Add rake task for bulk repo importing Git repos should be in the import_projects directory in the root of application. The task is invoked via @rake import_projects@. --- lib/tasks/bulk_import.rake | 1 - 1 file changed, 1 deletion(-) (limited to 'lib/tasks') diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake index 3c1078bc80b..68893a316b5 100644 --- a/lib/tasks/bulk_import.rake +++ b/lib/tasks/bulk_import.rake @@ -91,4 +91,3 @@ def create_repo_project(project_name, user_email) false end end - -- cgit v1.2.1 From 60fee48eaa98bf859613160dcad87b8f0908aac6 Mon Sep 17 00:00:00 2001 From: Jeremy Mack Date: Tue, 13 Dec 2011 13:25:01 -0500 Subject: Better description for automatically created project --- lib/tasks/bulk_import.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/tasks') diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake index 68893a316b5..f463f3b061c 100644 --- a/lib/tasks/bulk_import.rake +++ b/lib/tasks/bulk_import.rake @@ -66,7 +66,7 @@ def create_repo_project(project_name, user_email) code: project_name, path: project_name, owner: user, - description: "Automatically created from CVS on #{Time.now.to_s}" + description: "Automatically created from Rake on #{Time.now.to_s}" ) # Add user as admin for project -- cgit v1.2.1 From 3fd3e1fcdf69e8544b25193a6e2a53716c65096c Mon Sep 17 00:00:00 2001 From: Jeremy Mack Date: Thu, 15 Dec 2011 16:55:53 -0500 Subject: Added detection and handling of exsiting repos --- lib/tasks/bulk_import.rake | 55 +++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 18 deletions(-) (limited to 'lib/tasks') diff --git a/lib/tasks/bulk_import.rake b/lib/tasks/bulk_import.rake index f463f3b061c..de00a68ad4d 100644 --- a/lib/tasks/bulk_import.rake +++ b/lib/tasks/bulk_import.rake @@ -20,21 +20,28 @@ task :import_projects, [:email] => :environment do |t, args| 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 + 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})." @@ -61,13 +68,25 @@ def create_repo_project(project_name, user_email) 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 Rake on #{Time.now.to_s}" - ) + 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!( @@ -82,7 +101,7 @@ def create_repo_project(project_name, user_email) if project.valid? true else - puts " ERROR: Failed to create project #{project} because #{project.errors}" + puts " ERROR: Failed to create project #{project} because #{project.errors.first}" false end end -- cgit v1.2.1