##// END OF EJS Templates
scm: fix log converting error in Ruby 1.9 and add more tests....
Toshi MARUYAMA -
r5250:1104c3900c7d
parent child
Show More
@@ -1,282 +1,283
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require 'iconv'
19 19
20 20 class Changeset < ActiveRecord::Base
21 21 belongs_to :repository
22 22 belongs_to :user
23 23 has_many :changes, :dependent => :delete_all
24 24 has_and_belongs_to_many :issues
25 25
26 26 acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.format_identifier}" + (o.short_comments.blank? ? '' : (': ' + o.short_comments))},
27 27 :description => :long_comments,
28 28 :datetime => :committed_on,
29 29 :url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project, :rev => o.identifier}}
30 30
31 31 acts_as_searchable :columns => 'comments',
32 32 :include => {:repository => :project},
33 33 :project_key => "#{Repository.table_name}.project_id",
34 34 :date_column => 'committed_on'
35 35
36 36 acts_as_activity_provider :timestamp => "#{table_name}.committed_on",
37 37 :author_key => :user_id,
38 38 :find_options => {:include => [:user, {:repository => :project}]}
39 39
40 40 validates_presence_of :repository_id, :revision, :committed_on, :commit_date
41 41 validates_uniqueness_of :revision, :scope => :repository_id
42 42 validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true
43 43
44 44 named_scope :visible, lambda {|*args| { :include => {:repository => :project},
45 45 :conditions => Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args) } }
46 46
47 47 def revision=(r)
48 48 write_attribute :revision, (r.nil? ? nil : r.to_s)
49 49 end
50 50
51 51 # Returns the identifier of this changeset; depending on repository backends
52 52 def identifier
53 53 if repository.class.respond_to? :changeset_identifier
54 54 repository.class.changeset_identifier self
55 55 else
56 56 revision.to_s
57 57 end
58 58 end
59 59
60 60 def committed_on=(date)
61 61 self.commit_date = date
62 62 super
63 63 end
64 64
65 65 # Returns the readable identifier
66 66 def format_identifier
67 67 if repository.class.respond_to? :format_changeset_identifier
68 68 repository.class.format_changeset_identifier self
69 69 else
70 70 identifier
71 71 end
72 72 end
73 73
74 74 def project
75 75 repository.project
76 76 end
77 77
78 78 def author
79 79 user || committer.to_s.split('<').first
80 80 end
81 81
82 82 def before_create
83 83 self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding)
84 84 self.comments = self.class.normalize_comments(self.comments, repository.repo_log_encoding)
85 85 self.user = repository.find_committer_user(self.committer)
86 86 end
87 87
88 88 def after_create
89 89 scan_comment_for_issue_ids
90 90 end
91 91
92 92 TIMELOG_RE = /
93 93 (
94 94 ((\d+)(h|hours?))((\d+)(m|min)?)?
95 95 |
96 96 ((\d+)(h|hours?|m|min))
97 97 |
98 98 (\d+):(\d+)
99 99 |
100 100 (\d+([\.,]\d+)?)h?
101 101 )
102 102 /x
103 103
104 104 def scan_comment_for_issue_ids
105 105 return if comments.blank?
106 106 # keywords used to reference issues
107 107 ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip)
108 108 ref_keywords_any = ref_keywords.delete('*')
109 109 # keywords used to fix issues
110 110 fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip)
111 111
112 112 kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|")
113 113
114 114 referenced_issues = []
115 115
116 116 comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match|
117 117 action, refs = match[2], match[3]
118 118 next unless action.present? || ref_keywords_any
119 119
120 120 refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m|
121 121 issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2]
122 122 if issue
123 123 referenced_issues << issue
124 124 fix_issue(issue) if fix_keywords.include?(action.to_s.downcase)
125 125 log_time(issue, hours) if hours && Setting.commit_logtime_enabled?
126 126 end
127 127 end
128 128 end
129 129
130 130 referenced_issues.uniq!
131 131 self.issues = referenced_issues unless referenced_issues.empty?
132 132 end
133 133
134 134 def short_comments
135 135 @short_comments || split_comments.first
136 136 end
137 137
138 138 def long_comments
139 139 @long_comments || split_comments.last
140 140 end
141 141
142 142 def text_tag
143 143 if scmid?
144 144 "commit:#{scmid}"
145 145 else
146 146 "r#{revision}"
147 147 end
148 148 end
149 149
150 150 # Returns the previous changeset
151 151 def previous
152 152 @previous ||= Changeset.find(:first, :conditions => ['id < ? AND repository_id = ?', self.id, self.repository_id], :order => 'id DESC')
153 153 end
154 154
155 155 # Returns the next changeset
156 156 def next
157 157 @next ||= Changeset.find(:first, :conditions => ['id > ? AND repository_id = ?', self.id, self.repository_id], :order => 'id ASC')
158 158 end
159 159
160 160 # Creates a new Change from it's common parameters
161 161 def create_change(change)
162 162 Change.create(:changeset => self,
163 163 :action => change[:action],
164 164 :path => change[:path],
165 165 :from_path => change[:from_path],
166 166 :from_revision => change[:from_revision])
167 167 end
168 168
169 169 private
170 170
171 171 # Finds an issue that can be referenced by the commit message
172 172 # i.e. an issue that belong to the repository project, a subproject or a parent project
173 173 def find_referenced_issue_by_id(id)
174 174 return nil if id.blank?
175 175 issue = Issue.find_by_id(id.to_i, :include => :project)
176 176 if issue
177 177 unless issue.project && (project == issue.project || project.is_ancestor_of?(issue.project) || project.is_descendant_of?(issue.project))
178 178 issue = nil
179 179 end
180 180 end
181 181 issue
182 182 end
183 183
184 184 def fix_issue(issue)
185 185 status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i)
186 186 if status.nil?
187 187 logger.warn("No status macthes commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger
188 188 return issue
189 189 end
190 190
191 191 # the issue may have been updated by the closure of another one (eg. duplicate)
192 192 issue.reload
193 193 # don't change the status is the issue is closed
194 194 return if issue.status && issue.status.is_closed?
195 195
196 196 journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag))
197 197 issue.status = status
198 198 unless Setting.commit_fix_done_ratio.blank?
199 199 issue.done_ratio = Setting.commit_fix_done_ratio.to_i
200 200 end
201 201 Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update,
202 202 { :changeset => self, :issue => issue })
203 203 unless issue.save
204 204 logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger
205 205 end
206 206 issue
207 207 end
208 208
209 209 def log_time(issue, hours)
210 210 time_entry = TimeEntry.new(
211 211 :user => user,
212 212 :hours => hours,
213 213 :issue => issue,
214 214 :spent_on => commit_date,
215 215 :comments => l(:text_time_logged_by_changeset, :value => text_tag, :locale => Setting.default_language)
216 216 )
217 217 time_entry.activity = log_time_activity unless log_time_activity.nil?
218 218
219 219 unless time_entry.save
220 220 logger.warn("TimeEntry could not be created by changeset #{id}: #{time_entry.errors.full_messages}") if logger
221 221 end
222 222 time_entry
223 223 end
224 224
225 225 def log_time_activity
226 226 if Setting.commit_logtime_activity_id.to_i > 0
227 227 TimeEntryActivity.find_by_id(Setting.commit_logtime_activity_id.to_i)
228 228 end
229 229 end
230 230
231 231 def split_comments
232 232 comments =~ /\A(.+?)\r?\n(.*)$/m
233 233 @short_comments = $1 || comments
234 234 @long_comments = $2.to_s.strip
235 235 return @short_comments, @long_comments
236 236 end
237 237
238 238 public
239 239
240 240 # Strips and reencodes a commit log before insertion into the database
241 241 def self.normalize_comments(str, encoding)
242 242 Changeset.to_utf8(str.to_s.strip, encoding)
243 243 end
244 244
245 245 private
246 246
247 247 def self.to_utf8(str, encoding)
248 248 return str if str.nil?
249 249 str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
250 250 if str.empty?
251 251 str.force_encoding("UTF-8") if str.respond_to?(:force_encoding)
252 252 return str
253 253 end
254 254 str.force_encoding("UTF-8") if str.respond_to?(:force_encoding)
255 255 if str.respond_to?(:force_encoding)
256 256 enc = encoding.blank? ? "UTF-8" : encoding
257 257 if enc != "UTF-8"
258 258 str.force_encoding(enc)
259 str = str.encode("UTF-8")
259 str = str.encode("UTF-8", :invalid => :replace,
260 :undef => :replace, :replace => '?')
260 261 end
261 262 if ! str.valid_encoding?
262 263 str = str.encode("US-ASCII", :invalid => :replace,
263 264 :undef => :replace, :replace => '?').encode("UTF-8")
264 265 end
265 266 else
266 267 unless encoding.blank? || encoding == 'UTF-8'
267 268 begin
268 269 str = Iconv.conv('UTF-8', encoding, str)
269 270 rescue Iconv::Failure
270 271 # do nothing here
271 272 end
272 273 end
273 274 # removes invalid UTF8 sequences
274 275 begin
275 276 str = Iconv.conv('UTF-8//IGNORE', 'UTF-8', str + ' ')[0..-3]
276 277 rescue Iconv::InvalidEncoding
277 278 # "UTF-8//IGNORE" is not supported on some OS
278 279 end
279 280 end
280 281 str
281 282 end
282 283 end
@@ -1,341 +1,365
1 1 # encoding: utf-8
2 2 #
3 3 # Redmine - project management software
4 4 # Copyright (C) 2006-2010 Jean-Philippe Lang
5 5 #
6 6 # This program is free software; you can redistribute it and/or
7 7 # modify it under the terms of the GNU General Public License
8 8 # as published by the Free Software Foundation; either version 2
9 9 # of the License, or (at your option) any later version.
10 10 #
11 11 # This program is distributed in the hope that it will be useful,
12 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 14 # GNU General Public License for more details.
15 15 #
16 16 # You should have received a copy of the GNU General Public License
17 17 # along with this program; if not, write to the Free Software
18 18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 19
20 20 require File.expand_path('../../test_helper', __FILE__)
21 21
22 22 class ChangesetTest < ActiveSupport::TestCase
23 23 fixtures :projects, :repositories, :issues, :issue_statuses,
24 24 :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :users, :members, :member_roles, :trackers
25 25
26 26 def setup
27 27 end
28 28
29 29 def test_ref_keywords_any
30 30 ActionMailer::Base.deliveries.clear
31 31 Setting.commit_fix_status_id = IssueStatus.find(
32 32 :first, :conditions => ["is_closed = ?", true]).id
33 33 Setting.commit_fix_done_ratio = '90'
34 34 Setting.commit_ref_keywords = '*'
35 35 Setting.commit_fix_keywords = 'fixes , closes'
36 36
37 37 c = Changeset.new(:repository => Project.find(1).repository,
38 38 :committed_on => Time.now,
39 39 :comments => 'New commit (#2). Fixes #1')
40 40 c.scan_comment_for_issue_ids
41 41
42 42 assert_equal [1, 2], c.issue_ids.sort
43 43 fixed = Issue.find(1)
44 44 assert fixed.closed?
45 45 assert_equal 90, fixed.done_ratio
46 46 assert_equal 1, ActionMailer::Base.deliveries.size
47 47 end
48 48
49 49 def test_ref_keywords
50 50 Setting.commit_ref_keywords = 'refs'
51 51 Setting.commit_fix_keywords = ''
52 52
53 53 c = Changeset.new(:repository => Project.find(1).repository,
54 54 :committed_on => Time.now,
55 55 :comments => 'Ignores #2. Refs #1')
56 56 c.scan_comment_for_issue_ids
57 57
58 58 assert_equal [1], c.issue_ids.sort
59 59 end
60 60
61 61 def test_ref_keywords_any_only
62 62 Setting.commit_ref_keywords = '*'
63 63 Setting.commit_fix_keywords = ''
64 64
65 65 c = Changeset.new(:repository => Project.find(1).repository,
66 66 :committed_on => Time.now,
67 67 :comments => 'Ignores #2. Refs #1')
68 68 c.scan_comment_for_issue_ids
69 69
70 70 assert_equal [1, 2], c.issue_ids.sort
71 71 end
72 72
73 73 def test_ref_keywords_any_with_timelog
74 74 Setting.commit_ref_keywords = '*'
75 75 Setting.commit_logtime_enabled = '1'
76 76
77 77 {
78 78 '2' => 2.0,
79 79 '2h' => 2.0,
80 80 '2hours' => 2.0,
81 81 '15m' => 0.25,
82 82 '15min' => 0.25,
83 83 '3h15' => 3.25,
84 84 '3h15m' => 3.25,
85 85 '3h15min' => 3.25,
86 86 '3:15' => 3.25,
87 87 '3.25' => 3.25,
88 88 '3.25h' => 3.25,
89 89 '3,25' => 3.25,
90 90 '3,25h' => 3.25,
91 91 }.each do |syntax, expected_hours|
92 92 c = Changeset.new(:repository => Project.find(1).repository,
93 93 :committed_on => 24.hours.ago,
94 94 :comments => "Worked on this issue #1 @#{syntax}",
95 95 :revision => '520',
96 96 :user => User.find(2))
97 97 assert_difference 'TimeEntry.count' do
98 98 c.scan_comment_for_issue_ids
99 99 end
100 100 assert_equal [1], c.issue_ids.sort
101 101
102 102 time = TimeEntry.first(:order => 'id desc')
103 103 assert_equal 1, time.issue_id
104 104 assert_equal 1, time.project_id
105 105 assert_equal 2, time.user_id
106 106 assert_equal expected_hours, time.hours,
107 107 "@#{syntax} should be logged as #{expected_hours} hours but was #{time.hours}"
108 108 assert_equal Date.yesterday, time.spent_on
109 109 assert time.activity.is_default?
110 110 assert time.comments.include?('r520'),
111 111 "r520 was expected in time_entry comments: #{time.comments}"
112 112 end
113 113 end
114 114
115 115 def test_ref_keywords_closing_with_timelog
116 116 Setting.commit_fix_status_id = IssueStatus.find(
117 117 :first, :conditions => ["is_closed = ?", true]).id
118 118 Setting.commit_ref_keywords = '*'
119 119 Setting.commit_fix_keywords = 'fixes , closes'
120 120 Setting.commit_logtime_enabled = '1'
121 121
122 122 c = Changeset.new(:repository => Project.find(1).repository,
123 123 :committed_on => Time.now,
124 124 :comments => 'This is a comment. Fixes #1 @4.5, #2 @1',
125 125 :user => User.find(2))
126 126 assert_difference 'TimeEntry.count', 2 do
127 127 c.scan_comment_for_issue_ids
128 128 end
129 129
130 130 assert_equal [1, 2], c.issue_ids.sort
131 131 assert Issue.find(1).closed?
132 132 assert Issue.find(2).closed?
133 133
134 134 times = TimeEntry.all(:order => 'id desc', :limit => 2)
135 135 assert_equal [1, 2], times.collect(&:issue_id).sort
136 136 end
137 137
138 138 def test_ref_keywords_any_line_start
139 139 Setting.commit_ref_keywords = '*'
140 140
141 141 c = Changeset.new(:repository => Project.find(1).repository,
142 142 :committed_on => Time.now,
143 143 :comments => '#1 is the reason of this commit')
144 144 c.scan_comment_for_issue_ids
145 145
146 146 assert_equal [1], c.issue_ids.sort
147 147 end
148 148
149 149 def test_ref_keywords_allow_brackets_around_a_issue_number
150 150 Setting.commit_ref_keywords = '*'
151 151
152 152 c = Changeset.new(:repository => Project.find(1).repository,
153 153 :committed_on => Time.now,
154 154 :comments => '[#1] Worked on this issue')
155 155 c.scan_comment_for_issue_ids
156 156
157 157 assert_equal [1], c.issue_ids.sort
158 158 end
159 159
160 160 def test_ref_keywords_allow_brackets_around_multiple_issue_numbers
161 161 Setting.commit_ref_keywords = '*'
162 162
163 163 c = Changeset.new(:repository => Project.find(1).repository,
164 164 :committed_on => Time.now,
165 165 :comments => '[#1 #2, #3] Worked on these')
166 166 c.scan_comment_for_issue_ids
167 167
168 168 assert_equal [1,2,3], c.issue_ids.sort
169 169 end
170 170
171 171 def test_commit_referencing_a_subproject_issue
172 172 c = Changeset.new(:repository => Project.find(1).repository,
173 173 :committed_on => Time.now,
174 174 :comments => 'refs #5, a subproject issue')
175 175 c.scan_comment_for_issue_ids
176 176
177 177 assert_equal [5], c.issue_ids.sort
178 178 assert c.issues.first.project != c.project
179 179 end
180 180
181 181 def test_commit_referencing_a_parent_project_issue
182 182 # repository of child project
183 183 r = Repository::Subversion.create!(
184 184 :project => Project.find(3),
185 185 :url => 'svn://localhost/test')
186 186
187 187 c = Changeset.new(:repository => r,
188 188 :committed_on => Time.now,
189 189 :comments => 'refs #2, an issue of a parent project')
190 190 c.scan_comment_for_issue_ids
191 191
192 192 assert_equal [2], c.issue_ids.sort
193 193 assert c.issues.first.project != c.project
194 194 end
195 195
196 196 def test_text_tag_revision
197 197 c = Changeset.new(:revision => '520')
198 198 assert_equal 'r520', c.text_tag
199 199 end
200 200
201 201 def test_text_tag_hash
202 202 c = Changeset.new(
203 203 :scmid => '7234cb2750b63f47bff735edc50a1c0a433c2518',
204 204 :revision => '7234cb2750b63f47bff735edc50a1c0a433c2518')
205 205 assert_equal 'commit:7234cb2750b63f47bff735edc50a1c0a433c2518', c.text_tag
206 206 end
207 207
208 208 def test_text_tag_hash_all_number
209 209 c = Changeset.new(:scmid => '0123456789', :revision => '0123456789')
210 210 assert_equal 'commit:0123456789', c.text_tag
211 211 end
212 212
213 213 def test_previous
214 214 changeset = Changeset.find_by_revision('3')
215 215 assert_equal Changeset.find_by_revision('2'), changeset.previous
216 216 end
217 217
218 218 def test_previous_nil
219 219 changeset = Changeset.find_by_revision('1')
220 220 assert_nil changeset.previous
221 221 end
222 222
223 223 def test_next
224 224 changeset = Changeset.find_by_revision('2')
225 225 assert_equal Changeset.find_by_revision('3'), changeset.next
226 226 end
227 227
228 228 def test_next_nil
229 229 changeset = Changeset.find_by_revision('10')
230 230 assert_nil changeset.next
231 231 end
232 232
233 233 def test_comments_should_be_converted_to_utf8
234 234 proj = Project.find(3)
235 235 # str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
236 236 str = "Texte encod\xe9 en ISO-8859-1."
237 237 str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
238 238 r = Repository::Bazaar.create!(
239 239 :project => proj, :url => '/tmp/test/bazaar',
240 240 :log_encoding => 'ISO-8859-1' )
241 241 assert r
242 242 c = Changeset.new(:repository => r,
243 243 :committed_on => Time.now,
244 244 :revision => '123',
245 245 :scmid => '12345',
246 246 :comments => str)
247 247 assert( c.save )
248 248 str_utf8 = "Texte encod\xc3\xa9 en ISO-8859-1."
249 249 str_utf8.force_encoding("UTF-8") if str_utf8.respond_to?(:force_encoding)
250 250 assert_equal str_utf8, c.comments
251 251 end
252 252
253 253 def test_invalid_utf8_sequences_in_comments_should_be_stripped
254 254 proj = Project.find(3)
255 255 # str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
256 256 str = "Texte encod\xe9 en ISO-8859-1."
257 257 str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
258 258 r = Repository::Bazaar.create!(
259 259 :project => proj, :url => '/tmp/test/bazaar',
260 260 :log_encoding => 'UTF-8' )
261 261 assert r
262 262 c = Changeset.new(:repository => r,
263 263 :committed_on => Time.now,
264 264 :revision => '123',
265 265 :scmid => '12345',
266 266 :comments => str)
267 267 assert( c.save )
268 268 if str.respond_to?(:force_encoding)
269 269 assert_equal "Texte encod? en ISO-8859-1.", c.comments
270 270 else
271 271 assert_equal "Texte encod en ISO-8859-1.", c.comments
272 272 end
273 273 end
274 274
275 def test_invalid_utf8_sequences_in_comments_should_be_stripped_ja_jis
276 proj = Project.find(3)
277 str = "test\xb5\xfetest\xb5\xfe"
278 if str.respond_to?(:force_encoding)
279 str.force_encoding('ASCII-8BIT')
280 end
281 r = Repository::Bazaar.create!(
282 :project => proj,
283 :url => '/tmp/test/bazaar',
284 :log_encoding => 'ISO-2022-JP' )
285 assert r
286 c = Changeset.new(:repository => r,
287 :committed_on => Time.now,
288 :revision => '123',
289 :scmid => '12345',
290 :comments => str)
291 assert( c.save )
292 if str.respond_to?(:force_encoding)
293 assert_equal "test??test??", c.comments
294 else
295 assert_equal "testtest", c.comments
296 end
297 end
298
275 299 def test_comments_should_be_converted_all_latin1_to_utf8
276 300 s1 = "\xC2\x80"
277 301 s2 = "\xc3\x82\xc2\x80"
278 302 s4 = s2.dup
279 303 if s1.respond_to?(:force_encoding)
280 304 s3 = s1.dup
281 305 s1.force_encoding('ASCII-8BIT')
282 306 s2.force_encoding('ASCII-8BIT')
283 307 s3.force_encoding('ISO-8859-1')
284 308 s4.force_encoding('UTF-8')
285 309 assert_equal s3.encode('UTF-8'), s4
286 310 end
287 311 proj = Project.find(3)
288 312 r = Repository::Bazaar.create!(
289 313 :project => proj, :url => '/tmp/test/bazaar',
290 314 :log_encoding => 'ISO-8859-1' )
291 315 assert r
292 316 c = Changeset.new(:repository => r,
293 317 :committed_on => Time.now,
294 318 :revision => '123',
295 319 :scmid => '12345',
296 320 :comments => s1)
297 321 assert( c.save )
298 322 assert_equal s4, c.comments
299 323 end
300 324
301 325 def test_comments_nil
302 326 proj = Project.find(3)
303 327 r = Repository::Bazaar.create!(
304 328 :project => proj, :url => '/tmp/test/bazaar',
305 329 :log_encoding => 'ISO-8859-1' )
306 330 assert r
307 331 c = Changeset.new(:repository => r,
308 332 :committed_on => Time.now,
309 333 :revision => '123',
310 334 :scmid => '12345',
311 335 :comments => nil)
312 336 assert( c.save )
313 337 assert_equal "", c.comments
314 338 if c.comments.respond_to?(:force_encoding)
315 339 assert_equal "UTF-8", c.comments.encoding.to_s
316 340 end
317 341 end
318 342
319 343 def test_comments_empty
320 344 proj = Project.find(3)
321 345 r = Repository::Bazaar.create!(
322 346 :project => proj, :url => '/tmp/test/bazaar',
323 347 :log_encoding => 'ISO-8859-1' )
324 348 assert r
325 349 c = Changeset.new(:repository => r,
326 350 :committed_on => Time.now,
327 351 :revision => '123',
328 352 :scmid => '12345',
329 353 :comments => "")
330 354 assert( c.save )
331 355 assert_equal "", c.comments
332 356 if c.comments.respond_to?(:force_encoding)
333 357 assert_equal "UTF-8", c.comments.encoding.to_s
334 358 end
335 359 end
336 360
337 361 def test_identifier
338 362 c = Changeset.find_by_revision('1')
339 363 assert_equal c.revision, c.identifier
340 364 end
341 365 end
General Comments 0
You need to be logged in to leave comments. Login now