summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-05-25 00:07:19 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-05-25 00:07:19 +0300
commit233eb1c693178068cb769e1633df81e938c543ee (patch)
tree75aa93dadf208765ae22da0cf11bf6268685b327
parent7ef1c99db30ac5ad2ecd04e3b0b9b847a2805fb6 (diff)
downloadgitlab-ce-233eb1c693178068cb769e1633df81e938c543ee.tar.gz
Rename repo feature
-rw-r--r--app/controllers/application_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb4
-rw-r--r--app/models/project.rb24
-rw-r--r--app/observers/project_observer.rb1
-rw-r--r--app/views/projects/edit.html.haml20
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