##// END OF EJS Templates
scm: git: performance improvements in fetching revisions (#8857, #9472)...
scm: git: performance improvements in fetching revisions (#8857, #9472) Parse a revision for a given branch, just if we haven't parsed it for any branches before. Moved the db check to for existing revisions into a grouped search. Search for many revisions at once: this reduces db load. Revisions are grouped into sets of 100. This is to improve memory consumption. There will be just one query instead of each 100. The above two methods significantly increase parsing speed. Test case was a git repo with 6000+ commits on a master branch, and several other branches originating for master. Speed improved from 1.4h to 18min. Contributed by Gergely Fábián. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9144 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r8797:77287d1f0bd1
r9024:999a4ba30d7b
Show More
changeset.rb
275 lines | 9.3 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 # Redmine - project management software
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672 # Copyright (C) 2006-2011 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.
Jean-Philippe Lang
Adds support for commit logs reencoding to UTF-8 before insertion in the database (#834, #917, #1663)....
r1766 require 'iconv'
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 class Changeset < ActiveRecord::Base
belongs_to :repository
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 belongs_to :user
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 has_many :changes, :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
Toshi MARUYAMA
Changing revision label and identifier at SCM adapter level (#3724, #6092)...
r4493 acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.format_identifier}" + (o.short_comments.blank? ? '' : (': ' + o.short_comments))},
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
Ability to search all projects or the projects the user belongs to (#791)....
r1420 :include => {:repository => :project},
Jean-Philippe Lang
Search engines now supports pagination....
r755 :project_key => "#{Repository.table_name}.project_id",
: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
Fixed: links to changesets in activity and atom feeds uses project id instead project identifier (#3137)....
r2571 :find_options => {:include => [: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
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Allow commits to reference issues of parent projects and subprojects (#4674)....
r3243 named_scope :visible, lambda {|*args| { :include => {:repository => :project},
Jean-Philippe Lang
Makes visible scopes accept projects option and deprecate Project.visible_by....
r5204 :conditions => Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args) } }
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
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842 self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding)
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5252 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
Commit message parser:...
r848 fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip)
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|
action, refs = match[2], match[3]
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]
if issue
referenced_issues << issue
fix_issue(issue) if fix_keywords.include?(action.to_s.downcase)
log_time(issue, hours) if hours && Setting.commit_logtime_enabled?
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)
tag = if scmid?
Jean-Philippe Lang
Fixes Changeset#text_tag for numeric scmid (#6681)....
r4376 "commit:#{scmid}"
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 else
Jean-Philippe Lang
Fixes Changeset#text_tag for numeric scmid (#6681)....
r4376 "r#{revision}"
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 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
tag = "#{project.identifier}:#{tag}"
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
* Added links to previous and next revisions on revision view (patch by Cyril Mougel slightly edited)...
r925 # Returns the previous changeset
def previous
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5254 @previous ||= Changeset.find(:first,
:conditions => ['id < ? AND repository_id = ?',
self.id, self.repository_id],
:order => 'id DESC')
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
Toshi MARUYAMA
scm: code clean up app/models/changeset.rb....
r5254 @next ||= Changeset.find(:first,
:conditions => ['id > ? AND repository_id = ?',
self.id, self.repository_id],
:order => 'id ASC')
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?
issue = Issue.find_by_id(id.to_i, :include => :project)
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
Automatic spent time logging from commit messages (#4155)....
r4356 def fix_issue(issue)
status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i)
if status.nil?
Toshi MARUYAMA
fix typo of fix_issue() at Changeset model...
r7451 logger.warn("No status matches commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 return issue
end
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
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
return if issue.status && issue.status.is_closed?
Toshi MARUYAMA
remove trailing white-spaces from changeset model source....
r5672
Jean-Philippe Lang
Fixed magic link in the note added when closing an issue by a commit from a subproject (#10284)....
r8797 journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag(issue.project)))
Jean-Philippe Lang
Automatic spent time logging from commit messages (#4155)....
r4356 issue.status = status
unless Setting.commit_fix_done_ratio.blank?
issue.done_ratio = Setting.commit_fix_done_ratio.to_i
end
Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update,
{ :changeset => self, :issue => issue })
unless issue.save
logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger
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