##// END OF EJS Templates
Introduce virtual MenuNodes (#15880)....
Introduce virtual MenuNodes (#15880). They are characterized by having a blank url. they will only be rendered if the user is authorized to see at least one of its children. they render as links which do nothing when clicked. Patch by Jan Schulz-Hofen. git-svn-id: http://svn.redmine.org/redmine/trunk@15501 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14856:cda9c63d9c21
r15119:53710d80fc88
Show More
changeset.rb
294 lines | 9.9 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 Jean-Philippe Lang
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 #
# 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.
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672 #
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 # 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.
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672 #
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 # 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
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 belongs_to :user
Jean-Philippe Lang
Renamed #changes association to #filechanges (clash with AR::Base.changes that triggers errors with Rails 3.2.5)....
r9576 has_many :filechanges, :class_name => 'Change', :dependent => :delete_all
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 has_and_belongs_to_many :issues
Toshi MARUYAMA
scm: db: model: add parent/child relation for changesets (#5501)...
r7590 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'
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663
Jean-Philippe Lang
Adds the repository identifier in the activity and search results (#779)....
r9137 acts_as_event :title => Proc.new {|o| o.title},
Jean-Philippe Lang
Do not repeat one-line commit logs on the activity view....
r2344 :description => :long_comments,
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 :datetime => :committed_on,
Jean-Philippe Lang
Adds repository_id param for activity and search results (#779)....
r8531 :url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project, :repository_id => o.repository.identifier_param, :rev => o.identifier}}
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Search engines now supports pagination....
r755 acts_as_searchable :columns => 'comments',
Jean-Philippe Lang
Rewrites search engine to properly paginate results (#18631)....
r13357 :preload => {:repository => :project},
Jean-Philippe Lang
Search engines now supports pagination....
r755 :project_key => "#{Repository.table_name}.project_id",
Jean-Philippe Lang
Rewrites search engine to properly paginate results (#18631)....
r13357 :date_column => :committed_on
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Activity refactoring....
r1692 acts_as_activity_provider :timestamp => "#{table_name}.committed_on",
Jean-Philippe Lang
Display latest user's activity on account/show view....
r2064 :author_key => :user_id,
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 :scope => preload(:user, {:repository => :project})
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
added simple svn statistics graphs, rendered using SVG::Graph...
r377 validates_presence_of :repository_id, :revision, :committed_on, :commit_date
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 validates_uniqueness_of :revision, :scope => :repository_id
Jean-Philippe Lang
Added Darcs basic support....
r570 validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 attr_protected :id
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Rewrites named scopes with ARel queries....
r10723 scope :visible, lambda {|*args|
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 joins(:repository => :project).
where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args))
Jean-Philippe Lang
Rewrites named scopes with ARel queries....
r10723 }
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Toshi MARUYAMA
Rails3: replace deprecated 'after_create' to declared method at Repository model....
r6620 after_create :scan_for_issues
Toshi MARUYAMA
Rails3: replace deprecated 'before_create' to declared method at Changeset model....
r6624 before_create :before_create_cs
Toshi MARUYAMA
Rails3: replace deprecated 'after_create' to declared method at Repository model....
r6620
Jean-Philippe Lang
Postgresql 8.3 compatibility fix (#834)....
r1348 def revision=(r)
write_attribute :revision, (r.nil? ? nil : r.to_s)
end
Toshi MARUYAMA
Changing revision label and identifier at SCM adapter level (#3724, #6092)...
r4493
# 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
Jean-Philippe Lang
Changeset comments are now stripped before being stored in the database (patch by Nicholas Wieland)....
r651
Jean-Philippe Lang
added simple svn statistics graphs, rendered using SVG::Graph...
r377 def committed_on=(date)
self.commit_date = date
super
end
Toshi MARUYAMA
Changing revision label and identifier at SCM adapter level (#3724, #6092)...
r4493
# 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
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Activity enhancements:...
r1213 def project
repository.project
end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 def author
user || committer.to_s.split('<').first
end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252
Toshi MARUYAMA
Rails3: replace deprecated 'before_create' to declared method at Changeset model....
r6624 def before_create_cs
Toshi MARUYAMA
revert r13896 (#14534)...
r13754 self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding)
self.comments = self.class.normalize_comments(
self.comments, repository.repo_log_encoding)
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842 self.user = repository.find_committer_user(self.committer)
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 end
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842
Toshi MARUYAMA
Rails3: replace deprecated 'after_create' to declared method at Repository model....
r6620 def scan_for_issues
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 scan_comment_for_issue_ids
end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 TIMELOG_RE = /
(
Jean-Philippe Lang
Fixes syntax for time logging in commit messages (#7630, #7718)....
r4831 ((\d+)(h|hours?))((\d+)(m|min)?)?
|
((\d+)(h|hours?|m|min))
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 |
(\d+):(\d+)
|
Jean-Philippe Lang
Fixes syntax for time logging in commit messages (#7630, #7718)....
r4831 (\d+([\.,]\d+)?)h?
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 )
/x
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 def scan_comment_for_issue_ids
Jean-Philippe Lang
Fixed: 10342 Creation of Schema in Oracle...
r476 return if comments.blank?
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 # keywords used to reference issues
Jean-Philippe Lang
Commit message parser:...
r848 ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip)
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 ref_keywords_any = ref_keywords.delete('*')
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 # keywords used to fix issues
Jean-Philippe Lang
Ability to define commit keywords per tracker (#7590)....
r11978 fix_keywords = Setting.commit_update_keywords_array.map {|r| r['keywords']}.flatten.compact
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Commit message parser:...
r848 kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|")
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Commit message parser:...
r848 referenced_issues = []
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match|
Jean-Philippe Lang
Support for multiple issue update keywords/rules in commit messages (#4911)....
r11967 action, refs = match[2].to_s.downcase, match[3]
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 next unless action.present? || ref_keywords_any
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m|
issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2]
Jean-Philippe Lang
Don't link multiple changesets from the same commit multiple times (#17931)....
r13063 if issue && !issue_linked_to_same_commit?(issue)
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 referenced_issues << issue
Jean-Philippe Lang
Don't update issues nor log time when importing old changesets (#4823)....
r11969 # 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
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 end
end
end
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Avoid unnecessary SQL queries when loading changesets....
r3359 referenced_issues.uniq!
self.issues = referenced_issues unless referenced_issues.empty?
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 end
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Do not repeat one-line commit logs on the activity view....
r2344 def short_comments
@short_comments || split_comments.first
end
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Do not repeat one-line commit logs on the activity view....
r2344 def long_comments
@long_comments || split_comments.last
end
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356
Jean-Philippe Lang
Fixed magic link in the note added when closing an issue by a commit from a subproject (#10284)....
r8797 def text_tag(ref_project=nil)
Jean-Philippe Lang
Fixed Changeset#text_tag for changeset with hash and repository identifier (#13544)....
r12385 repo = ""
if repository && repository.identifier.present?
repo = "#{repository.identifier}|"
end
Jean-Philippe Lang
Fixed magic link in the note added when closing an issue by a commit from a subproject (#10284)....
r8797 tag = if scmid?
Jean-Philippe Lang
Fixed Changeset#text_tag for changeset with hash and repository identifier (#13544)....
r12385 "commit:#{repo}#{scmid}"
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 else
Jean-Philippe Lang
Fixed Changeset#text_tag for changeset with hash and repository identifier (#13544)....
r12385 "#{repo}r#{revision}"
Jean-Philippe Lang
Adds the repository identifier to Changeset#text_tag (#779)....
r9135 end
Jean-Philippe Lang
Fixed magic link in the note added when closing an issue by a commit from a subproject (#10284)....
r8797 if ref_project && project && ref_project != project
Toshi MARUYAMA
remove trailing white-space from app/models/changeset.rb...
r9839 tag = "#{project.identifier}:#{tag}"
Jean-Philippe Lang
Fixed magic link in the note added when closing an issue by a commit from a subproject (#10284)....
r8797 end
tag
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5254
Jean-Philippe Lang
Adds the repository identifier in the activity and search results (#779)....
r9137 # 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
Jean-Philippe Lang
* Added links to previous and next revisions on revision view (patch by Cyril Mougel slightly edited)...
r925 # Returns the previous changeset
def previous
Jean-Philippe Lang
Code cleanup....
r9753 @previous ||= Changeset.where(["id < ? AND repository_id = ?", id, repository_id]).order('id DESC').first
Jean-Philippe Lang
* Added links to previous and next revisions on revision view (patch by Cyril Mougel slightly edited)...
r925 end
# Returns the next changeset
def next
Jean-Philippe Lang
Code cleanup....
r9753 @next ||= Changeset.where(["id > ? AND repository_id = ?", id, repository_id]).order('id ASC').first
Jean-Philippe Lang
* Added links to previous and next revisions on revision view (patch by Cyril Mougel slightly edited)...
r925 end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5254
Eric Davis
Refactor: Extract method to create a Change from a Changeset....
r3246 # Creates a new Change from it's common parameters
def create_change(change)
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5254 Change.create(:changeset => self,
:action => change[:action],
:path => change[:path],
:from_path => change[:from_path],
Eric Davis
Refactor: Extract method to create a Change from a Changeset....
r3246 :from_revision => change[:from_revision])
end
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 # Finds an issue that can be referenced by the commit message
def find_referenced_issue_by_id(id)
return nil if id.blank?
Jean-Philippe Lang
find_referenced_issue_by_id fails with RangeError for large numbers (#21071)....
r14376 issue = Issue.find_by_id(id.to_i)
Jean-Philippe Lang
Adds a setting that allows to reference/fix issues of all projects (#3087)....
r8630 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
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252 unless issue.project &&
(project == issue.project || project.is_ancestor_of?(issue.project) ||
project.is_descendant_of?(issue.project))
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 issue = nil
end
end
issue
end
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Adds a "Manage related isses" permission to add/remove commits/issues relations manually from the changeset view (#2009)....
r8657 private
Jean-Philippe Lang
Don't link multiple changesets from the same commit multiple times (#17931)....
r13063 # 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
Jean-Philippe Lang
Support for multiple issue update keywords/rules in commit messages (#4911)....
r11967 # Updates the +issue+ according to +action+
def fix_issue(issue, action)
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 # 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
Jean-Philippe Lang
Code cleanup....
r13126 return if issue.closed?
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Toshi MARUYAMA
code format cleanup app/models/changeset.rb...
r12001 journal = issue.init_journal(user || User.anonymous,
ll(Setting.default_language,
:text_status_changed_by_changeset,
text_tag(issue.project)))
Jean-Philippe Lang
Ability to define commit keywords per tracker (#7590)....
r11978 rule = Setting.commit_update_keywords_array.detect do |rule|
Toshi MARUYAMA
code format cleanup app/models/changeset.rb...
r12001 rule['keywords'].include?(action) &&
(rule['if_tracker_id'].blank? || rule['if_tracker_id'] == issue.tracker_id.to_s)
Jean-Philippe Lang
Ability to define commit keywords per tracker (#7590)....
r11978 end
if rule
issue.assign_attributes rule.slice(*Issue.attribute_names)
end
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update,
Jean-Philippe Lang
Pass the commit keyword used to update the issue to the plugin hook....
r11968 { :changeset => self, :issue => issue, :action => action })
Jean-Philippe Lang
Keywords in commit messages: journal entries are created even if nothing was changed (#19538)....
r13782
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
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 end
issue
end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 def log_time(issue, hours)
time_entry = TimeEntry.new(
:user => user,
:hours => hours,
:issue => issue,
:spent_on => commit_date,
Jean-Philippe Lang
Fixed magic link in the note added when closing an issue by a commit from a subproject (#10284)....
r8797 :comments => l(:text_time_logged_by_changeset, :value => text_tag(issue.project),
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252 :locale => Setting.default_language)
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 )
time_entry.activity = log_time_activity unless log_time_activity.nil?
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 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
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 def log_time_activity
if Setting.commit_logtime_activity_id.to_i > 0
TimeEntryActivity.find_by_id(Setting.commit_logtime_activity_id.to_i)
end
Jean-Philippe Lang
Allow commits to reference issues of parent projects and subprojects (#4674)....
r3243 end
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252
Jean-Philippe Lang
Do not repeat one-line commit logs on the activity view....
r2344 def split_comments
comments =~ /\A(.+?)\r?\n(.*)$/m
@short_comments = $1 || comments
@long_comments = $2.to_s.strip
return @short_comments, @long_comments
end
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842 public
# Strips and reencodes a commit log before insertion into the database
def self.normalize_comments(str, encoding)
Changeset.to_utf8(str.to_s.strip, encoding)
end
def self.to_utf8(str, encoding)
Toshi MARUYAMA
move Changeset#to_utf8 logic to lib/redmine/codeset_util.rb for common use (#3261)...
r7690 Redmine::CodesetUtil.to_utf8(str, encoding)
Jean-Philippe Lang
Adds support for commit logs reencoding to UTF-8 before insertion in the database (#834, #917, #1663)....
r1766 end
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 end