| 
									
										
										
										
											2019-03-16 09:37:35 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							| 
									
										
										
										
											2019-03-15 01:32:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-10 18:59:06 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2020-03-03 00:24:10 +00:00
										 |  |  | # Copyright (C) 2006-2020  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2007-03-25 12:12:15 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | # as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | # of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2007-03-25 12:12:15 +00:00
										 |  |  | # This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2007-03-25 12:12:15 +00:00
										 |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with this program; if not, write to the Free Software | 
					
						
							|  |  |  | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Changeset < ActiveRecord::Base | 
					
						
							|  |  |  |   belongs_to :repository | 
					
						
							| 
									
										
										
										
											2008-11-10 18:59:06 +00:00
										 |  |  |   belongs_to :user | 
					
						
							| 
									
										
										
										
											2012-06-03 11:46:58 +00:00
										 |  |  |   has_many :filechanges, :class_name => 'Change', :dependent => :delete_all | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |   has_and_belongs_to_many :issues | 
					
						
							| 
									
										
										
										
											2011-11-03 08:01:41 +00:00
										 |  |  |   has_and_belongs_to_many :parents, | 
					
						
							|  |  |  |                           :class_name => "Changeset", | 
					
						
							|  |  |  |                           :join_table => "#{table_name_prefix}changeset_parents#{table_name_suffix}", | 
					
						
							|  |  |  |                           :association_foreign_key => 'parent_id', :foreign_key => 'changeset_id' | 
					
						
							|  |  |  |   has_and_belongs_to_many :children, | 
					
						
							|  |  |  |                           :class_name => "Changeset", | 
					
						
							|  |  |  |                           :join_table => "#{table_name_prefix}changeset_parents#{table_name_suffix}", | 
					
						
							|  |  |  |                           :association_foreign_key => 'changeset_id', :foreign_key => 'parent_id' | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-10 13:34:16 +00:00
										 |  |  |   acts_as_event( | 
					
						
							|  |  |  |     :title => proc {|o| o.title}, | 
					
						
							|  |  |  |     :description => :long_comments, | 
					
						
							|  |  |  |     :datetime => :committed_on, | 
					
						
							|  |  |  |     :url => | 
					
						
							|  |  |  |       proc do |o| | 
					
						
							|  |  |  |         {:controller => 'repositories', :action => 'revision', | 
					
						
							|  |  |  |          :id => o.repository.project, | 
					
						
							|  |  |  |          :repository_id => o.repository.identifier_param, :rev => o.identifier} | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |   ) | 
					
						
							| 
									
										
										
										
											2007-09-27 17:28:22 +00:00
										 |  |  |   acts_as_searchable :columns => 'comments', | 
					
						
							| 
									
										
										
										
											2014-12-12 20:49:31 +00:00
										 |  |  |                      :preload => {:repository => :project}, | 
					
						
							| 
									
										
										
										
											2007-09-27 17:28:22 +00:00
										 |  |  |                      :project_key => "#{Repository.table_name}.project_id", | 
					
						
							| 
									
										
										
										
											2014-12-12 20:49:31 +00:00
										 |  |  |                      :date_column => :committed_on | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 17:54:09 +00:00
										 |  |  |   acts_as_activity_provider :timestamp => "#{table_name}.committed_on", | 
					
						
							| 
									
										
										
										
											2008-11-30 11:18:22 +00:00
										 |  |  |                             :author_key => :user_id, | 
					
						
							| 
									
										
										
										
											2020-11-17 12:41:26 +00:00
										 |  |  |                             :scope => proc {preload(:user, {:repository => :project})} | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-25 17:11:46 +00:00
										 |  |  |   validates_presence_of :repository_id, :revision, :committed_on, :commit_date | 
					
						
							| 
									
										
										
										
											2020-01-30 05:27:52 +00:00
										 |  |  |   validates_uniqueness_of :revision, :scope => :repository_id | 
					
						
							|  |  |  |   validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-12 12:31:04 +00:00
										 |  |  |   scope :visible, (lambda do |*args| | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |     joins(:repository => :project). | 
					
						
							|  |  |  |     where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args)) | 
					
						
							| 
									
										
										
										
											2020-11-12 12:31:04 +00:00
										 |  |  |   end) | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 12:42:12 +00:00
										 |  |  |   after_create :scan_for_issues | 
					
						
							| 
									
										
										
										
											2011-08-29 14:03:11 +00:00
										 |  |  |   before_create :before_create_cs | 
					
						
							| 
									
										
										
										
											2011-08-29 12:42:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-26 17:56:26 +00:00
										 |  |  |   def revision=(r) | 
					
						
							|  |  |  |     write_attribute :revision, (r.nil? ? nil : r.to_s) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-01-02 09:45:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # Returns the identifier of this changeset; depending on repository backends | 
					
						
							|  |  |  |   def identifier | 
					
						
							|  |  |  |     if repository.class.respond_to? :changeset_identifier | 
					
						
							|  |  |  |       repository.class.changeset_identifier self | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       revision.to_s | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2007-08-25 14:41:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-25 17:11:46 +00:00
										 |  |  |   def committed_on=(date) | 
					
						
							|  |  |  |     self.commit_date = date | 
					
						
							|  |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-01-02 09:45:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # Returns the readable identifier | 
					
						
							|  |  |  |   def format_identifier | 
					
						
							|  |  |  |     if repository.class.respond_to? :format_changeset_identifier | 
					
						
							|  |  |  |       repository.class.format_changeset_identifier self | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       identifier | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-11 19:33:38 +00:00
										 |  |  |   def project | 
					
						
							|  |  |  |     repository.project | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 09:30:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-10 18:59:06 +00:00
										 |  |  |   def author | 
					
						
							|  |  |  |     user || committer.to_s.split('<').first | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 09:30:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 14:03:11 +00:00
										 |  |  |   def before_create_cs | 
					
						
							| 
									
										
										
										
											2015-03-20 07:26:34 +00:00
										 |  |  |     self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding) | 
					
						
							| 
									
										
										
										
											2020-09-26 15:02:10 +00:00
										 |  |  |     self.comments = | 
					
						
							|  |  |  |       self.class.normalize_comments(self.comments, repository.repo_log_encoding) | 
					
						
							| 
									
										
										
										
											2011-02-28 12:09:32 +00:00
										 |  |  |     self.user = repository.find_committer_user(self.committer) | 
					
						
							| 
									
										
										
										
											2008-11-10 18:59:06 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-02-28 12:09:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 12:42:12 +00:00
										 |  |  |   def scan_for_issues | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |     scan_comment_for_issue_ids | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 09:30:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |   TIMELOG_RE = /
 | 
					
						
							|  |  |  |     ( | 
					
						
							| 
									
										
										
										
											2011-02-26 14:46:19 +00:00
										 |  |  |     ((\d+)(h|hours?))((\d+)(m|min)?)? | 
					
						
							|  |  |  |     | | 
					
						
							|  |  |  |     ((\d+)(h|hours?|m|min)) | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     | | 
					
						
							|  |  |  |     (\d+):(\d+) | 
					
						
							|  |  |  |     | | 
					
						
							| 
									
										
										
										
											2011-02-26 14:46:19 +00:00
										 |  |  |     (\d+([\.,]\d+)?)h? | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  |     /x
 | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |   def scan_comment_for_issue_ids | 
					
						
							| 
									
										
										
										
											2007-04-25 15:06:20 +00:00
										 |  |  |     return if comments.blank? | 
					
						
							| 
									
										
										
										
											2020-07-21 13:40:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |     # keywords used to reference issues | 
					
						
							| 
									
										
										
										
											2007-10-22 16:52:36 +00:00
										 |  |  |     ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip) | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     ref_keywords_any = ref_keywords.delete('*') | 
					
						
							| 
									
										
										
										
											2020-12-10 13:34:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |     # keywords used to fix issues | 
					
						
							| 
									
										
										
										
											2013-10-13 07:37:49 +00:00
										 |  |  |     fix_keywords = Setting.commit_update_keywords_array.map {|r| r['keywords']}.flatten.compact | 
					
						
							| 
									
										
										
										
											2007-10-22 16:52:36 +00:00
										 |  |  |     kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-22 16:52:36 +00:00
										 |  |  |     referenced_issues = [] | 
					
						
							| 
									
										
										
										
											2020-12-10 13:34:16 +00:00
										 |  |  |     regexp = | 
					
						
							|  |  |  |       %r{
 | 
					
						
							|  |  |  |         ([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)? | 
					
						
							|  |  |  |         (\#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+\#\d+(\s+@#{TIMELOG_RE})?)*) | 
					
						
							|  |  |  |         (?=[[:punct:]]|\s|<|$) | 
					
						
							|  |  |  |       }xi | 
					
						
							|  |  |  |     comments.scan(regexp) do |match| | 
					
						
							|  |  |  |       action = match[2].to_s.downcase | 
					
						
							|  |  |  |       refs   = match[3] | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |       next unless action.present? || ref_keywords_any | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |       refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m| | 
					
						
							| 
									
										
										
										
											2020-12-10 13:34:16 +00:00
										 |  |  |         issue = find_referenced_issue_by_id(m[0].to_i) | 
					
						
							|  |  |  |         hours = m[2] | 
					
						
							| 
									
										
										
										
											2014-10-05 12:10:33 +00:00
										 |  |  |         if issue && !issue_linked_to_same_commit?(issue) | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |           referenced_issues << issue | 
					
						
							| 
									
										
										
										
											2013-10-05 10:33:03 +00:00
										 |  |  |           # Don't update issues or log time when importing old commits | 
					
						
							|  |  |  |           unless repository.created_on && committed_on && committed_on < repository.created_on | 
					
						
							|  |  |  |             fix_issue(issue, action) if fix_keywords.include?(action) | 
					
						
							|  |  |  |             log_time(issue, hours) if hours && Setting.commit_logtime_enabled? | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:43:45 +00:00
										 |  |  |     referenced_issues.uniq! | 
					
						
							|  |  |  |     self.issues = referenced_issues unless referenced_issues.empty? | 
					
						
							| 
									
										
										
										
											2007-04-24 13:57:27 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-01 15:48:56 +00:00
										 |  |  |   def short_comments | 
					
						
							|  |  |  |     @short_comments || split_comments.first | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-01 15:48:56 +00:00
										 |  |  |   def long_comments | 
					
						
							|  |  |  |     @long_comments || split_comments.last | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-20 21:58:57 +00:00
										 |  |  |   def text_tag(ref_project=nil) | 
					
						
							| 
									
										
										
										
											2014-01-12 09:19:47 +00:00
										 |  |  |     repo = "" | 
					
						
							|  |  |  |     if repository && repository.identifier.present? | 
					
						
							|  |  |  |       repo = "#{repository.identifier}|" | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2019-10-09 02:16:59 +00:00
										 |  |  |     tag = scmid? ? "commit:#{repo}#{scmid}" : "#{repo}r#{revision}" | 
					
						
							| 
									
										
										
										
											2012-02-20 21:58:57 +00:00
										 |  |  |     if ref_project && project && ref_project != project | 
					
						
							| 
									
										
										
										
											2012-07-17 23:55:32 +00:00
										 |  |  |       tag = "#{project.identifier}:#{tag}" | 
					
						
							| 
									
										
										
										
											2012-02-20 21:58:57 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |     tag | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 23:21:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 13:51:28 +00:00
										 |  |  |   # Returns the title used for the changeset in the activity/search results | 
					
						
							|  |  |  |   def title | 
					
						
							|  |  |  |     repo = (repository && repository.identifier.present?) ? " (#{repository.identifier})" : '' | 
					
						
							|  |  |  |     comm = short_comments.blank? ? '' : (': ' + short_comments) | 
					
						
							|  |  |  |     "#{l(:label_revision)} #{format_identifier}#{repo}#{comm}" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-01 17:15:42 +00:00
										 |  |  |   # Returns the previous changeset | 
					
						
							|  |  |  |   def previous | 
					
						
							| 
									
										
										
										
											2012-07-07 13:59:26 +00:00
										 |  |  |     @previous ||= Changeset.where(["id < ? AND repository_id = ?", id, repository_id]).order('id DESC').first | 
					
						
							| 
									
										
										
										
											2007-12-01 17:15:42 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Returns the next changeset | 
					
						
							|  |  |  |   def next | 
					
						
							| 
									
										
										
										
											2012-07-07 13:59:26 +00:00
										 |  |  |     @next ||= Changeset.where(["id > ? AND repository_id = ?", id, repository_id]).order('id ASC').first | 
					
						
							| 
									
										
										
										
											2007-12-01 17:15:42 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 23:21:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 17:02:32 +00:00
										 |  |  |   # Creates a new Change from it's common parameters | 
					
						
							|  |  |  |   def create_change(change) | 
					
						
							| 
									
										
										
										
											2011-04-09 23:21:04 +00:00
										 |  |  |     Change.create(:changeset     => self, | 
					
						
							|  |  |  |                   :action        => change[:action], | 
					
						
							|  |  |  |                   :path          => change[:path], | 
					
						
							|  |  |  |                   :from_path     => change[:from_path], | 
					
						
							| 
									
										
										
										
											2010-02-02 17:02:32 +00:00
										 |  |  |                   :from_revision => change[:from_revision]) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-02-28 12:09:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |   # Finds an issue that can be referenced by the commit message | 
					
						
							|  |  |  |   def find_referenced_issue_by_id(id) | 
					
						
							|  |  |  |     return nil if id.blank? | 
					
						
							| 
									
										
										
										
											2020-07-21 13:40:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-29 13:47:28 +00:00
										 |  |  |     issue = Issue.find_by_id(id.to_i) | 
					
						
							| 
									
										
										
										
											2012-02-02 18:09:37 +00:00
										 |  |  |     if Setting.commit_cross_project_ref? | 
					
						
							|  |  |  |       # all issues can be referenced/fixed | 
					
						
							|  |  |  |     elsif issue | 
					
						
							|  |  |  |       # issue that belong to the repository project, a subproject or a parent project only | 
					
						
							| 
									
										
										
										
											2011-04-09 09:30:50 +00:00
										 |  |  |       unless issue.project && | 
					
						
							|  |  |  |                 (project == issue.project || project.is_ancestor_of?(issue.project) || | 
					
						
							|  |  |  |                  project.is_descendant_of?(issue.project)) | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |         issue = nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     issue | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-05 10:56:27 +00:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-05 12:10:33 +00:00
										 |  |  |   # Returns true if the issue is already linked to the same commit | 
					
						
							|  |  |  |   # from a different repository | 
					
						
							|  |  |  |   def issue_linked_to_same_commit?(issue) | 
					
						
							|  |  |  |     repository.same_commits_in_scope(issue.changesets, self).any? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-05 09:41:11 +00:00
										 |  |  |   # Updates the +issue+ according to +action+ | 
					
						
							|  |  |  |   def fix_issue(issue, action) | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     # the issue may have been updated by the closure of another one (eg. duplicate) | 
					
						
							|  |  |  |     issue.reload | 
					
						
							|  |  |  |     # don't change the status is the issue is closed | 
					
						
							| 
									
										
										
										
											2014-10-25 09:35:17 +00:00
										 |  |  |     return if issue.closed? | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-24 05:40:32 +00:00
										 |  |  |     journal = issue.init_journal(user || User.anonymous, | 
					
						
							|  |  |  |                                  ll(Setting.default_language, | 
					
						
							|  |  |  |                                     :text_status_changed_by_changeset, | 
					
						
							|  |  |  |                                     text_tag(issue.project))) | 
					
						
							| 
									
										
										
										
											2013-10-13 07:37:49 +00:00
										 |  |  |     rule = Setting.commit_update_keywords_array.detect do |rule| | 
					
						
							| 
									
										
										
										
											2013-10-24 05:40:32 +00:00
										 |  |  |       rule['keywords'].include?(action) && | 
					
						
							|  |  |  |         (rule['if_tracker_id'].blank? || rule['if_tracker_id'] == issue.tracker_id.to_s) | 
					
						
							| 
									
										
										
										
											2013-10-13 07:37:49 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |     if rule | 
					
						
							|  |  |  |       issue.assign_attributes rule.slice(*Issue.attribute_names) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update, | 
					
						
							| 
									
										
										
										
											2020-07-21 13:40:11 +00:00
										 |  |  |                             {:changeset => self, :issue => issue, :action => action}) | 
					
						
							| 
									
										
										
										
											2015-04-12 09:16:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if issue.changes.any? | 
					
						
							|  |  |  |       unless issue.save | 
					
						
							|  |  |  |         logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-06-03 08:10:20 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |       issue.clear_journal | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |     issue | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 09:30:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |   def log_time(issue, hours) | 
					
						
							| 
									
										
										
										
											2020-09-12 12:57:42 +00:00
										 |  |  |     time_entry = | 
					
						
							|  |  |  |       TimeEntry.new( | 
					
						
							|  |  |  |         :user => user, | 
					
						
							|  |  |  |         :hours => hours, | 
					
						
							|  |  |  |         :issue => issue, | 
					
						
							|  |  |  |         :spent_on => commit_date, | 
					
						
							|  |  |  |         :comments => l(:text_time_logged_by_changeset, :value => text_tag(issue.project), | 
					
						
							|  |  |  |                        :locale => Setting.default_language) | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |       ) | 
					
						
							| 
									
										
										
										
											2020-02-11 13:33:22 +00:00
										 |  |  |     if activity = issue.project.commit_logtime_activity | 
					
						
							|  |  |  |       time_entry.activity = activity | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-05-15 23:01:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-05 11:45:09 +00:00
										 |  |  |     unless time_entry.save | 
					
						
							|  |  |  |       logger.warn("TimeEntry could not be created by changeset #{id}: #{time_entry.errors.full_messages}") if logger | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     time_entry | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2011-04-09 09:30:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-01 15:48:56 +00:00
										 |  |  |   def split_comments | 
					
						
							|  |  |  |     comments =~ /\A(.+?)\r?\n(.*)$/m | 
					
						
							|  |  |  |     @short_comments = $1 || comments | 
					
						
							|  |  |  |     @long_comments = $2.to_s.strip | 
					
						
							| 
									
										
										
										
											2020-12-19 17:32:49 +00:00
										 |  |  |     [@short_comments, @long_comments] | 
					
						
							| 
									
										
										
										
											2009-02-01 15:48:56 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2008-11-10 18:59:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-07 07:34:22 +00:00
										 |  |  |   # Singleton class method is public | 
					
						
							| 
									
										
										
										
											2019-10-07 07:20:26 +00:00
										 |  |  |   class << self | 
					
						
							|  |  |  |     # Strips and reencodes a commit log before insertion into the database | 
					
						
							|  |  |  |     def normalize_comments(str, encoding) | 
					
						
							|  |  |  |       Changeset.to_utf8(str.to_s.strip, encoding) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-02-28 12:09:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-07 07:20:26 +00:00
										 |  |  |     def to_utf8(str, encoding) | 
					
						
							|  |  |  |       Redmine::CodesetUtil.to_utf8(str, encoding) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2008-08-26 12:13:15 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2007-03-25 12:12:15 +00:00
										 |  |  | end |