Skip to content

Commit 332ce2b

Browse files
author
root
committed
Add feature : Git urls can be sortable
1 parent 774b443 commit 332ce2b

File tree

16 files changed

+165
-29
lines changed

16 files changed

+165
-29
lines changed

Diff for: app/controllers/repository_git_extras_controller.rb

+12
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,16 @@ def update
1717
end
1818
end
1919

20+
21+
def sort_urls
22+
@git_extra = @repository.extra
23+
if request.post?
24+
if @git_extra.update_attributes(urls_order: params[:repository_git_extra])
25+
flash.now[:notice] = l(:notice_gitolite_extra_updated)
26+
else
27+
flash.now[:error] = l(:notice_gitolite_extra_update_failed)
28+
end
29+
end
30+
end
31+
2032
end

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

+5
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,10 @@ def public_repo?
7878
extra[:public_repo]
7979
end
8080

81+
82+
def urls_order
83+
extra[:urls_order]
84+
end
85+
8186
end
8287
end

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

+11
Original file line numberDiff line numberDiff line change
@@ -107,5 +107,16 @@ def available_urls
107107
hash
108108
end
109109

110+
111+
def available_urls_sorted
112+
return available_urls if (urls_order.nil? || urls_order.empty?)
113+
hash = {}
114+
urls_order.each do |url|
115+
next if !available_urls[url.to_sym]
116+
hash[url.to_sym] = available_urls[url.to_sym]
117+
end
118+
hash
119+
end
120+
110121
end
111122
end

Diff for: app/models/repository_git_extra.rb

+73-5
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ class RepositoryGitExtra < ActiveRecord::Base
99
]
1010

1111
DISABLED = 0
12-
HTTP = 1
13-
HTTPS = 2
14-
BOTH = 3
12+
HTTP = 3
13+
HTTPS = 1
14+
BOTH = 2
15+
16+
ALLOWED_URLS = %w[ssh http https go git git_annex]
1517

1618
## Attributes
17-
attr_accessible :git_http, :git_daemon, :git_notify, :git_annex, :default_branch, :protected_branch, :public_repo, :key
19+
attr_accessible :git_http, :git_daemon, :git_notify, :git_annex, :default_branch, :protected_branch, :public_repo, :key, :urls_order
1820

1921
## Relations
2022
belongs_to :repository
@@ -25,8 +27,14 @@ class RepositoryGitExtra < ActiveRecord::Base
2527
validates :default_branch, presence: true
2628
validates :key, presence: true
2729

30+
validate :validate_urls_order
31+
32+
## Serializations
33+
serialize :urls_order, Array
34+
2835
## Callbacks
29-
after_save :check_if_default_branch_changed
36+
before_save :check_urls_order_consistency
37+
after_save :check_if_default_branch_changed
3038

3139
## Virtual attribute
3240
attr_accessor :default_branch_has_changed
@@ -41,6 +49,13 @@ def default_branch_has_changed?
4149
private
4250

4351

52+
def validate_urls_order
53+
urls_order.each do |url|
54+
errors.add(:urls_order, :invalid) unless ALLOWED_URLS.include?(url)
55+
end
56+
end
57+
58+
4459
# This is Rails method : <attribute>_changed?
4560
# However, the value is cleared before passing the object to the controller.
4661
# We need to save it in virtual attribute to trigger Gitolite resync if changed.
@@ -53,4 +68,57 @@ def check_if_default_branch_changed
5368
end
5469
end
5570

71+
72+
def check_urls_order_consistency
73+
check_ssh_url
74+
check_git_http_urls
75+
check_go_url
76+
check_git_url
77+
end
78+
79+
80+
# SSH url should always be present in urls_order Array
81+
#
82+
def check_ssh_url
83+
add_url('ssh')
84+
end
85+
86+
87+
def check_git_http_urls
88+
case git_http
89+
when DISABLED
90+
remove_url('http')
91+
remove_url('https')
92+
when HTTP
93+
add_url('http')
94+
remove_url('https')
95+
when HTTPS
96+
add_url('https')
97+
remove_url('http')
98+
when BOTH
99+
add_url('http')
100+
add_url('https')
101+
end
102+
end
103+
104+
105+
def check_go_url
106+
repository.go_access_available? ? add_url('go') : remove_url('go')
107+
end
108+
109+
110+
def check_git_url
111+
git_daemon? ? add_url('git') : remove_url('git')
112+
end
113+
114+
115+
def remove_url(url)
116+
self.urls_order.delete(url)
117+
end
118+
119+
120+
def add_url(url)
121+
self.urls_order.push(url).uniq!
122+
end
123+
56124
end

Diff for: app/presenters/repository_presenter.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def render_git_urls
3333

3434
def render_url_list
3535
s = ''
36-
repository.available_urls.each do |key, value|
36+
repository.available_urls_sorted.each do |key, value|
3737
s << content_tag(:li, link_to(key.upcase, 'javascript:void(0)').html_safe, options_for_git_url(key, value))
3838
end
3939
s.html_safe

Diff for: app/use_cases/update_project.rb

+3-4
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ def update_project
2929
def disable_git_daemon_if_not_public
3030
# Go through all gitolite repos and disable Git daemon if necessary
3131
project.gitolite_repos.each do |repository|
32-
if repository.extra[:git_daemon] && !project.is_public
33-
repository.extra[:git_daemon] = false
34-
repository.extra.save
35-
end
32+
repository.extra[:git_daemon] = false if repository.git_daemon_enabled? && !project.is_public
33+
# Save GitExtra in all cases to trigger urls order consistency checks
34+
repository.extra.save
3635
end
3736
end
3837

Diff for: app/views/common/_git_urls.html.haml

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
= stylesheet_link_tag 'git_urls', plugin: 'redmine_git_hosting'
77
= javascript_include_tag 'application', plugin: 'redmine_git_hosting'
88

9+
:javascript
10+
$(document).ready(function() { setFirstGitUrl('.git_url_list'); setGitUrls('.git_url'); });
11+
912
- repositories = Array.wrap(repository) unless repositories
10-
- if repositories.map(&:available_urls).reject { |h| h.empty? }.any?
13+
- if repositories.map(&:available_urls_sorted).reject { |h| h.empty? }.any?
1114
- repositories.sort_by { |r| r.is_default ? 0 : 1 }.each do |repository|
12-
- next if repository.available_urls.empty?
15+
- next if repository.available_urls_sorted.empty?
1316
- present repository do |p|
1417
.repository-urls
1518
= p.link_to_repository if repositories.count > 1
1619
= p.git_urls_box
1720

1821
- else
1922
#git_url_box= l(:label_repository_access_not_configured)
20-
21-
:javascript
22-
$(document).ready(function() { setFirstGitUrl('.git_url_list'); setGitUrls('.git_url'); });

Diff for: app/views/repositories/_edit_top.html.haml

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@
22
= render 'common/git_hosting_js_headers'
33

44
%div{ class: 'git_hosting box' }
5-
%h3= l(:label_repository_access_url)
5+
%h3
6+
= l(:label_repository_access_url)
7+
= link_to l(:label_sort_urls), sort_urls_repository_git_extras_path(@repository), class: 'modal-box-close-only'
8+
69
= render partial: 'common/git_urls', locals: { repository: @repository }

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

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#sortable-url-messages
2+
3+
%ul{ id: 'sortable-url', data: { 'update-url' => sort_urls_repository_git_extras_path(@repository), remote: true } }
4+
- @repository.available_urls_sorted.keys.each do |url|
5+
%li{ id: "repository_git_extra_#{url}" }= url
6+
7+
:javascript
8+
$(document).ready(function() { setSortableElement('#sortable-url', '#sortable-url'); });

Diff for: app/views/repository_git_extras/sort_urls.js.erb

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
$('#sortable-url-messages').html("<%= escape_javascript render_flash_messages %>");

Diff for: config/locales/models/repository_xitolite/en.yml

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ en:
3939
label_repository_exists_in_gitolite: Repository exists in Gitolite
4040
label_git_objects_count: Git objects count
4141
label_empty_repository: Empty repository?
42+
label_sort_urls: (Sort urls)
4243

4344
notice_gitolite_extra_updated: Options successfully updated
4445
notice_gitolite_extra_update_failed: Errors while updating options

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

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ fr:
3939
label_repository_exists_in_gitolite: Le dépôt existe dans Gitolite
4040
label_git_objects_count: Nombre d'objets dans Git
4141
label_empty_repository: Dépot vide?
42+
label_sort_urls: (Trier les urls)
4243

4344
notice_gitolite_extra_updated: Options mises à jour avec succès
4445
notice_gitolite_extra_update_failed: Erreurs lors de la mise à jour des options

Diff for: config/routes.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
get 'download_revision', to: 'download_git_revision#index', as: 'download_git_revision'
1111
end
1212

13-
resource :git_extras, controller: 'repository_git_extras', only: [:update]
13+
resource :git_extras, controller: 'repository_git_extras', only: [:update] do
14+
match 'sort_urls', via: [:get, :post]
15+
end
16+
1417
resource :git_notifications, controller: 'repository_git_notifications'
1518

1619
resources :post_receive_urls, controller: 'repository_post_receive_urls'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class AddUrlsOrderToRepositoryGitExtra < ActiveRecord::Migration
2+
3+
def self.up
4+
add_column :repository_git_extras, :urls_order, :text
5+
end
6+
7+
def self.down
8+
remove_column :repository_git_extras, :urls_order
9+
end
10+
11+
end

Diff for: lib/tasks/migration_tools.rake

+20-12
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,26 @@ namespace :redmine_git_hosting do
117117
puts ""
118118

119119
Repository::Xitolite.all.each do |repository|
120-
next if !repository.extra.nil?
121-
puts " - Repository '#{repository.redmine_name}' has no entry in RepositoryGitExtras table, create it :"
122-
default_extra_options = {
123-
git_http: RedmineGitHosting::Config.gitolite_http_by_default?,
124-
git_daemon: RedmineGitHosting::Config.gitolite_daemon_by_default?,
125-
git_notify: RedmineGitHosting::Config.gitolite_notify_by_default?,
126-
git_annex: false,
127-
default_branch: 'master',
128-
key: RedmineGitHosting::Utils.generate_secret(64)
129-
}
130-
extra = repository.build_extra(default_extra_options)
131-
extra.save!
120+
if repository.project.nil?
121+
puts " - ERROR : Repository with id '##{repository.id}' has no associated project ! You should take a look at it !"
122+
puts ""
123+
next
124+
elsif !repository.extra.nil?
125+
puts " - Repository '#{repository.redmine_name}' has an entry in RepositoryGitExtras table, update it :"
126+
repository.extra.save!
127+
else
128+
puts " - Repository '#{repository.redmine_name}' has no entry in RepositoryGitExtras table, create it :"
129+
default_extra_options = {
130+
git_http: RedmineGitHosting::Config.gitolite_http_by_default?,
131+
git_daemon: RedmineGitHosting::Config.gitolite_daemon_by_default?,
132+
git_notify: RedmineGitHosting::Config.gitolite_notify_by_default?,
133+
git_annex: false,
134+
default_branch: 'master',
135+
key: RedmineGitHosting::Utils.generate_secret(64)
136+
}
137+
extra = repository.build_extra(default_extra_options)
138+
extra.save!
139+
end
132140
puts " Done!"
133141
puts ""
134142
end

Diff for: spec/models/repository_git_extra_spec.rb

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
it { should allow_mass_assignment_of(:protected_branch) }
1919
it { should allow_mass_assignment_of(:public_repo) }
2020
it { should allow_mass_assignment_of(:key) }
21+
it { should allow_mass_assignment_of(:urls_order) }
2122

2223
## Relations
2324
it { should belong_to(:repository) }
@@ -36,6 +37,10 @@
3637

3738
it { should validate_inclusion_of(:git_http).in_array(%w(0 1 2 3)) }
3839

40+
## Serializations
41+
it { should serialize(:urls_order) }
42+
43+
3944
it "should have default values for git_http" do
4045
expect(@git_extra.git_http).to eq 0
4146
end

0 commit comments

Comments
 (0)