Skip to content

Commit 7cfdeed

Browse files
author
root
committed
Fix #258
1 parent fbc0e98 commit 7cfdeed

File tree

13 files changed

+399
-339
lines changed

13 files changed

+399
-339
lines changed

Diff for: app/views/settings/_gitolite_config_hooks.html.erb

+2-4
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@
3131
</span>
3232
</p>
3333

34-
<% hooks_manager = RedmineGitolite::Hooks.new %>
35-
3634
<p>
3735
<label><%= l(:label_gitolite_hooks_url) %></label>
38-
<span class="label label-info"><%= hooks_manager.gitolite_hooks_url %></span>
36+
<span class="label label-info"><%= RedmineGitolite::HookManager.gitolite_hooks_url %></span>
3937
</p>
4038

4139
<p>
4240
<label><%= l(:label_gitolite_hooks_namespace) %></label>
43-
<span class="label label-info"><%= hooks_manager.gitolite_hooks_namespace %></span>
41+
<span class="label label-info"><%= RedmineGitolite::HookManager.gitolite_hooks_namespace %></span>
4442
</p>

Diff for: app/views/settings/_gitolite_config_storage.html.erb

+10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
gitolite_global_storage_dir = RedmineGitolite::ConfigRedmine.get_setting(:gitolite_global_storage_dir)
44
gitolite_redmine_storage_dir = RedmineGitolite::ConfigRedmine.get_setting(:gitolite_redmine_storage_dir)
55
gitolite_recycle_bin_dir = RedmineGitolite::ConfigRedmine.get_setting(:gitolite_recycle_bin_dir)
6+
gitolite_local_code_dir = RedmineGitolite::ConfigRedmine.get_setting(:gitolite_local_code_dir)
67
%>
78

89
<h3><%= l(:label_gitolite_storage_config) %></h3>
@@ -27,3 +28,12 @@
2728
<br />
2829
<em><%= l(:label_gitolite_redmine_storage_dir_desc) %></em>
2930
</p>
31+
32+
<% if RedmineGitolite::Config.gitolite_version == 3 %>
33+
<p>
34+
<label><%= l(:label_gitolite_local_code_dir) %></label>
35+
<%= text_field_tag("settings[gitolite_local_code_dir]", "./#{gitolite_local_code_dir}", :size => 60) %>
36+
<br />
37+
<em>(<%= l(:label_gitolite_local_code_dir_desc) %>, <%= link_to 'Gitolite non-core programs', 'http://gitolite.com/gitolite/non-core.html#localcode', :target => 'blank' %>)</em>
38+
</p>
39+
<% end %>

Diff for: app/views/settings/_gitolite_config_test.html.erb

+16-3
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,13 @@
6767
<td><%= image_tag (RedmineGitolite::Config.can_redmine_sudo_to_gitolite_user? ? 'true.png' : 'exclamation.png') %></td>
6868
</tr>
6969

70-
<% hooks_manager = RedmineGitolite::Hooks.new %>
70+
71+
<% gitolite_checks = RedmineGitolite::HookManager.check_install! %>
7172

7273
<tr>
7374
<td><%= l(:label_gitolite_hooks_params_installed) %></td>
7475
<td>
75-
<% params_installed = hooks_manager.hook_params_installed? %>
76+
<% params_installed = gitolite_checks[:hook_params] %>
7677
<% params_installed.each do |param, installed| %>
7778
<%= image_tag((installed ? 'true.png' : 'exclamation.png'), :style => "vertical-align: bottom;") %>
7879
<em><%= param %></em>
@@ -81,10 +82,22 @@
8182
</td>
8283
</tr>
8384

85+
<tr>
86+
<td><%= l(:label_gitolite_hook_dirs_installed) %></td>
87+
<td>
88+
<% hook_dirs_installed = gitolite_checks[:hook_dirs] %>
89+
<% hook_dirs_installed.each do |hook, installed| %>
90+
<%= image_tag((installed ? 'true.png' : 'exclamation.png'), :style => "vertical-align: bottom;") %>
91+
<em><%= hook %></em>
92+
<br />
93+
<% end %>
94+
</td>
95+
</tr>
96+
8497
<tr>
8598
<td><%= l(:label_gitolite_hooks_installed) %></td>
8699
<td>
87-
<% hooks_installed = hooks_manager.hooks_installed? %>
100+
<% hooks_installed = gitolite_checks[:hook_files] %>
88101
<% hooks_installed.each do |hook, installed| %>
89102
<%= image_tag((installed ? 'true.png' : 'exclamation.png'), :style => "vertical-align: bottom;") %>
90103
<em><%= hook %></em>

Diff for: config/locales/plugin_settings/en.yml

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ en:
2727
label_gitolite_recycle_bin_dir_desc: (Relative to Gitolite user home)
2828
label_gitolite_redmine_storage_dir: Subdirectory for Redmine-managed repositories
2929
label_gitolite_redmine_storage_dir_desc: (Relative to Gitolite repositories base path)
30+
label_gitolite_local_code_dir: Gitolite non-core hooks directory
31+
label_gitolite_local_code_dir_desc: Relative to Gitolite user home
3032

3133
# Gitolite Config File
3234
label_tab_config_file: Configuration file
@@ -163,6 +165,7 @@ en:
163165
label_path_directories: PATH directories
164166
label_gitolite_hooks_params_installed: Hooks parameters installed?
165167
label_gitolite_hooks_installed: Hooks installed?
168+
label_gitolite_hook_dirs_installed: Hook dirs installed?
166169
label_redmine_user: Redmine username
167170
label_sudo_version: Sudo version
168171
label_git_version: Git version

Diff for: config/locales/plugin_settings/fr.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ fr:
2626
label_gitolite_recycle_bin_dir: Chemin de la corbeille Gitolite
2727
label_gitolite_recycle_bin_dir_desc: (Relatif au répertoire personnel de l'utilisateur Gitolite)
2828
label_gitolite_redmine_storage_dir: Sous-répertoire pour les dépôts gérés par Redmine
29-
label_gitolite_redmine_storage_dir_desc: (Relatif au répertoire personnel de l'utilisateur Gitolite)
29+
label_gitolite_redmine_storage_dir_desc: (Relatif au chemin de base des dépôts Gitolite)
30+
label_gitolite_local_code_dir: Répertoire de stockage des hooks non-core
31+
label_gitolite_local_code_dir_desc: Relatif au répertoire personnel de l'utilisateur Gitolite
3032

3133
# Gitolite Config File
3234
label_tab_config_file: Fichier de configuration
@@ -163,6 +165,7 @@ fr:
163165
label_path_directories: Répertoires du PATH
164166
label_gitolite_hooks_params_installed: Paramètres des hooks installés?
165167
label_gitolite_hooks_installed: Hooks installés?
168+
label_gitolite_hook_dirs_installed: Répertoires des hooks installés?
166169
label_redmine_user: Nom d'utilisateur Redmine
167170
label_sudo_version: Version de Sudo
168171
label_git_version: Version de Git

Diff for: init.rb

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
:gitolite_global_storage_dir => 'repositories/',
2626
:gitolite_redmine_storage_dir => '',
2727
:gitolite_recycle_bin_dir => 'recycle_bin/',
28+
:gitolite_local_code_dir => 'local',
2829

2930
# Gitolite Config File
3031
:gitolite_config_file => 'gitolite.conf',

Diff for: lib/redmine_git_hosting.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ def apply_patch(&block)
4040
require_dependency 'redmine_gitolite/config'
4141
require_dependency 'redmine_gitolite/config_redmine'
4242
require_dependency 'redmine_gitolite/cache'
43-
require_dependency 'redmine_gitolite/hooks'
43+
require_dependency 'redmine_gitolite/hook_manager'
44+
require_dependency 'redmine_gitolite/hook_file'
45+
require_dependency 'redmine_gitolite/hook_dir'
46+
require_dependency 'redmine_gitolite/hook_param'
4447
require_dependency 'redmine_gitolite/recycle'
4548
require_dependency 'redmine_gitolite/log'
4649
require_dependency 'redmine_gitolite/shell'

Diff for: lib/redmine_git_hosting/patches/setting_patch.rb

+3-5
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def save_git_hosting_values
150150

151151

152152
# Normalize paths, should be relative and end in '/'
153-
[ :gitolite_global_storage_dir, :gitolite_recycle_bin_dir ].each do |setting|
153+
[ :gitolite_global_storage_dir, :gitolite_recycle_bin_dir, :gitolite_local_code_dir ].each do |setting|
154154
if valuehash[setting]
155155
normalizedFile = File.expand_path(valuehash[setting].lstrip.rstrip, "/")
156156
if (normalizedFile != "/")
@@ -359,8 +359,7 @@ def restore_git_hosting_values
359359

360360
## Gitolite user has changed, check if this new one has our hooks!
361361
if @@old_valuehash[:gitolite_user] != valuehash[:gitolite_user]
362-
hooks = RedmineGitolite::Hooks.new
363-
hooks.check_install
362+
RedmineGitolite::HookManager.check_install!
364363
end
365364

366365

@@ -397,8 +396,7 @@ def restore_git_hosting_values
397396
@@old_valuehash[:gitolite_force_hooks_update] != valuehash[:gitolite_force_hooks_update] ||
398397
@@old_valuehash[:gitolite_hooks_are_asynchronous] != valuehash[:gitolite_hooks_are_asynchronous]
399398
# Need to update our .gitconfig
400-
hooks = RedmineGitolite::Hooks.new
401-
hooks.hook_params_installed?
399+
RedmineGitolite::HookManager.update_hook_params!
402400
end
403401

404402

Diff for: lib/redmine_gitolite/hook_dir.rb

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
module RedmineGitolite
2+
3+
class HookDir
4+
5+
attr_reader :name
6+
attr_reader :destination_path
7+
8+
9+
def initialize(name, destination_path)
10+
@name = name
11+
@destination_path = destination_path
12+
end
13+
14+
15+
def installed?
16+
if !exists?
17+
logger.info { "Global hook directory '#{name}' not created yet, installing it..." }
18+
19+
if install_hooks_dir
20+
logger.info { "Global hook directory '#{name}' installed" }
21+
end
22+
end
23+
return exists?
24+
end
25+
26+
27+
private
28+
29+
30+
def logger
31+
RedmineGitolite::Log.get_logger(:global)
32+
end
33+
34+
35+
def exists?
36+
begin
37+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, "test -r '#{destination_path}' && echo 'yes' || echo 'no'").match(/yes/) ? true : false
38+
rescue RedmineGitolite::GitHosting::GitHostingException => e
39+
return false
40+
end
41+
end
42+
43+
44+
def install_hooks_dir
45+
logger.info { "Installing hook directory '#{destination_path}'" }
46+
47+
begin
48+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, "mkdir -p '#{destination_path}'")
49+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, "chmod 755 '#{destination_path}'")
50+
return true
51+
rescue => e
52+
logger.error { "Problems installing hook directory '#{destination_path}'" }
53+
return false
54+
end
55+
end
56+
57+
end
58+
end

Diff for: lib/redmine_gitolite/hook_file.rb

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
module RedmineGitolite
2+
3+
class HookFile
4+
5+
attr_reader :name
6+
attr_reader :source_path
7+
attr_reader :destination_path
8+
attr_reader :filemode
9+
10+
11+
def initialize(name, source_path, destination_path, executable)
12+
@name = name
13+
@source_path = source_path
14+
@destination_path = destination_path
15+
@filemode = executable ? 755 : 644
16+
@force_update = RedmineGitolite::ConfigRedmine.get_setting(:gitolite_force_hooks_update, true)
17+
end
18+
19+
20+
def installed?
21+
if !exists?
22+
logger.info { "Hook '#{name}' does not exist, installing it ..." }
23+
do_install_file
24+
elsif hook_are_different?
25+
logger.warn { "Hook '#{name}' is already present but it's not ours!" }
26+
27+
if @force_update
28+
logger.info { "Restoring '#{name}' hook since forceInstallHook == true" }
29+
do_install_file
30+
end
31+
end
32+
return exists?
33+
end
34+
35+
36+
private
37+
38+
39+
def do_install_file
40+
if install_hook_file
41+
logger.info { "Hook '#{name}' installed" }
42+
logger.info { "Running '#{gitolite_command}' on the Gitolite install ..." }
43+
update_gitolite
44+
end
45+
end
46+
47+
48+
def logger
49+
RedmineGitolite::Log.get_logger(:global)
50+
end
51+
52+
53+
def hook_are_different?
54+
local_md5 != distant_md5
55+
end
56+
57+
58+
def local_md5
59+
Digest::MD5.hexdigest(File.read(source_path))
60+
end
61+
62+
63+
def distant_md5
64+
content = RedmineGitolite::GitHosting.execute_command(:shell_cmd, "cat '#{destination_path}'") rescue ''
65+
Digest::MD5.hexdigest(content)
66+
end
67+
68+
69+
def gitolite_command
70+
RedmineGitolite::Config.gitolite_command
71+
end
72+
73+
74+
def exists?
75+
begin
76+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, "test -s '#{destination_path}' && echo 'yes' || echo 'no'").match(/yes/) ? true : false
77+
rescue RedmineGitolite::GitHosting::GitHostingException => e
78+
return false
79+
end
80+
end
81+
82+
83+
def install_hook_file
84+
logger.info { "Installing hook '#{source_path}' in '#{destination_path}'" }
85+
86+
begin
87+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, "'cat - > #{destination_path}'", :pipe_data => "'#{source_path}'", :pipe_command => 'cat')
88+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, "chmod #{filemode} '#{destination_path}'")
89+
return true
90+
rescue => e
91+
logger.error { "Problems installing hook from '#{source_path}' in '#{destination_path}'" }
92+
return false
93+
end
94+
end
95+
96+
97+
def update_gitolite
98+
begin
99+
RedmineGitolite::GitHosting.execute_command(:shell_cmd, gitolite_command)
100+
return true
101+
rescue RedmineGitolite::GitHosting::GitHostingException => e
102+
return false
103+
end
104+
end
105+
106+
end
107+
end

0 commit comments

Comments
 (0)