diff -pur a/app/models/changeset.rb b/app/models/changeset.rb --- a/app/models/changeset.rb 2013-11-06 08:41:46.000000000 +0100 +++ b/app/models/changeset.rb 2013-11-26 19:45:20.000000000 +0100 @@ -111,6 +111,13 @@ class Changeset < ActiveRecord::Base (\d+([\.,]\d+)?)h? ) /x + DONERATIO_RE = / + ( + (100) + | + (\d?0) + ) + /x def scan_comment_for_issue_ids return if comments.blank? @@ -124,14 +131,15 @@ class Changeset < ActiveRecord::Base referenced_issues = [] - comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match| + comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?(\s+#{DONERATIO_RE}%)?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?(\s+#{DONERATIO_RE}%)?)*)(?=[[:punct:]]|\s|<|$)/i) do |match| action, refs = match[2], match[3] next unless action.present? || ref_keywords_any - refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m| - issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2] + refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?(\s+#{DONERATIO_RE}%)?/).each do |m| + issue, hours, ratio = find_referenced_issue_by_id(m[0].to_i), m[2], m[17] if issue referenced_issues << issue + done_ratio(issue, ratio) if ratio && Setting.commit_doneratio_enabled? && !fix_keywords.include?(action.to_s.downcase) fix_issue(issue) if fix_keywords.include?(action.to_s.downcase) log_time(issue, hours) if hours && Setting.commit_logtime_enabled? end @@ -258,6 +266,22 @@ class Changeset < ActiveRecord::Base end end + def done_ratio(issue, ratio) + status = IssueStatus.find_by_id(Setting.commit_doneratio_inprogress_id.to_i) + if status.nil? + logger.warn("No status matches commit_doneratio_inprogress_id setting (#{Setting.commit_doneratio_inprogress_id})") if logger + end + + issue.reload + journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag(issue.project))) + issue.done_ratio = ratio.to_i + issue.status = status if status + unless issue.save + logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger + end + issue + end + def split_comments comments =~ /\A(.+?)\r?\n(.*)$/m @short_comments = $1 || comments diff -pur a/app/views/settings/_repositories.html.erb b/app/views/settings/_repositories.html.erb --- a/app/views/settings/_repositories.html.erb 2013-11-06 08:41:28.000000000 +0100 +++ b/app/views/settings/_repositories.html.erb 2013-11-26 19:22:21.000000000 +0100 @@ -80,6 +80,15 @@

<%= setting_check_box :commit_cross_project_ref %>

+

<%= setting_check_box :commit_doneratio_enabled, + :onclick => + "if (this.checked) { $('#settings_commit_doneratio_inprogess_id').removeAttr('disabled'); } else { $('#settings_commit_doneratio_inprogress_id').attr('disabled', true); }"%>

+ +

<%= setting_select :commit_doneratio_inprogress_id, + [[l(:label_default), 2]] + + IssueStatus.sorted.all.collect{|status| [status.name, status.id.to_s]}, + :disabled => !Setting.commit_doneratio_enabled?%>

+

<%= setting_check_box :commit_logtime_enabled, :onclick => "if (this.checked) { $('#settings_commit_logtime_activity_id').removeAttr('disabled'); } else { $('#settings_commit_logtime_activity_id').attr('disabled', true); }"%>

diff -pur a/config/locales/de.yml b/config/locales/de.yml --- a/config/locales/de.yml 2013-11-06 08:39:03.000000000 +0100 +++ b/config/locales/de.yml 2013-11-26 19:04:27.000000000 +0100 @@ -949,6 +949,8 @@ de: setting_bcc_recipients: E-Mails als Blindkopie (BCC) senden setting_cache_formatted_text: Formatierten Text im Cache speichern setting_commit_cross_project_ref: Erlauben auf Tickets aller anderen Projekte zu referenzieren + setting_commit_doneratio_enabled: Aktiviere Fertigstellung + setting_commit_doneratio_inprogress_id: Bearbeitungsstatus für erledigt setting_commit_fix_keywords: Schlüsselwörter (Status) setting_commit_logtime_activity_id: Aktivität für die Zeiterfassung setting_commit_logtime_enabled: Aktiviere Zeitlogging diff -pur a/config/locales/en-GB.yml b/config/locales/en-GB.yml --- a/config/locales/en-GB.yml 2013-11-06 08:38:58.000000000 +0100 +++ b/config/locales/en-GB.yml 2013-11-26 19:02:02.000000000 +0100 @@ -366,6 +366,8 @@ en-GB: setting_rest_api_enabled: Enable REST web service setting_cache_formatted_text: Cache formatted text setting_default_notification_option: Default notification option + setting_commit_doneratio_enabled: Enable done ratio logging + setting_commit_doneratio_inprogress_id: Progressing status for done ratio setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_activity_id: Activity for logged time setting_gantt_items_limit: Maximum number of items displayed on the gantt chart diff -pur a/config/locales/en.yml b/config/locales/en.yml --- a/config/locales/en.yml 2013-11-06 08:38:56.000000000 +0100 +++ b/config/locales/en.yml 2013-11-26 19:01:50.000000000 +0100 @@ -387,6 +387,8 @@ en: setting_rest_api_enabled: Enable REST web service setting_cache_formatted_text: Cache formatted text setting_default_notification_option: Default notification option + setting_commit_doneratio_enabled: Enable done ratio logging + setting_commit_doneratio_inprogress_id: Progressing status for done ratio setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_activity_id: Activity for logged time setting_gantt_items_limit: Maximum number of items displayed on the gantt chart diff -pur a/config/settings.yml b/config/settings.yml --- a/config/settings.yml 2013-11-06 08:39:03.000000000 +0100 +++ b/config/settings.yml 2013-11-26 19:14:48.000000000 +0100 @@ -113,6 +113,11 @@ commit_fix_status_id: default: 0 commit_fix_done_ratio: default: 100 +commit_doneratio_enabled: + default: 0 +commit_doneratio_inprogress_id: + format: int + default: 2 commit_logtime_enabled: default: 0 commit_logtime_activity_id: