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