Skip to content

Commit abe0e2d

Browse files
author
root
committed
Rework repository mover
1 parent c47445b commit abe0e2d

File tree

10 files changed

+96
-61
lines changed

10 files changed

+96
-61
lines changed

Diff for: app/controllers/repository_git_extras_controller.rb

+4-10
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ def update
1818
end
1919

2020

21-
<<<<<<< HEAD
2221
def sort_urls
2322
@git_extra = @repository.extra
2423
if request.post?
@@ -32,16 +31,11 @@ def sort_urls
3231

3332

3433
def move
35-
@projects = Project.all
36-
@projects.delete(@project)
37-
@move_repository_form = RepositoryMover.new()
34+
@move_repository_form = MoveRepositoryForm.new(@repository)
3835
if request.post?
39-
@move_repository_form = RepositoryMover.new(params[:repository_mover].merge(repository_id: @repository.id))
40-
if @move_repository_form.valid?
41-
project = @move_repository_form.project
42-
@repository.update_attribute(:project_id, project.id)
43-
GitoliteAccessor.move_repository(@repository)
44-
redirect_to settings_project_path(project, tab: 'repositories')
36+
@move_repository_form = MoveRepositoryForm.new(@repository)
37+
if @move_repository_form.submit(params[:repository_mover])
38+
redirect_to settings_project_path(@repository.project, tab: 'repositories')
4539
end
4640
end
4741
end

Diff for: app/forms/base_form.rb

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module BaseForm
2+
extend ActiveSupport::Concern
3+
4+
included do
5+
include ActiveModel::Validations
6+
include ActiveModel::Conversion
7+
extend ActiveModel::Naming
8+
end
9+
10+
11+
def persisted?
12+
false
13+
end
14+
15+
16+
def submit(attributes = {})
17+
attributes.each do |name, value|
18+
send("#{name}=", value)
19+
end
20+
if valid?
21+
valid_form_submitted
22+
true
23+
else
24+
false
25+
end
26+
end
27+
28+
end

Diff for: app/forms/move_repository_form.rb

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class MoveRepositoryForm
2+
unloadable
3+
4+
include BaseForm
5+
6+
attr_reader :repository
7+
attr_accessor :project_id
8+
9+
validates_presence_of :project_id
10+
validate :repository_is_movable
11+
validate :target_project
12+
validate :repository_uniqueness
13+
14+
15+
def initialize(repository)
16+
@repository = repository
17+
end
18+
19+
20+
def project
21+
@project ||= Project.find_by_id(project_id)
22+
end
23+
24+
25+
def valid_form_submitted
26+
repository.update_attribute(:project_id, project.id)
27+
GitoliteAccessor.move_repository(repository)
28+
end
29+
30+
31+
private
32+
33+
34+
def repository_is_movable
35+
errors.add(:base, :identifier_empty) if !repository.movable?
36+
end
37+
38+
39+
def target_project
40+
errors.add(:base, :wrong_target_project) if repository.project == project
41+
end
42+
43+
44+
def repository_uniqueness
45+
new_repo = project.repositories.find_by_identifier(repository.identifier)
46+
errors.add(:base, :identifier_taken) if !new_repo.nil?
47+
end
48+
49+
end

Diff for: app/helpers/extend_repositories_helper.rb

+5
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ def label_for_url_type(url_type)
5555
RepositoryGitExtra::URLS_ICONS[url_type][:label]
5656
end
5757

58+
59+
def render_options_for_move_repo_select_box(project)
60+
projects = Project.active
61+
project_tree_options_for_select(projects, selected: project) if projects.any?
62+
end
5863
end

Diff for: app/models/concerns/gitolitable/permissions.rb

+5
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,10 @@ def deletable?
8080
RedmineGitHosting::Config.delete_git_repositories?
8181
end
8282

83+
84+
def movable?
85+
!identifier.nil? && !identifier.empty?
86+
end
87+
8388
end
8489
end

Diff for: app/models/repository_mover.rb

-48
This file was deleted.

Diff for: app/views/projects/settings/_repositories.html.haml

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
class: 'icon icon-edit'
4646

4747
= link_to l(:button_move), move_repository_git_extras_path(repository),
48-
class: 'icon icon-move'
48+
class: 'icon icon-move' if repository.is_a?(Repository::Xitolite) && repository.movable?
4949

5050
= delete_link repository_path(repository)
5151

Diff for: app/views/repository_git_extras/move.html.haml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
.flash-messages= error_messages_for 'move_repository_form'
1010

11-
%p= f.select :project_id, options_from_collection_for_select(@projects, :id, :name), prompt: 'Select a project'
11+
%p= f.select :project_id, render_options_for_move_repo_select_box(@project), prompt: 'Select a project'
1212
%p
1313
= f.submit l(:button_move)
1414
= link_to l(:button_cancel), settings_project_path(@project, tab: 'repositories')

Diff for: config/locales/models/repository_mover/fr.yml renamed to config/locales/forms/move_repository/fr.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ fr:
44
activemodel:
55
errors:
66
models:
7-
repository_mover:
7+
move_repository_form:
88
attributes:
99
base:
1010
identifier_empty: Ne peut déplacer un dépôt avec un identifiant vide
1111
identifier_taken: Identifiant de dépôt déjà utilisé par le nouveau projet
12+
wrong_target_project: Le projet de destination est identique au projet source

Diff for: lib/redmine_git_hosting/extra_loading.rb

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module ExtraLoading
66

77
# Load Forms and Concerns objects
88
[
9+
Rails.root.join('plugins', 'redmine_git_hosting', 'app', 'forms'),
910
Rails.root.join('plugins', 'redmine_git_hosting', 'app', 'models', 'concerns'),
1011
Rails.root.join('plugins', 'redmine_git_hosting', 'app', 'presenters'),
1112
Rails.root.join('plugins', 'redmine_git_hosting', 'app', 'reports'),

0 commit comments

Comments
 (0)