From: Akihiro Ono Date: Sun, 6 Feb 2011 17:00:34 +0000 (+0900) Subject: Add redminele plugin X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=640d9ca5cb1a3282b8615a9df998a45ff9662fe1;p=redminele%2Fredmine.git Add redminele plugin --- diff --git a/vendor/plugins/redmine_le/README.rdoc b/vendor/plugins/redmine_le/README.rdoc new file mode 100644 index 00000000..fdb3f975 --- /dev/null +++ b/vendor/plugins/redmine_le/README.rdoc @@ -0,0 +1,3 @@ += le + +Description goes here diff --git a/vendor/plugins/redmine_le/app/controllers/ldap_users_controller.rb b/vendor/plugins/redmine_le/app/controllers/ldap_users_controller.rb new file mode 100644 index 00000000..8063d9f3 --- /dev/null +++ b/vendor/plugins/redmine_le/app/controllers/ldap_users_controller.rb @@ -0,0 +1,97 @@ +class LdapUsersController < ApplicationController + unloadable + before_filter :require_admin, :setup_auth_source + + def index + @ldap_users = LdapUser.find(:all) + end + + def new + @ldap_user = LdapUser.new + render :action => "edit" + end + + def create + @user = User.new(:language => Setting.default_language) + @ldap_user = LdapUser.new + @user.login = @ldap_user.login = params[:ldap_user][:login] + + if assign_params_and_save + flash[:notice] = l(:notice_successful_create) + + if @user.save_without_validation + @user.auth_source = nil # dummy + Mailer.deliver_account_information(@user, @ldap_user.password) if params[:send_information] + else + flash[:error] = l(:error_failed_to_create_redmine_user) + end + + redirect_to :action => 'edit', :id => @ldap_user.login + else + render :action => 'edit' + end + end + + def edit + @ldap_user = LdapUser.find(params[:id]) + end + + def update + @user = User.find_by_login(params[:id]) || User.new(:login => params[:id]) + @ldap_user = LdapUser.find(params[:id]) + + if assign_params_and_save + flash[:notice] = l(:notice_successful_update) + if @ldap_user.admin? && !params[:ldap_user][:password].blank? + flash[:warning] = l(:warning_need_to_restart) + end + + if @user.save_without_validation + @user.auth_source = nil # dummy + Mailer.deliver_account_information(@user, @ldap_user.password) if params[:send_information] && !@ldap_user.password.blank? + else + flash[:error] = l(:error_failed_to_update_redmine_user) + end + + redirect_to :action => 'edit', :id => @ldap_user.login + else + render :action => 'edit' + end + end + + def destroy + #@ldap_user = LdapUser.find(params[:id]) + end + + private + def setup_auth_source + setting = RedmineLeSetting.instance + return render_403 if setting.use_external_ldap + return render_404 unless @auth_source = LdapUser.auth_source = setting.auth_source + end + + def assign_params_and_save + h = params[:ldap_user] + attrs = %w[firstname lastname mail] + attrs.each {|attr| + @user.send(attr+"=", @ldap_user.send(attr+"=", h[attr])) + } + @ldap_user.password = h[:password] + @ldap_user.password_confirmation = h[:password_confirmation] + + unless @user.valid? + @user.errors.each_error {|attr, error| + if attrs.include?(attr) && @user.send(attr+"_changed?") + @ldap_user.errors.add_to_base(error.full_message) + end + } + end + @user.auth_source ||= @auth_source + + RedmineLeSetting.transaction do + @ldap_user.errors.empty? && @ldap_user.save + end + + @ldap_user.errors.empty? + end +end diff --git a/vendor/plugins/redmine_le/app/controllers/redmine_le_settings_controller.rb b/vendor/plugins/redmine_le/app/controllers/redmine_le_settings_controller.rb new file mode 100644 index 00000000..3fbc9524 --- /dev/null +++ b/vendor/plugins/redmine_le/app/controllers/redmine_le_settings_controller.rb @@ -0,0 +1,20 @@ +class RedmineLeSettingsController < ApplicationController + unloadable + before_filter :require_admin + + def index + @setting = RedmineLeSetting.instance + end + + def update + @setting = RedmineLeSetting.instance + @setting.update_attributes(params[:redmine_le_setting]) + if @setting.save + flash[:notice] = l(:notice_successful_update) + flash[:warning] = l(:warning_need_to_restart) + redirect_to :action => 'index' + else + render :action => 'index' + end + end +end diff --git a/vendor/plugins/redmine_le/app/models/hook_config.rb b/vendor/plugins/redmine_le/app/models/hook_config.rb new file mode 100644 index 00000000..1f183d00 --- /dev/null +++ b/vendor/plugins/redmine_le/app/models/hook_config.rb @@ -0,0 +1,33 @@ +class HookConfig + def initialize(project) + @project = project + end + + def filename + @filename = @project.repository_path + "/hooks/hook_config.yml" + end + + def config + @config ||= (exists? ? YAML.load_file(filename) : { + "pre_commit" => nil, + "post_commit" => { + "fetch_changesets" => nil, + "perform_build" => {"jobs" => []} + } + }) + end + + def save + File.open(filename, "w") {|f| + f.print(config.to_yaml) + } + end + + def exists? + File.file?(filename) + end + + def [](key) + config[key] + end +end diff --git a/vendor/plugins/redmine_le/app/models/ldap_user.rb b/vendor/plugins/redmine_le/app/models/ldap_user.rb new file mode 100644 index 00000000..96f3c6e5 --- /dev/null +++ b/vendor/plugins/redmine_le/app/models/ldap_user.rb @@ -0,0 +1,103 @@ +require 'active_ldap' + +class LdapUser < ActiveLdap::Base + unloadable + ldap_mapping :prefix => "", :dn_attribute => "uid", + :classes => %w[person inetOrgPerson organizationalPerson top] + + validates_confirmation_of :password, :allow_nil => true + + attr_accessor :password, :password_confirmation + + def self.auth_source + @auth_source + end + + def self.auth_source=(source) + setup_connection( + :host => source.host, + :port => source.port, + :base => source.base_dn, + :bind_dn => source.account, + :password => source.account_password + ) + + @auth_source = source + end + + def admin? + login == RedmineLeSetting.admin_account + end + + def auth_source + self.class.auth_source + end + + def login + self[self.auth_source.attr_login] + end + + def login=(value) + self[auth_source.attr_login] = value + end + + def firstname + self[auth_source.attr_firstname] + end + + def firstname=(value) + self[auth_source.attr_firstname] = value + end + + def lastname + self[auth_source.attr_lastname] + end + + def lastname=(value) + self[:cn] ||= value + self[auth_source.attr_lastname] = value + end + + def mail + self[auth_source.attr_mail] + end + + def mail=(value) + self[auth_source.attr_mail] = value + end + + protected + def validate + if !password.blank? && password.size < l=Setting.password_min_length.to_i + add_error_message(:password, :too_short, :count => l) + end + + if mail.blank? + add_error_message(:mail, :blank) + elsif mail !~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/ + add_error_message(:mail, :invalid) + end + end + + def validate_on_create + add_error_message(:password, :blank) if password.blank? + add_error_message(:login, :taken) if User.find_by_login(login) + end + + def before_save + unless password.blank? + self[:userPassword] = password + if admin? + setting = RedmineLeSetting.instance + setting.admin_password = password + setting.save + end + end + end + + private + def add_error_message(attr, msg, options = {}) + @dummy_user ||= User.new + self.errors.add_to_base(ActiveRecord::Error.new(@dummy_user, attr, msg, options).full_message) + end +end diff --git a/vendor/plugins/redmine_le/app/models/redmine_le_setting.rb b/vendor/plugins/redmine_le/app/models/redmine_le_setting.rb new file mode 100644 index 00000000..639bd7c4 --- /dev/null +++ b/vendor/plugins/redmine_le/app/models/redmine_le_setting.rb @@ -0,0 +1,247 @@ +class RedmineLeSetting < ActiveRecord::Base + unloadable + + @@skip_callbacks = false + EMAIL_YAML = RAILS_ROOT + "/config/email.yml" + + belongs_to :auth_source + + validates_presence_of :auth_source_id, :admin_account, :admin_password + + def self.instance + @instance ||= (first || new) + end + + def self.[](name) + instance[name] + end + + def self.[]=(name, value) + instance[name] = value + end + + def self.method_missing(name, *args) + instance.send(name, *args) + end + + def self.transaction(&block) + @xml_changes = {} + @text_changes = {} + @file_changes = {} + @error_list = {} + super(&block) + rescue => err + @xml_changes.dup.each {|filename, xpath_values| + replace_xml(filename, *xpath_values) + } + @xml_changes = {} + @text_changes.dup.each {|filename, regexp_values| + replace_text(filename, *regexp_values) + } + @text_changes = {} + @file_changes.each {|filename, content| + File.open(filename, "w") {|f| f.write(content)} + } + @file_changes = {} + raise err + end + + def self.skip_callbacks(&block) + @@skip_callbacks = true + result = yield + @@skip_callbacks = false + result + end + + def search_ldap_user(username = nil) + username ||= admin_account + source = LdapUser.auth_source = RedmineLeSetting.auth_source + LdapUser.find(:filter => [source.attr_login, username]) + end + + def search_dn(username = nil) + user = search_ldap_user(username) + user && user.dn.to_s + end + + def base64_admin_password + admin_password && Base64.encode64(admin_password).chomp + end + + def smtp_settings + @email_config ||= File.file?(EMAIL_YAML) ? YAML.load_file(EMAIL_YAML) : {} + conf = @email_config[RAILS_ENV] ||= {} + conf["delivery_method"] ||= :smtp + conf["smtp_settings"] ||= {} + end + + def smtp_settings_changed? + !!@smtp_settings_changed + end + + def smtp_server + smtp_settings["address"] + end + + def smtp_server=(value) + set_smtp_setting("address", value) + end + + def smtp_port + smtp_settings["port"] ||= 25 + end + + def smtp_port=(value) + set_smtp_setting("port", value.to_i) + end + + def smtp_user + smtp_settings["user_name"] + end + + def smtp_user=(value) + set_smtp_setting("user_name", value) + end + + def smtp_password + smtp_settings["password"] + end + + def smtp_password=(value) + set_smtp_setting("password", value) + end + + def smtp_sender + Setting.mail_from + end + + def smtp_sender=(value) + @smtp_settings_changed = true if smtp_sender != value + @smtp_sender = value + end + + protected + def validate_on_update + return unless use_external_ldap + return unless admin_account_changed? || admin_password_changed? + user = search_ldap_user + valid = user && begin + user.bind(admin_password) + rescue ActiveLdap::AuthenticationError, ActiveLdap::LdapError::UnwillingToPerform + false + end + errors.add_to_base(l(:notice_account_invalid_creditentials)) unless valid + end + + def before_save + return if @@skip_callbacks + change_smtp_settings if smtp_settings_changed? + change_admin_account if admin_account_changed? || admin_password_changed? + end + + private + def change_smtp_settings + if @smtp_sender && @smtp_sender != smtp_sender + Setting.mail_from = @smtp_sender + end + + smtp_settings["domain"] ||= "localhost" + if smtp_user.blank? || smtp_password.blank? + %w[authentication user_name password].each {|key| + smtp_settings.delete(key) + } + else + smtp_settings["authentication"] = :login + end + + self.class.replace_xml( + RedmineLe::HOME + "/hudson/home/hudson.tasks.Mailer.xml", + ["//smtpHost", smtp_server], + ["//adminAddress", smtp_sender], + ["//smtpAuthUsername", smtp_user], + ["//smtpAuthPassword", smtp_password] + ) + self.class.write_file(EMAIL_YAML, YAML.dump(@email_config)) + @smtp_settings_changed = nil + end + + def change_admin_account + dn = use_external_ldap ? search_dn : auth_source.account + + Repository::Subversion.all(:conditions => [ + "url LIKE ? AND login = ?", 'http%://localhost%/svn/%', admin_account_was + ]).each {|repos| + repos.login = admin_account + repos.password = admin_password + repos.save! + } + + auth_source.account = dn + auth_source.account_password = admin_password + auth_source.save! + + base = "//credentials/entry/string[contains(., '//localhost:#{RedmineLe::HTTP_PORT}')]/.." + self.class.replace_xml( + RedmineLe::HOME + "/hudson/home/hudson.scm.SubversionSCM.xml", + [base + "//userName", admin_account], + [base + "//password", base64_admin_password] + ) + + self.class.replace_xml( + RedmineLe::HOME + "/hudson/home/config.xml", + ["//securityRealm/managerDN", dn], + ["//securityRealm/managerPassword", base64_admin_password] + ) + + self.class.replace_text( + RedmineLe::HOME + "/apache/conf/conf.d/subversion.conf", + [/AuthLDAPBindDN\s+(.*)$/, dn], + [/AuthLDAPBindPassword\s+(.*)$/, admin_password] + ) + end + + def self.replace_xml(filename, *xpath_values) + doc = REXML::Document.new(File.new(filename)) + + xpath_values.each {|xpath, value| + unless elem = doc.elements[xpath] + (@error_list[filename] ||= []) << xpath if @error_list + next + end + oldvalue = elem.text + elem.text = value + (@xml_changes[filename] ||= []) << [xpath, oldvalue] if @xml_changes + } + + File.open(filename, "w") {|f| doc.write(f)} + end + + def self.replace_text(filename, *regexp_values) + content = File.read(filename) + + regexp_values.each {|regexp, value| + begin + content[regexp, 1] = value + (@text_changes[filename] ||= []) << [regexp, $1] if @text_changes + rescue IndexError + (@error_list[filename] ||= []) << regexp.inspect if @error_list + end + } + + File.open(filename, "w") {|f| f.write(content)} + end + + def self.write_file(filename, content) + if @file_changes + @file_changes[filename] = File.file?(filename) ? File.read(filename) : "" + end + File.open(filename, "w") {|f| f.write(content)} + end + + def set_smtp_setting(key, value) + v = "@smtp_#{key}_was" + v = instance_variable_get(v) || instance_variable_set(v, smtp_settings[key]) + @smtp_settings_changed = true if v != value + smtp_settings[key] = value + end +end diff --git a/vendor/plugins/redmine_le/app/views/ldap_users/edit.html.erb b/vendor/plugins/redmine_le/app/views/ldap_users/edit.html.erb new file mode 100644 index 00000000..1b3aba4d --- /dev/null +++ b/vendor/plugins/redmine_le/app/views/ldap_users/edit.html.erb @@ -0,0 +1,21 @@ +

<%= link_to l(:label_ldap_user_plural), :action => 'index' %> » <%= @ldap_user.new_record? ? l(:label_user_new) : h(@ldap_user.login) %>

+ +<% + args = {:url => {:action => @ldap_user.new_record? ? "create" : "update"}} + args[:html] = {:method => :put} unless @ldap_user.new_record? +%> +<% labelled_tabular_form_for :ldap_user, @ldap_user, args do |f| %> +<%= f.error_messages %> +
+<% if @ldap_user.new_record? %> +

<%= f.text_field :login, :required => true, :size => 25 %>

+<% end %> +

<%= f.password_field :password, :required => true, :size => 25 %>

+

<%= f.password_field :password_confirmation, :required => true, :size => 25 %>

+

<%= f.text_field :firstname, :required => true %>

+

<%= f.text_field :lastname, :required => true %>

+

<%= f.text_field :mail, :required => true %>

+
+<%= f.submit l(@ldap_user.new_record? ? :button_create : :button_save) %> +<%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %> +<% end %> diff --git a/vendor/plugins/redmine_le/app/views/ldap_users/index.html.erb b/vendor/plugins/redmine_le/app/views/ldap_users/index.html.erb new file mode 100644 index 00000000..6396dfeb --- /dev/null +++ b/vendor/plugins/redmine_le/app/views/ldap_users/index.html.erb @@ -0,0 +1,28 @@ +<% html_title(l(:label_ldap_user_plural)) %> + +
+<%= link_to l(:label_user_new), {:action => 'new'}, :class => 'icon icon-add' %> +
+ +

<%= l(:label_ldap_user_plural) %>

+ + + + + + + + + + + + <% @ldap_users.each do |user| %> + "> + + + + + + <% end %> + +
<%= l(:field_login) %><%= l(:field_firstname) %><%= l(:field_lastname) %><%= l(:field_mail) %>
<%= link_to(h(user.login), :action => 'edit', :id => user.login) %><%= h(user.firstname) %><%= h(user.lastname) %><%= h(user.mail) %>
diff --git a/vendor/plugins/redmine_le/app/views/redmine_le_settings/index.html.erb b/vendor/plugins/redmine_le/app/views/redmine_le_settings/index.html.erb new file mode 100644 index 00000000..98ced319 --- /dev/null +++ b/vendor/plugins/redmine_le/app/views/redmine_le_settings/index.html.erb @@ -0,0 +1,30 @@ +

RedmineLE

+ +<% unless RedmineLeSetting.use_external_ldap %> +

<%= link_to l(:label_ldap_user_administration), :controller => "ldap_users", :action => "index" %>

+<% end %> + +<% labelled_tabular_form_for :redmine_le_setting, @setting, :url => {:action => 'update'}, :html => {:method => :put} do |f| %> + <%= f.error_messages %> + +<% if RedmineLeSetting.use_external_ldap %> +

<%= l(:label_change_admin_account) %>

+
+

<%= f.text_field :admin_account, :required => true, :size => 25 %>

+

<%= f.password_field :admin_password, :required => true, :size => 25 %>

+
+<% end %> + +

<%= l(:label_smtp_setting) %>

+
+

<%= f.text_field :smtp_server, :size => 25 %>

+

<%= f.text_field :smtp_port, :size => 25, :label => l(:field_port) %>

+

<%= f.text_field :smtp_sender, :size => 25, :label => l(:setting_mail_from) %>

+

<%= f.text_field :smtp_user, :size => 25 %>

+

<%= f.password_field :smtp_password, :size => 25, :label => l(:field_password) %>

+
+ + <%= f.submit l(:button_save) %> +<% end %> + +<% html_title "RedmineLE" %> diff --git a/vendor/plugins/redmine_le/assets/images/redmine_le.png b/vendor/plugins/redmine_le/assets/images/redmine_le.png new file mode 100644 index 00000000..73f9d296 Binary files /dev/null and b/vendor/plugins/redmine_le/assets/images/redmine_le.png differ diff --git a/vendor/plugins/redmine_le/assets/stylesheets/redmine_le.css b/vendor/plugins/redmine_le/assets/stylesheets/redmine_le.css new file mode 100644 index 00000000..e6c22599 --- /dev/null +++ b/vendor/plugins/redmine_le/assets/stylesheets/redmine_le.css @@ -0,0 +1,3 @@ +.redmine-le { + background-image: url(../images/redmine_le.png); +} diff --git a/vendor/plugins/redmine_le/config/locales/en.yml b/vendor/plugins/redmine_le/config/locales/en.yml new file mode 100644 index 00000000..66b8e91d --- /dev/null +++ b/vendor/plugins/redmine_le/config/locales/en.yml @@ -0,0 +1,15 @@ +en: + label_ldap_user: "LDAP User" + label_ldap_user_plural: "LDAP Users" + label_ldap_user_administration: "LDAP User Administration" + label_change_admin_account: "Change administrator account" + label_smtp_setting: "SMTP setting" + + warning_need_to_restart: "Please restart services to enable configuration changes." + error_failed_to_create_redmine_user: "Failed to create Redmine user" + error_failed_to_update_redmine_user: "Failed to update Redmine user" + + field_admin_account: "Administrator account" + field_admin_password: "Administrator password" + field_smtp_server: "SMTP Server" + field_smtp_user: "Username" diff --git a/vendor/plugins/redmine_le/config/locales/ja.yml b/vendor/plugins/redmine_le/config/locales/ja.yml new file mode 100644 index 00000000..79b0c6c5 --- /dev/null +++ b/vendor/plugins/redmine_le/config/locales/ja.yml @@ -0,0 +1,15 @@ +ja: + label_ldap_user: "LDAPユーザ" + label_ldap_user_plural: "LDAPユーザ" + label_ldap_user_administration: "LDAPユーザ管理" + label_change_admin_account: "管理者アカウントの変更" + label_smtp_setting: "SMTP設定" + + warning_need_to_restart: "変更を反映するためサービスを再起動してください" + error_failed_to_create_redmine_user: "Redmineユーザの作成に失敗しました" + error_failed_to_update_redmine_user: "Redmineユーザの更新に失敗しました" + + field_admin_account: "管理者アカウント" + field_admin_password: "管理者パスワード" + field_smtp_server: "SMTPサーバ" + field_smtp_user: "ユーザ名" diff --git a/vendor/plugins/redmine_le/config/routes.rb b/vendor/plugins/redmine_le/config/routes.rb new file mode 100644 index 00000000..f86447b0 --- /dev/null +++ b/vendor/plugins/redmine_le/config/routes.rb @@ -0,0 +1,6 @@ +ActionController::Routing::Routes.draw do |map| + map.resources :ldap_users + + # override the route + map.connect 'settings/plugin/redmine_le', :controller => 'redmine_le_settings', :action => 'index' +end diff --git a/vendor/plugins/redmine_le/db/migrate/0001_create_redmine_le_settings.rb b/vendor/plugins/redmine_le/db/migrate/0001_create_redmine_le_settings.rb new file mode 100644 index 00000000..dc89b69b --- /dev/null +++ b/vendor/plugins/redmine_le/db/migrate/0001_create_redmine_le_settings.rb @@ -0,0 +1,14 @@ +class CreateRedmineLeSettings < ActiveRecord::Migration + def self.up + create_table :redmine_le_settings do |t| + t.boolean :use_external_ldap, :null => false + t.integer :auth_source_id + t.string :admin_account + t.string :admin_password + end + end + + def self.down + drop_table :redmine_le_settings + end +end diff --git a/vendor/plugins/redmine_le/init.rb b/vendor/plugins/redmine_le/init.rb new file mode 100644 index 00000000..7ecd2a80 --- /dev/null +++ b/vendor/plugins/redmine_le/init.rb @@ -0,0 +1,21 @@ +require 'redmine' +require 'redmine_le' + +require 'dispatcher' +Dispatcher.to_prepare do + RedmineLe.apply_patch +end + +Redmine::Plugin.register :redmine_le do + name 'RedmineLE plugin' + author 'Akihiro Ono' + description 'Extensions for RedmineLE' + version '0.0.1' + + menu :admin_menu, :redmine_le, { + :controller => 'redmine_le_settings', :action => 'index' + }, :caption => 'RedmineLE' + + # HACK: for showing configure link + settings(:partial => true) +end diff --git a/vendor/plugins/redmine_le/lib/redmine_le.rb b/vendor/plugins/redmine_le/lib/redmine_le.rb new file mode 100644 index 00000000..1bca4c9c --- /dev/null +++ b/vendor/plugins/redmine_le/lib/redmine_le.rb @@ -0,0 +1,12 @@ +require 'redmine_le/hooks' +require 'redmine_le/project_patch' + +module RedmineLe + HOME = File.dirname(RAILS_ROOT) + HTTP_PORT = YAML.load_file(HOME + "/config/service.yml")["apache"]["port"] + TEMPLATE_DIR = File.dirname(File.dirname(__FILE__)) + "/template" + + def self.apply_patch + Project.send(:include, ProjectPatch) + end +end diff --git a/vendor/plugins/redmine_le/lib/redmine_le/hooks.rb b/vendor/plugins/redmine_le/lib/redmine_le/hooks.rb new file mode 100644 index 00000000..90576ff3 --- /dev/null +++ b/vendor/plugins/redmine_le/lib/redmine_le/hooks.rb @@ -0,0 +1,11 @@ +module RedmineLe + class Hooks < Redmine::Hook::ViewListener + def view_layouts_base_html_head(context) + # Engines doesn't support relative_url_root + #stylesheet_link_tag 'redmine_le', :plugin => 'redmine_le' + stylesheet_link_tag(context[:controller].relative_url_root.to_s + + '/plugin_assets/redmine_le/stylesheets/redmine_le.css' + ) + end + end +end diff --git a/vendor/plugins/redmine_le/lib/redmine_le/project_patch.rb b/vendor/plugins/redmine_le/lib/redmine_le/project_patch.rb new file mode 100644 index 00000000..5f73a954 --- /dev/null +++ b/vendor/plugins/redmine_le/lib/redmine_le/project_patch.rb @@ -0,0 +1,102 @@ +require_dependency 'project' + +module RedmineLe + module ProjectPatch + def self.included(base) + base.extend(ClassMethods) + base.send(:include, InstanceMethods) + + base.class_eval do + unloadable + after_create :setup_integration + after_destroy :cleanup_integration + end + end + + module ClassMethods + end + + module InstanceMethods + def repository_available? + module_enabled?(:repository) && + (repository.nil? || repository.url == repository_url) + end + + def repository_path + @repository_path ||= + File.join(RedmineLe::HOME, "subversion/repos", identifier) + end + + def repository_url + @repository_url ||= + "http://localhost:#{RedmineLe::HTTP_PORT}/svn/#{identifier}" + end + + def hook_config + @hook_config ||= HookConfig.new(self) + end + + def setup_repository + begin + raise unless repository_available? + unless File.directory?(repository_path) + system(%Q[svnadmin create "#{repository_path}"]) + root = "file:///" + repository_path.sub(/^\//, "") + system(%Q[svn mkdir "#{root}/trunk" "#{root}/branches" "#{root}/tags" -m "Initial repository layout"]) + end + rescue + raise "Cannot create repository" + end + + self.repository = Repository::Subversion.new( + :url => repository_url, + :root_url => repository_url, + :login => RedmineLeSetting.admin_account, + :password => RedmineLeSetting.admin_password + ) + + %w[pre-commit.bat post-commit.bat].each {|filename| + File.open(repository_path + "/hooks/#{filename}", "w") {|f| + f.print(ERB.new(File.read(RedmineLe::TEMPLATE_DIR + + "/#{filename}.erb")).result(binding)) + } + } + end + + def setup_job + ldap = AuthSourceLdap.first + url = repository_url + auth_token = RedmineLe::Utils.random_string(20) + data = ERB.new(File.read(RedmineLe::TEMPLATE_DIR + "/hudson_job_config.xml.erb")).result(binding) + + Net::HTTP.start("localhost", RedmineLe::HTTP_PORT) {|http| + response = http.post("/hudson/createItem?name=#{identifier}", data, { + "Content-Type" => "application/xml" + }) + raise "Cannot create Hudson job" unless response.code == "200" + } + + hook_config["post_commit"]["perform_build"]["jobs"].push({ + "name" => identifier, + "path" => "trunk" + }) + hook_config.save + end + + private + def setup_integration + return unless module_enabled?(:repository) + + setup_repository + setup_job + end + + def cleanup_integration + FileUtils.rm_rf(repository_path) + Net::HTTP.start("localhost", RedmineLe::HTTP_PORT) {|http| + http.post("/hudson/job/#{identifier}/doDelete", nil) + } + end + end + end +end diff --git a/vendor/plugins/redmine_le/lib/redmine_le/utils.rb b/vendor/plugins/redmine_le/lib/redmine_le/utils.rb new file mode 100644 index 00000000..7da0d631 --- /dev/null +++ b/vendor/plugins/redmine_le/lib/redmine_le/utils.rb @@ -0,0 +1,9 @@ +module RedmineLe + module Utils + CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + + def self.random_string(length) + length.times.map{CHARSET[rand(CHARSET.length), 1]}.join + end + end +end diff --git a/vendor/plugins/redmine_le/template/hudson_job_config.xml.erb b/vendor/plugins/redmine_le/template/hudson_job_config.xml.erb new file mode 100644 index 00000000..a0e327ee --- /dev/null +++ b/vendor/plugins/redmine_le/template/hudson_job_config.xml.erb @@ -0,0 +1,27 @@ + + + + + false + + + + + <%= url %>/trunk + + + true + + + + + true + false + false + <%= auth_token %> + + false + + + + diff --git a/vendor/plugins/redmine_le/template/post-commit.bat.erb b/vendor/plugins/redmine_le/template/post-commit.bat.erb new file mode 100644 index 00000000..a1b2d6d9 --- /dev/null +++ b/vendor/plugins/redmine_le/template/post-commit.bat.erb @@ -0,0 +1,4 @@ +setlocal +call "<%= RedmineLe::HOME %>/script/setenv.bat" +set RUBYLIB=<%= RedmineLe::HOME %>/script/hooks +ruby -e "require 'subversion_hook/post_commit'; SubversionHook::PostCommit.new('%1', '%2')" diff --git a/vendor/plugins/redmine_le/template/pre-commit.bat.erb b/vendor/plugins/redmine_le/template/pre-commit.bat.erb new file mode 100644 index 00000000..5ee6f864 --- /dev/null +++ b/vendor/plugins/redmine_le/template/pre-commit.bat.erb @@ -0,0 +1,4 @@ +setlocal +call "<%= RedmineLe::HOME %>/script/setenv.bat" +set RUBYLIB=<%= RedmineLe::HOME %>/script/hooks +ruby -e "require 'subversion_hook/pre_commit'; SubversionHook::PreCommit.new('%1', '%2')" diff --git a/vendor/plugins/redmine_le/test/test_helper.rb b/vendor/plugins/redmine_le/test/test_helper.rb new file mode 100644 index 00000000..7cc962ff --- /dev/null +++ b/vendor/plugins/redmine_le/test/test_helper.rb @@ -0,0 +1,5 @@ +# Load the normal Rails helper +require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper') + +# Ensure that we are using the temporary fixture path +Engines::Testing.set_fixture_path