##// 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:

r9017:fef2e4b67252
r9024:999a4ba30d7b
Show More
version.rb
271 lines | 8.1 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Do not raise an error when destroying a Version with assigned issues....
r3554 # Redmine - project management software
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761 # Copyright (C) 2006-2011 Jean-Philippe Lang
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 #
# 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 app/models/version.rb....
r6761 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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 app/models/version.rb....
r6761 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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 Version < ActiveRecord::Base
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a version (#10390)....
r9017 include Redmine::SafeAttributes
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 after_update :update_issues_from_sharing_change
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 belongs_to :project
Jean-Philippe Lang
Do not raise an error when destroying a Version with assigned issues....
r3554 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify
Jean-Philippe Lang
Adds custom fields for versions (#4219)....
r2950 acts_as_customizable
Jean-Philippe Lang
AttachmentsController now handles attachments deletion....
r2114 acts_as_attachable :view_permission => :view_files,
:delete_permission => :manage_files
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 VERSION_STATUSES = %w(open locked closed)
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 VERSION_SHARINGS = %w(none descendants hierarchy tree system)
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 validates_presence_of :name
validates_uniqueness_of :name, :scope => [:project_id]
Jean-Philippe Lang
Allow longer version names (#711, closes #712)....
r1206 validates_length_of :name, :maximum => 60
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 validates_inclusion_of :status, :in => VERSION_STATUSES
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 validates_inclusion_of :sharing, :in => VERSION_SHARINGS
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906
Jean-Philippe Lang
Fixed: Setting issue attributes from mail should be case-insensitive (#8759)....
r6079 named_scope :named, lambda {|arg| { :conditions => ["LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip]}}
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 named_scope :open, :conditions => {:status => 'open'}
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 named_scope :visible, lambda {|*args| { :include => :project,
:conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } }
Jean-Philippe Lang
Prevent mass-assignment when adding/updating a version (#10390)....
r9017
safe_attributes 'name',
'description',
'effective_date',
'due_date',
'wiki_page_title',
'status',
'sharing',
'custom_field_values'
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009
# Returns true if +user+ or current user is allowed to view the version
def visible?(user=User.current)
user.allowed_to?(:view_issues, self.project)
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Fixed: version files in Files module cannot be downloaded if issue tracking is disabled (#9055)....
r7864 # Version files have same visibility as project files
def attachments_visible?(*args)
project.present? && project.attachments_visible?(*args)
end
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 def start_date
Jean-Philippe Lang
Makes Version#start_date return the minimum start_date of its issues....
r4460 @start_date ||= fixed_issues.minimum('start_date')
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 def due_date
effective_date
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Makes Version REST API accept due_date attribute (#10013)....
r8566 def due_date=(arg)
self.effective_date=(arg)
end
Jean-Philippe Lang
Version details view changes:...
r1193 # Returns the total estimated time for this version
Jean-Philippe Lang
Fixes calculation of version estimated hours with subtasks (#5265)....
r3519 # (sum of leaves estimated_hours)
Jean-Philippe Lang
Version details view changes:...
r1193 def estimated_hours
Jean-Philippe Lang
Fixes calculation of version estimated hours with subtasks (#5265)....
r3519 @estimated_hours ||= fixed_issues.leaves.sum(:estimated_hours).to_f
Jean-Philippe Lang
Version details view changes:...
r1193 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Version details view changes:...
r1193 # Returns the total reported time for this version
def spent_hours
Jean-Philippe Lang
Use :joins instead of :include....
r8862 @spent_hours ||= TimeEntry.sum(:hours, :joins => :issue, :conditions => ["#{Issue.table_name}.fixed_version_id = ?", id]).to_f
Jean-Philippe Lang
Version details view changes:...
r1193 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Adds version status to limit issue assignments (#1245)....
r2906 def closed?
status == 'closed'
end
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009
def open?
status == 'open'
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 # Returns true if the version is completed: due date reached and no open issues
Jean-Philippe Lang
Added an option to see all versions in the roadmap view (including completed ones)....
r513 def completed?
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
end
Eric Davis
Rewrite the Gantt chart. #6276...
r3958
def behind_schedule?
if completed_pourcent == 100
return false
Jean-Philippe Lang
Makes Version#start_date return the minimum start_date of its issues....
r4460 elsif due_date && start_date
Eric Davis
Rewrite the Gantt chart. #6276...
r3958 done_date = start_date + ((due_date - start_date+1)* completed_pourcent/100).floor
return done_date <= Date.today
else
false # No issues so it's not late
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the completion percentage of this version based on the amount of open/closed issues
# and the time spent on the open issues.
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 def completed_pourcent
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 if issues_count == 0
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 0
elsif open_issues_count == 0
100
else
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 issues_progress(false) + issues_progress(true)
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the percentage of issues that have been marked as 'closed'.
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 def closed_pourcent
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 if issues_count == 0
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 0
else
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 issues_progress(false)
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 # Returns true if the version is overdue: due date reached and some open issues
def overdue?
effective_date && (effective_date < Date.today) && (open_issues_count > 0)
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 # Returns assigned issues count
def issues_count
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 load_issue_counts
@issue_count
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the total amount of open issues for this version.
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 def open_issues_count
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 load_issue_counts
@open_issues_count
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 end
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the total amount of closed issues for this version.
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 def closed_issues_count
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 load_issue_counts
@closed_issues_count
Jean-Philippe Lang
Added an option to see all versions in the roadmap view (including completed ones)....
r513 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
A wiki page can now be attached to each version....
r561 def wiki_page
if project.wiki && !wiki_page_title.blank?
@wiki_page ||= project.wiki.find_page(wiki_page_title)
end
@wiki_page
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Added custom fields in issue related mail notifications....
r811 def to_s; name end
Eric Davis
Add project names to the Versions in the Gantt export. #5904...
r3959
def to_s_with_project
"#{project} - #{name}"
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Include the Project name when sorting versions....
r3647 # Versions are sorted by effective_date and "Project Name - Version name"
# Those with no effective_date are at the end, sorted by "Project Name - Version name"
Jean-Philippe Lang
Versions can now be created with no date....
r533 def <=>(version)
if self.effective_date
Eric Davis
Include the Project name when sorting versions....
r3647 if version.effective_date
if self.effective_date == version.effective_date
"#{self.project.name} - #{self.name}" <=> "#{version.project.name} - #{version.name}"
else
self.effective_date <=> version.effective_date
end
else
-1
end
Jean-Philippe Lang
Versions can now be created with no date....
r533 else
Eric Davis
Include the Project name when sorting versions....
r3647 if version.effective_date
1
else
"#{self.project.name} - #{self.name}" <=> "#{version.project.name} - #{version.name}"
end
Jean-Philippe Lang
Versions can now be created with no date....
r533 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 # Returns the sharings that +user+ can set the version to
def allowed_sharings(user = User.current)
VERSION_SHARINGS.select do |s|
if sharing == s
true
else
case s
when 'system'
# Only admin users can set a systemwide sharing
user.admin?
when 'hierarchy', 'tree'
# Only users allowed to manage versions of the root project can
# set sharing to hierarchy or tree
project.nil? || user.allowed_to?(:manage_versions, project.root)
else
true
end
end
end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Do not raise an error when destroying a Version with assigned issues....
r3554 private
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009
Jean-Philippe Lang
Use a single query to retrieve issues_count, open_issues_count and closed_issues_count....
r8936 def load_issue_counts
unless @issue_count
@open_issues_count = 0
@closed_issues_count = 0
fixed_issues.count(:all, :group => :status).each do |status, count|
if status.is_closed?
@closed_issues_count += count
else
@open_issues_count += count
end
end
@issue_count = @open_issues_count + @closed_issues_count
end
end
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 # Update the issue's fixed versions. Used if a version's sharing changes.
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 def update_issues_from_sharing_change
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 if sharing_changed?
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 if VERSION_SHARINGS.index(sharing_was).nil? ||
VERSION_SHARINGS.index(sharing).nil? ||
VERSION_SHARINGS.index(sharing_was) > VERSION_SHARINGS.index(sharing)
Jean-Philippe Lang
Optimize updates of issue's shared versions....
r3023 Issue.update_versions_from_sharing_change self
Jean-Philippe Lang
Optimize issue updates when a version sharing changes....
r3021 end
Jean-Philippe Lang
Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666)....
r3009 end
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 # Returns the average estimated time of assigned issues
# or 1 if no issue has an estimated time
# Used to weigth unestimated issues in progress calculation
def estimated_average
if @estimated_average.nil?
average = fixed_issues.average(:estimated_hours).to_f
if average == 0
average = 1
end
@estimated_average = average
end
@estimated_average
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Eric Davis
Added some RDoc documentation for some models....
r2536 # Returns the total progress of open or closed issues. The returned percentage takes into account
# the amount of estimated time set for this version.
#
# Examples:
# issues_progress(true) => returns the progress percentage for open issues.
# issues_progress(false) => returns the progress percentage for closed issues.
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 def issues_progress(open)
@issues_progress ||= {}
@issues_progress[open] ||= begin
progress = 0
if issues_count > 0
ratio = open ? 'done_ratio' : 100
Toshi MARUYAMA
remove trailing white-spaces from app/models/version.rb....
r6761
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 done = fixed_issues.sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}",
Jean-Philippe Lang
Fixed Version#issues_progress for Rails 3.1....
r8866 :joins => :status,
:conditions => ["#{IssueStatus.table_name}.is_closed = ?", !open]).to_f
Jean-Philippe Lang
Use estimated hours to weight issues in version completion calculation (#2182)....
r2347 progress = done / (estimated_average * issues_count)
end
progress
end
end
Jean-Philippe Lang
Initial commit...
r2 end