From 71214bee755028946ff12748b8d7acbfef62d18d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Nov 2012 22:41:16 +0300 Subject: [PATCH] Move directory with project. Fixed all related path methods to use namespace --- app/controllers/admin/groups_controller.rb | 8 ++++++-- app/controllers/dashboard_controller.rb | 2 +- app/controllers/groups_controller.rb | 2 +- app/observers/issue_observer.rb | 6 +++--- app/observers/project_observer.rb | 20 ++++++++++++++++++++ app/roles/repository.rb | 8 ++++++-- spec/factories.rb | 6 +++++- spec/models/namespace_spec.rb | 12 ++++++++++++ spec/models/project_spec.rb | 1 + 9 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 spec/models/namespace_spec.rb diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 0bba0199..1e523050 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -48,14 +48,18 @@ class Admin::GroupsController < AdminController def project_update project_ids = params[:project_ids] - Project.where(id: project_ids).update_all(group_id: @group.id) + + Project.where(id: project_ids).each do |project| + project.namespace_id = @group.id + project.save + end redirect_to :back, notice: 'Group was successfully updated.' end def remove_project @project = Project.find(params[:project_id]) - @project.group_id = nil + @project.namespace_id = nil @project.save redirect_to :back, notice: 'Group was successfully updated.' diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 8d9329f2..ad242d30 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -4,7 +4,7 @@ class DashboardController < ApplicationController before_filter :event_filter, only: :index def index - @groups = Group.where(id: current_user.projects.pluck(:group_id)) + @groups = Group.where(id: current_user.projects.pluck(:namespace_id)) @projects = current_user.projects_sorted_by_activity @projects = @projects.page(params[:page]).per(30) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 63f70cd0..c98332eb 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -54,7 +54,7 @@ class GroupsController < ApplicationController end def projects - @projects ||= current_user.projects_sorted_by_activity.where(group_id: @group.id) + @projects ||= current_user.projects_sorted_by_activity.where(namespace_id: @group.id) end def project_ids diff --git a/app/observers/issue_observer.rb b/app/observers/issue_observer.rb index 62fd9bf8..9f9762ae 100644 --- a/app/observers/issue_observer.rb +++ b/app/observers/issue_observer.rb @@ -3,7 +3,7 @@ class IssueObserver < ActiveRecord::Observer def after_create(issue) if issue.assignee && issue.assignee != current_user - Notify.new_issue_email(issue.id).deliver + Notify.new_issue_email(issue.id).deliver end end @@ -14,8 +14,8 @@ class IssueObserver < ActiveRecord::Observer status = 'closed' if issue.is_being_closed? status = 'reopened' if issue.is_being_reopened? if status - Note.create_status_change_note(issue, current_user, status) - [issue.author, issue.assignee].compact.each do |recipient| + Note.create_status_change_note(issue, current_user, status) + [issue.author, issue.assignee].compact.each do |recipient| Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) end end diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb index 03a61709..18874e72 100644 --- a/app/observers/project_observer.rb +++ b/app/observers/project_observer.rb @@ -1,6 +1,11 @@ class ProjectObserver < ActiveRecord::Observer def after_save(project) project.update_repository + + # Move repository if namespace changed + if project.namespace_id_changed? + move_project(project) + end end def after_destroy(project) @@ -18,4 +23,19 @@ class ProjectObserver < ActiveRecord::Observer def log_info message Gitlab::AppLogger.info message end + + def move_project(project) + old_dir = Namespace.find_by_id(project.namespace_id_was).try(:code) || '' + new_dir = Namespace.find_by_id(project.namespace_id).try(:code) || '' + + # Create new dir if missing + new_dir_path = File.join(Gitlab.config.git_base_path, new_dir) + Dir.mkdir(new_dir_path) unless File.exists?(new_dir_path) + + old_path = File.join(Gitlab.config.git_base_path, old_dir, "#{project.path}.git") + new_path = File.join(new_dir_path, "#{project.path}.git") + + binding.pry + `mv #{old_path} #{new_path}` + end end diff --git a/app/roles/repository.rb b/app/roles/repository.rb index 88468117..e49761b6 100644 --- a/app/roles/repository.rb +++ b/app/roles/repository.rb @@ -79,11 +79,15 @@ module Repository end def url_to_repo - git_host.url_to_repo(path) + git_host.url_to_repo(path_with_namespace) end def path_to_repo - File.join(Gitlab.config.git_base_path, "#{path}.git") + File.join(Gitlab.config.git_base_path, namespace_dir, "#{path}.git") + end + + def namespace_dir + namespace.try(:code) || '' end def update_repository diff --git a/spec/factories.rb b/spec/factories.rb index 7c33f0ec..a49cd69e 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -29,10 +29,14 @@ FactoryGirl.define do owner end - factory :group do + factory :namespace do sequence(:name) { |n| "group#{n}" } code { name.downcase.gsub(/\s/, '_') } owner + + factory :group do + type 'Group' + end end factory :users_project do diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb new file mode 100644 index 00000000..ce97d01a --- /dev/null +++ b/spec/models/namespace_spec.rb @@ -0,0 +1,12 @@ +require 'spec_helper' + +describe Namespace do + let!(:namespace) { create(:namespace) } + + it { should have_many :projects } + it { should validate_presence_of :name } + it { should validate_uniqueness_of(:name) } + it { should validate_presence_of :code } + it { should validate_uniqueness_of(:code) } + it { should validate_presence_of :owner } +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 5bcab924..dda9eefa 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -24,6 +24,7 @@ require 'spec_helper' describe Project do describe "Associations" do it { should belong_to(:group) } + it { should belong_to(:namespace) } it { should belong_to(:owner).class_name('User') } it { should have_many(:users) } it { should have_many(:events).dependent(:destroy) }