comparison vendor/plugins/redmine_checkout/lib/checkout/repository_patch.rb @ 16:020926a36823 yuya

* Add redmine-checkout plugin (as of svn rev 179 of the plugin)
author Chris Cannam
date Wed, 25 Aug 2010 16:39:01 +0100
parents
children
comparison
equal deleted inserted replaced
15:9c6c72729d91 16:020926a36823
1 require_dependency 'repository'
2 require_dependency 'checkout_helper'
3
4 module Checkout
5 module RepositoryPatch
6 def self.included(base) # :nodoc:
7 base.extend(ClassMethods)
8 base.send(:include, InstanceMethods)
9
10 base.class_eval do
11 unloadable
12 serialize :checkout_settings, Hash
13 end
14 end
15
16 module ClassMethods
17 def allow_subtree_checkout?
18 # default implementation
19 false
20 end
21
22 def checkout_default_command
23 # default implementation
24 ""
25 end
26 end
27
28 module InstanceMethods
29 def after_initialize
30 self.checkout_settings ||= {}
31 end
32
33 def checkout_overwrite=(value)
34 checkout_settings['checkout_overwrite'] = value
35 end
36
37 def checkout_overwrite
38 (checkout_settings['checkout_overwrite'].to_i > 0) ? '1' : '0'
39 end
40
41 def checkout_overwrite?
42 self.scm_name != 'Abstract' && checkout_overwrite.to_i > 0
43 end
44
45 def checkout_description=(value)
46 checkout_settings['checkout_description'] = value
47 end
48
49 def checkout_description
50 if checkout_overwrite?
51 checkout_settings['checkout_description']
52 else
53 if CheckoutHelper.supported_scm.include?(scm_name) && Setting.send("checkout_overwrite_description_#{scm_name}?")
54 Setting.send("checkout_description_#{scm_name}")
55 else
56 Setting.send("checkout_description_Abstract")
57 end
58 end
59 end
60
61 def checkout_protocols
62 @checkout_protocols ||= begin
63 if CheckoutHelper.supported_scm.include? scm_name
64 if checkout_overwrite?
65 protocols = checkout_settings['checkout_protocols'] || []
66 else
67 protocols = Setting.send("checkout_protocols_#{scm_name}") || []
68 end
69 else
70 protocols = []
71 end
72
73 protocols.collect do |p|
74 Checkout::Protocol.new p.merge({:repository => self})
75 end
76 end
77 end
78
79 def checkout_protocols=(value)
80 # value is an Array or a Hash
81 if value.is_a? Hash
82 value = value.dup.delete_if {|id, protocol| id.to_i < 0 }
83 value = value.sort{|(ak,av),(bk,bv)|ak<=>bk}.collect{|id,protocol| protocol}
84 end
85
86 checkout_settings['checkout_protocols'] = value
87 end
88
89 def checkout_display_login
90 if checkout_overwrite? && self.scm_name == "Subversion"
91 result = checkout_settings['checkout_display_login']
92 else
93 result = Setting.checkout_display_login
94 end
95 (result.to_i > 0) ? '1' : '0'
96 end
97
98 def checkout_display_login?
99 checkout_display_login.to_i > 0
100 end
101
102 def checkout_display_login=(value)
103 value = nil unless self.scm_name == "Subversion"
104 checkout_settings['checkout_display_login'] = value
105 end
106
107 def checkout_display_command?
108 checkout_display_command.to_i > 0
109 end
110
111 def checkout_display_command=(value)
112 checkout_settings['checkout_display_command'] = value
113 end
114
115 def checkout_display_command
116 if checkout_overwrite?
117 checkout_settings['checkout_display_command']
118 else
119 Setting.send("checkout_display_command_#{scm_name}")
120 end
121 end
122
123 def allow_subtree_checkout?
124 self.class.allow_subtree_checkout?
125 end
126
127 def checkout_default_command
128 self.class.checkout_default_command
129 end
130 end
131 end
132 end
133
134 Repository.send(:include, Checkout::RepositoryPatch)
135
136 subtree_checkout_repos = ["Subversion", "Cvs"]
137 commands = {
138 'Bazaar' => 'bzr checkout',
139 'Cvs' => 'cvs checkout',
140 'Darcs' => 'darcs get',
141 'Git' => 'git clone',
142 'Mercurial' => 'hg clone',
143 'Subversion' => 'svn checkout'
144 }
145
146 CheckoutHelper.supported_scm.each do |scm|
147 require_dependency "repository/#{scm.underscore}"
148 cls = Repository.const_get(scm)
149
150 allow_subtree_checkout = ""
151 if subtree_checkout_repos.include? scm
152 allow_subtree_checkout = <<-EOS
153 def allow_subtree_checkout?
154 true
155 end
156 EOS
157 end
158
159 checkout_command = ""
160 if commands[scm]
161 checkout_command = <<-EOS
162 def checkout_default_command
163 '#{commands[scm]}'
164 end
165 EOS
166 end
167
168 class_mod = Module.new
169 class_mod.module_eval(<<-EOF
170 def self.included(base)
171 base.extend ChildClassMethods
172
173 base.class_eval do
174 unloadable
175 serialize :checkout_settings, Hash
176 end
177 end
178
179 module ChildClassMethods
180 #{allow_subtree_checkout}
181 #{checkout_command}
182 end
183 EOF
184 )
185 cls.send(:include, class_mod)
186 end