Commit 4023d9f85290faea47a2b2bcf3ce879ed0f07e9f

Authored by Dmitriy Zaporozhets
1 parent d71a68af

class for moving project

app/observers/project_observer.rb
... ... @@ -4,7 +4,10 @@ class ProjectObserver < ActiveRecord::Observer
4 4  
5 5 # Move repository if namespace changed
6 6 if project.namespace_id_changed? and not project.new_record?
7   - move_project(project)
  7 + old_dir = Namespace.find_by_id(project.namespace_id_was).try(:path) || ''
  8 + new_dir = Namespace.find_by_id(project.namespace_id).try(:path) || ''
  9 +
  10 + Gitlab::ProjectMover.new(project, old_dir, new_dir).execute
8 11 end
9 12 end
10 13  
... ... @@ -23,20 +26,4 @@ class ProjectObserver < ActiveRecord::Observer
23 26 def log_info message
24 27 Gitlab::AppLogger.info message
25 28 end
26   -
27   - def move_project(project)
28   - old_dir = Namespace.find_by_id(project.namespace_id_was).try(:path) || ''
29   - new_dir = Namespace.find_by_id(project.namespace_id).try(:path) || ''
30   -
31   - # Create new dir if missing
32   - new_dir_path = File.join(Gitlab.config.git_base_path, new_dir)
33   - Dir.mkdir(new_dir_path) unless File.exists?(new_dir_path)
34   -
35   - old_path = File.join(Gitlab.config.git_base_path, old_dir, "#{project.path}.git")
36   - new_path = File.join(new_dir_path, "#{project.path}.git")
37   -
38   - `mv #{old_path} #{new_path}`
39   -
40   - log_info "Project #{project.name} was moved from #{old_path} to #{new_path}"
41   - end
42 29 end
... ...
features/support/env.rb
... ... @@ -5,7 +5,7 @@ require 'rspec'
5 5 require 'database_cleaner'
6 6 require 'spinach/capybara'
7 7  
8   -%w(gitolite_stub stubbed_repository valid_commit).each do |f|
  8 +%w(namespaces_stub gitolite_stub stubbed_repository valid_commit).each do |f|
9 9 require Rails.root.join('spec', 'support', f)
10 10 end
11 11  
... ...
lib/gitlab/project_mover.rb 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +# ProjectMover class
  2 +#
  3 +# Used for moving project repositories from one subdir to another
  4 +module Gitlab
  5 + class ProjectMover
  6 + attr_reader :project, :old_dir, :new_dir
  7 +
  8 + def initialize(project, old_dir, new_dir)
  9 + @project = project
  10 + @old_dir = old_dir
  11 + @new_dir = new_dir
  12 + end
  13 +
  14 + def execute
  15 + # Create new dir if missing
  16 + new_dir_path = File.join(Gitlab.config.git_base_path, new_dir)
  17 + Dir.mkdir(new_dir_path) unless File.exists?(new_dir_path)
  18 +
  19 + old_path = File.join(Gitlab.config.git_base_path, old_dir, "#{project.path}.git")
  20 + new_path = File.join(new_dir_path, "#{project.path}.git")
  21 +
  22 + if system("mv #{old_path} #{new_path}")
  23 + log_info "Project #{project.name} was moved from #{old_path} to #{new_path}"
  24 + true
  25 + else
  26 + log_info "Error! Project #{project.name} cannot be moved from #{old_path} to #{new_path}"
  27 + false
  28 + end
  29 + end
  30 +
  31 + protected
  32 +
  33 + def log_info message
  34 + Gitlab::AppLogger.info message
  35 + end
  36 + end
  37 +end
... ...
spec/support/namespaces_stub.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +require 'namespace'
  2 +require 'gitlab/project_mover'
  3 +
  4 +class Namespace
  5 + def ensure_dir_exist
  6 + true
  7 + end
  8 +end
  9 +
  10 +class Gitlab::ProjectMover
  11 + def execute
  12 + true
  13 + end
  14 +end
... ...
spec/support/stubbed_repository.rb
... ... @@ -28,10 +28,4 @@ module StubbedRepository
28 28 end
29 29 end
30 30  
31   -class Namespace
32   - def ensure_dir_exist
33   - true
34   - end
35   -end
36   -
37 31 Project.send(:include, StubbedRepository)
... ...