#-- # Copyright (c) 2007 Mathew Abonyi # Please read LICENSE document for more information. #++ # This extension to the Ticket model translates SVN ticket # references into actual updates to the ticket. module Retrospectiva::Extension::ScmTicketUpdate::TicketExtension def self.included(base) base.send(:include, InstanceMethods) end module InstanceMethods def update_from_reference(ticket_reference) update_attributes_from_reference(ticket_reference) update_properties_from_reference(ticket_reference) end private def update_attributes_from_reference(ticket_reference) ticket_reference.each do |property, value| case property when :assigned, :assigned_user self.assigned_user_login = value when :milestone set_if_found property, self.project.milestones_at(self.created_at).detect { |m| m.name.downcase == value.downcase } when :status, :priority set_if_found property, property.to_s.camelize.constantize.find(:first, :conditions => ['LOWER(name) = ?', value.downcase]) end end end def update_properties_from_reference(ticket_reference) prop_ids = self.property_ids.dup self.project.ticket_property_types.each do |type| if name = ticket_reference[type.class_name.downcase.to_sym] # Remove all properties of this type prop_ids -= type.ticket_properties.map { |prop| prop.id } prop_obj = type.ticket_properties.detect { |prop| prop.name.downcase == name.downcase } prop_ids << prop_obj.id if prop_obj end end self.property_ids = prop_ids end def set_if_found(attribute, value = nil) self.send("#{attribute}=", value) if value && self.respond_to?(attribute) end end end Ticket.class_eval { include Retrospectiva::Extension::ScmTicketUpdate::TicketExtension }