#-- # Copyright (c) 2007 Mathew Abonyi # Please read LICENSE document for more information. #++ # This extension to the Changeset model translates SCM ticket # updates into actual changes on each referenced ticket. module Retrospectiva::Extension::ScmTicketUpdate::ChangesetExtension def self.included(base) base.class_eval do include InstanceMethods after_create :update_tickets_from_references end end module InstanceMethods def update_tickets_from_references User.current = User.find_by_active_and_scm_name(true, self.author) || User.find_by_active_and_login(true, self.author) || User.public_user Retrospectiva::Extension::ScmTicketUpdate::Parser.parse_log(self.revision, self.log) do |reference| logger.info "\n\n[SCM Ticket Update] ------------------------------" logger.info "Detected reference: #{reference.inspect}" begin ticket = Ticket.find :first, :include => [:milestone, { :project => [{:groups => :users}, {:ticket_property_types => :ticket_properties}] }], :conditions => ['tickets.id = ? AND projects.closed = ?', reference[:id], false] if ticket && User.current.has_permission?(ticket.project, :create_and_work_on_tickets) logger.debug "Updating ticket: #{ticket.id}" ticket.monitor_attribute_changes! ticket.update_from_reference(reference.merge(:user_id => User.current.id)) ticket.ticket_changes.build(:content => reference[:content], :user_id => User.current.id) ticket.save! logger.info "Updated ticket: #{ticket.id}" end rescue ActiveRecord::ActiveRecordError => e logger.error "Could not integrate reference to ##{reference[:id]}" logger.error "Exception!\n#{e.inspect}\n" + e.backtrace.join("\n") end end end end end Changeset.class_eval { include Retrospectiva::Extension::ScmTicketUpdate::ChangesetExtension }