From 04b51a2b892c9c675f638239a3fbfec39cdc4729 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Sun, 25 Nov 2012 18:24:27 +0200
Subject: [PATCH] Improve activate_namespace task to build missing dirs and
 moving repos correctly

---
 lib/gitlab/backend/gitolite.rb            |  6 +++++
 lib/tasks/gitlab/activate_namespaces.rake | 32 ++++++++++++++++++++---
 2 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/gitolite.rb
index fe5dcef40a9..6d88b92bdd2 100644
--- a/lib/gitlab/backend/gitolite.rb
+++ b/lib/gitlab/backend/gitolite.rb
@@ -38,6 +38,12 @@ module Gitlab
       config.admin_all_repo!
     end
 
+    def update_repositories projects
+      config.apply do |config|
+        config.update_projects(projects)
+      end
+    end
+
     alias_method :create_repository, :update_repository
   end
 end
diff --git a/lib/tasks/gitlab/activate_namespaces.rake b/lib/tasks/gitlab/activate_namespaces.rake
index 718c2ff2a6e..637964e151c 100644
--- a/lib/tasks/gitlab/activate_namespaces.rake
+++ b/lib/tasks/gitlab/activate_namespaces.rake
@@ -1,6 +1,8 @@
 namespace :gitlab do
   desc "GITLAB | Enable usernames and namespaces for user projects"
   task activate_namespaces: :environment do
+    print "\nUsernames for users:".yellow
+
     User.find_each(batch_size: 500) do |user|
       next if user.namespace
 
@@ -14,6 +16,8 @@ namespace :gitlab do
       end
     end
 
+    print "\n\nDirs for groups:".yellow
+
     Group.find_each(batch_size: 500) do |group|
       if group.ensure_dir_exist
         print '.'.green
@@ -22,23 +26,43 @@ namespace :gitlab do
       end
     end
 
+    print "\n\nMove projects from groups under groups dirs:".yellow
     git_path = Gitlab.config.git_base_path
 
     Project.where('namespace_id IS NOT NULL').find_each(batch_size: 500) do |project|
       next unless project.group
+      next if project.empty_repo?
 
       group = project.group
 
-      next if File.exists?(File.join(git_path, project.path_with_namespace))
+      puts "\n"
+      print " * #{project.name}: "
+
+      new_path = File.join(git_path, project.path_with_namespace + '.git')
+
+      if File.exists?(new_path)
+        print "ok. already at #{new_path}".cyan
+        next
+      end
+
+      old_path = File.join(git_path, project.path + '.git')
 
-      next unless File.exists?(File.join(git_path, project.path))
+      unless File.exists?(old_path)
+        print "missing. not found at #{old_path}".red
+        next
+      end
 
       begin
         Gitlab::ProjectMover.new(project, '', group.path).execute
-        print '.'.green
+        print "ok. Moved to #{new_path}".green
       rescue
-        print 'F'.red
+        print "Failed moving to #{new_path}".red
       end
     end
+
+    print "\n\nRebuild gitolite:".yellow
+    gitolite = Gitlab::Gitolite.new
+    gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
+    puts "\n"
   end
 end
-- 
GitLab