diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-05-25 00:07:19 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-05-25 00:07:19 +0300 |
commit | 233eb1c693178068cb769e1633df81e938c543ee (patch) | |
tree | 75aa93dadf208765ae22da0cf11bf6268685b327 | |
parent | 7ef1c99db30ac5ad2ecd04e3b0b9b847a2805fb6 (diff) | |
download | gitlab-ce-233eb1c693178068cb769e1633df81e938c543ee.tar.gz |
Rename repo feature
-rw-r--r-- | app/controllers/application_controller.rb | 2 | ||||
-rw-r--r-- | app/controllers/projects_controller.rb | 4 | ||||
-rw-r--r-- | app/models/project.rb | 24 | ||||
-rw-r--r-- | app/observers/project_observer.rb | 1 | ||||
-rw-r--r-- | app/views/projects/edit.html.haml | 20 |
5 files changed, 48 insertions, 3 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index dfc1fdcee8a..d156166503f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -69,7 +69,7 @@ class ApplicationController < ActionController::Base @project else @project = nil - render_404 + render_404 and return end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 0e05213b797..e202ed3234e 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -33,12 +33,12 @@ class ProjectsController < ProjectResourceController end def update - status = ::Projects::UpdateContext.new(project, current_user, params).execute + status = ::Projects::UpdateContext.new(@project, current_user, params).execute respond_to do |format| if status flash[:notice] = 'Project was successfully updated.' - format.html { redirect_to edit_project_path(project), notice: 'Project was successfully updated.' } + format.html { redirect_to edit_project_path(@project), notice: 'Project was successfully updated.' } format.js else format.html { render action: "edit" } diff --git a/app/models/project.rb b/app/models/project.rb index 084e019b4e9..9147aed3d40 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -423,4 +423,28 @@ class Project < ActiveRecord::Base def forked? !(forked_project_link.nil? || forked_project_link.forked_from_project.nil?) end + + def rename_repo + old_path_with_namespace = File.join(namespace_dir, path_was) + new_path_with_namespace = File.join(namespace_dir, path) + + if gitlab_shell.mv_repository(old_path_with_namespace, new_path_with_namespace) + # If repository moved successfully we need to remove old satellite + # and send update instructions to users. + # However we cannot allow rollback since we moved repository + # So we basically we mute exceptions in next actions + begin + gitlab_shell.rm_satellites(old_path_with_namespace) + send_move_instructions + rescue + # Returning false does not rolback after_* transaction but gives + # us information about failing some of tasks + false + end + else + # if we cannot move namespace directory we should rollback + # db changes in order to prevent out of sync between db and fs + raise Exception.new('repository cannot be renamed') + end + end end diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb index de9edf41c6d..dda7be625da 100644 --- a/app/observers/project_observer.rb +++ b/app/observers/project_observer.rb @@ -12,6 +12,7 @@ class ProjectObserver < BaseObserver def after_update(project) project.send_move_instructions if project.namespace_id_changed? + project.rename_repo if project.path_changed? end def after_destroy(project) diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index d57aa83ec2b..bec64bf6c58 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -11,6 +11,8 @@ %li.active = link_to 'Settings', '#tab-settings', 'data-toggle' => 'tab' %li + = link_to 'Rename repo', '#tab-rename', 'data-toggle' => 'tab' + %li = link_to 'Transfer', '#tab-transfer', 'data-toggle' => 'tab' %li = link_to 'Remove', '#tab-remove', 'data-toggle' => 'tab' @@ -137,6 +139,24 @@ - else %p.nothing_here_message Only project owner can transfer a project + .tab-pane#tab-rename + .ui-box.ui-box-danger + %h5.title Rename repository + .errors-holder + .form-holder + = form_for(@project) do |f| + .control-group + = f.label :path do + %span Path + .controls + .clearfix + = f.text_field :path + %ul + %li Be careful. Rename of project repo can have unintended side effects + %li You will need to update your local repositories to point to the new location. + .form-actions + = f.submit 'Rename', class: "btn btn-remove" + .tab-pane#tab-remove - if can?(current_user, :remove_project, @project) .ui-box.ui-box-danger |