Skip to content

Commit c47445b

Browse files
author
root
committed
Add move repository feature. (It should be tested!)
1 parent e1952d3 commit c47445b

File tree

10 files changed

+126
-0
lines changed

10 files changed

+126
-0
lines changed

Diff for: app/controllers/repository_git_extras_controller.rb

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

2020

21+
<<<<<<< HEAD
2122
def sort_urls
2223
@git_extra = @repository.extra
2324
if request.post?
@@ -29,4 +30,28 @@ def sort_urls
2930
end
3031
end
3132

33+
34+
def move
35+
@projects = Project.all
36+
@projects.delete(@project)
37+
@move_repository_form = RepositoryMover.new()
38+
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')
45+
end
46+
end
47+
end
48+
49+
50+
private
51+
52+
53+
def set_git_extra
54+
@git_extra = @repository.extra
55+
end
56+
3257
end

Diff for: app/models/repository_mover.rb

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class RepositoryMover
2+
include ActiveModel::Validations
3+
include ActiveModel::Conversion
4+
extend ActiveModel::Naming
5+
6+
attr_accessor :repository_id, :project_id
7+
8+
validates_presence_of :repository_id, :project_id
9+
validate :repository_identifier
10+
validate :repository_uniqueness
11+
12+
13+
def initialize(attributes = {})
14+
attributes.each do |name, value|
15+
send("#{name}=", value)
16+
end
17+
end
18+
19+
20+
def project
21+
Project.find_by_id(project_id)
22+
end
23+
24+
25+
def repository
26+
Repository.find_by_id(repository_id)
27+
end
28+
29+
30+
def persisted?
31+
false
32+
end
33+
34+
35+
private
36+
37+
38+
def repository_identifier
39+
errors.add(:base, :identifier_empty) if (repository.identifier.nil? || repository.identifier.blank?)
40+
end
41+
42+
43+
def repository_uniqueness
44+
new_repo = project.repositories.find_by_identifier(repository.identifier)
45+
errors.add(:base, :identifier_taken) if !new_repo.nil?
46+
end
47+
48+
end

Diff for: app/services/gitolite_accessor.rb

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ def update_repository(repository, opts = {})
3434
end
3535

3636

37+
def move_repository(repository, opts = {})
38+
logger.info("User '#{User.current.login}' has moved repository '#{repository.gitolite_repository_name}'")
39+
resync_gitolite(:move_repository, repository.id, opts)
40+
end
41+
42+
3743
def destroy_repository(repository)
3844
logger.info("User '#{User.current.login}' has removed repository '#{repository.gitolite_repository_name}'")
3945
resync_gitolite(:delete_repository, repository.data_for_destruction)

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

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
= link_to l(:button_edit), edit_repository_path(repository),
4545
class: 'icon icon-edit'
4646

47+
= link_to l(:button_move), move_repository_git_extras_path(repository),
48+
class: 'icon icon-move'
49+
4750
= delete_link repository_path(repository)
4851

4952
- else

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

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
%h2= l(:label_move_repository, repo_name: @repository.gitolite_repository_name)
2+
3+
.box
4+
5+
= labelled_form_for :repository_mover, @move_repository_form,
6+
url: move_repository_git_extras_path(@repository),
7+
html: { method: :post, class: 'tabular', data: { confirm: l(:text_are_you_sure) } } do |f|
8+
9+
.flash-messages= error_messages_for 'move_repository_form'
10+
11+
%p= f.select :project_id, options_from_collection_for_select(@projects, :id, :name), prompt: 'Select a project'
12+
%p
13+
= f.submit l(:button_move)
14+
= link_to l(:button_cancel), settings_project_path(@project, tab: 'repositories')

Diff for: assets/images/move.png

357 Bytes
Loading

Diff for: assets/stylesheets/application.css

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ PLUGIN ICONS
55

66
.icon-git-logo { background-image: url('../images/git_icon.png'); padding-right: 5px; }
77
.icon-clone { background-image: url('../images/clone.png'); }
8+
.icon-move { background-image: url('../images/move.png'); }
89

910
.icon-git { padding-right: 15px; }
1011
.icon-git-disabled { opacity: 0.5; }

Diff for: config/locales/models/repository_mover/fr.yml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
fr:
2+
label_move_repository: "Déplacement du dépôt : '%{repo_name}'"
3+
4+
activemodel:
5+
errors:
6+
models:
7+
repository_mover:
8+
attributes:
9+
base:
10+
identifier_empty: Ne peut déplacer un dépôt avec un identifiant vide
11+
identifier_taken: Identifiant de dépôt déjà utilisé par le nouveau projet

Diff for: config/routes.rb

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
resource :git_extras, controller: 'repository_git_extras', only: [:update] do
1414
match 'sort_urls', via: [:get, :post]
15+
member do
16+
match 'move', via: [:get, :post]
17+
end
1518
end
1619

1720
resource :git_notifications, controller: 'repository_git_notifications'

Diff for: lib/redmine_git_hosting/gitolite_wrapper/repositories.rb

+15
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,21 @@ def delete_repository
6969
end
7070

7171

72+
def move_repository
73+
if repository = Repository.find_by_id(object_id)
74+
admin.transaction do
75+
RedmineGitHosting::GitoliteHandlers::RepositoryMover.new(repository, gitolite_config, action).call
76+
gitolite_admin_repo_commit("#{repository.gitolite_repository_name}")
77+
end
78+
79+
# Fetch changeset
80+
repository.fetch_changesets
81+
else
82+
logger.error("#{action} : repository does not exist anymore, object is nil, exit !")
83+
end
84+
end
85+
86+
7287
private
7388

7489

0 commit comments

Comments
 (0)