Chris@16: require_dependency 'repository' Chris@16: require_dependency 'checkout_helper' Chris@16: Chris@16: module Checkout Chris@16: module RepositoryPatch Chris@16: def self.included(base) # :nodoc: Chris@16: base.extend(ClassMethods) Chris@16: base.send(:include, InstanceMethods) Chris@16: Chris@16: base.class_eval do Chris@16: unloadable Chris@16: serialize :checkout_settings, Hash Chris@16: end Chris@16: end Chris@16: Chris@16: module ClassMethods Chris@16: def allow_subtree_checkout? Chris@16: # default implementation Chris@16: false Chris@16: end Chris@16: Chris@16: def checkout_default_command Chris@16: # default implementation Chris@16: "" Chris@16: end Chris@16: end Chris@16: Chris@16: module InstanceMethods Chris@16: def after_initialize Chris@16: self.checkout_settings ||= {} Chris@16: end Chris@16: Chris@16: def checkout_overwrite=(value) Chris@16: checkout_settings['checkout_overwrite'] = value Chris@16: end Chris@16: Chris@16: def checkout_overwrite Chris@16: (checkout_settings['checkout_overwrite'].to_i > 0) ? '1' : '0' Chris@16: end Chris@16: Chris@16: def checkout_overwrite? Chris@16: self.scm_name != 'Abstract' && checkout_overwrite.to_i > 0 Chris@16: end Chris@16: Chris@16: def checkout_description=(value) Chris@16: checkout_settings['checkout_description'] = value Chris@16: end Chris@16: Chris@16: def checkout_description Chris@16: if checkout_overwrite? Chris@16: checkout_settings['checkout_description'] Chris@16: else Chris@16: if CheckoutHelper.supported_scm.include?(scm_name) && Setting.send("checkout_overwrite_description_#{scm_name}?") Chris@16: Setting.send("checkout_description_#{scm_name}") Chris@16: else Chris@16: Setting.send("checkout_description_Abstract") Chris@16: end Chris@16: end Chris@16: end Chris@16: Chris@16: def checkout_protocols Chris@16: @checkout_protocols ||= begin Chris@16: if CheckoutHelper.supported_scm.include? scm_name Chris@16: if checkout_overwrite? Chris@16: protocols = checkout_settings['checkout_protocols'] || [] Chris@16: else Chris@16: protocols = Setting.send("checkout_protocols_#{scm_name}") || [] Chris@16: end Chris@16: else Chris@16: protocols = [] Chris@16: end Chris@16: Chris@16: protocols.collect do |p| Chris@16: Checkout::Protocol.new p.merge({:repository => self}) Chris@16: end Chris@16: end Chris@16: end Chris@16: Chris@16: def checkout_protocols=(value) Chris@16: # value is an Array or a Hash Chris@16: if value.is_a? Hash Chris@16: value = value.dup.delete_if {|id, protocol| id.to_i < 0 } Chris@16: value = value.sort{|(ak,av),(bk,bv)|ak<=>bk}.collect{|id,protocol| protocol} Chris@16: end Chris@16: Chris@16: checkout_settings['checkout_protocols'] = value Chris@16: end Chris@16: Chris@16: def checkout_display_login Chris@16: if checkout_overwrite? && self.scm_name == "Subversion" Chris@16: result = checkout_settings['checkout_display_login'] Chris@16: else Chris@16: result = Setting.checkout_display_login Chris@16: end Chris@16: (result.to_i > 0) ? '1' : '0' Chris@16: end Chris@16: Chris@16: def checkout_display_login? Chris@16: checkout_display_login.to_i > 0 Chris@16: end Chris@16: Chris@16: def checkout_display_login=(value) Chris@16: value = nil unless self.scm_name == "Subversion" Chris@16: checkout_settings['checkout_display_login'] = value Chris@16: end Chris@16: Chris@16: def checkout_display_command? Chris@16: checkout_display_command.to_i > 0 Chris@16: end Chris@16: Chris@16: def checkout_display_command=(value) Chris@16: checkout_settings['checkout_display_command'] = value Chris@16: end Chris@16: Chris@16: def checkout_display_command Chris@16: if checkout_overwrite? Chris@16: checkout_settings['checkout_display_command'] Chris@16: else Chris@16: Setting.send("checkout_display_command_#{scm_name}") Chris@16: end Chris@16: end Chris@16: Chris@16: def allow_subtree_checkout? Chris@16: self.class.allow_subtree_checkout? Chris@16: end Chris@16: Chris@16: def checkout_default_command Chris@16: self.class.checkout_default_command Chris@16: end Chris@16: end Chris@16: end Chris@16: end Chris@16: Chris@16: Repository.send(:include, Checkout::RepositoryPatch) Chris@16: Chris@16: subtree_checkout_repos = ["Subversion", "Cvs"] Chris@16: commands = { Chris@16: 'Bazaar' => 'bzr checkout', Chris@16: 'Cvs' => 'cvs checkout', Chris@16: 'Darcs' => 'darcs get', Chris@16: 'Git' => 'git clone', Chris@16: 'Mercurial' => 'hg clone', Chris@16: 'Subversion' => 'svn checkout' Chris@16: } Chris@16: Chris@16: CheckoutHelper.supported_scm.each do |scm| Chris@16: require_dependency "repository/#{scm.underscore}" Chris@16: cls = Repository.const_get(scm) Chris@16: Chris@16: allow_subtree_checkout = "" Chris@16: if subtree_checkout_repos.include? scm Chris@16: allow_subtree_checkout = <<-EOS Chris@16: def allow_subtree_checkout? Chris@16: true Chris@16: end Chris@16: EOS Chris@16: end Chris@16: Chris@16: checkout_command = "" Chris@16: if commands[scm] Chris@16: checkout_command = <<-EOS Chris@16: def checkout_default_command Chris@16: '#{commands[scm]}' Chris@16: end Chris@16: EOS Chris@16: end Chris@16: Chris@16: class_mod = Module.new Chris@16: class_mod.module_eval(<<-EOF Chris@16: def self.included(base) Chris@16: base.extend ChildClassMethods Chris@16: Chris@16: base.class_eval do Chris@16: unloadable Chris@16: serialize :checkout_settings, Hash Chris@16: end Chris@16: end Chris@16: Chris@16: module ChildClassMethods Chris@16: #{allow_subtree_checkout} Chris@16: #{checkout_command} Chris@16: end Chris@16: EOF Chris@16: ) Chris@16: cls.send(:include, class_mod) Chris@16: end