blob: c36f11bc3558f2c939574db98525e028bf81c95e [file] [log] [blame]
import re
from trac.config import Option
from trac.core import *
from trac.resource import ResourceNotFound
from trac.ticket.api import IMilestoneChangeListener
from trac.ticket.model import Version
revision = "$Rev: 11490 $"
url = "$URL: http://svn.edgewall.org/repos/trac/tags/trac-1.0.1/sample-plugins/milestone_to_version.py $"
class MilestoneToVersion(Component):
"""Automatically create a version when a milestone is completed.
Sample plugin demonstrating the IMilestoneChangeListener interface.
Creates a version from a just-completed milestone based on whether the
milestone's name matches a specified pattern.
"""
implements(IMilestoneChangeListener)
pattern = Option('milestone_to_version', 'pattern',
r'(?i)(?:v(?:er)?\.?|version)?\s*(?P<version>\d.*)',
"""A regular expression to match the names of milestones that should be
made into versions when they are completed. The pattern must include
one named group called 'version' that matches the version number
itself.""")
def milestone_created(self, milestone):
pass
def milestone_changed(self, milestone, old_values):
if not milestone.is_completed or 'completed' not in old_values \
or old_values['completed'] is not None:
return
m = re.match(self.pattern, milestone.name)
if not m:
return
version_name = m.groupdict().get('version')
if not version_name:
return
try:
version = Version(self.env, version_name)
if not version.time:
version.time = milestone.completed
version.update()
self.log.info('Existing version "%s" updated with completion '
'time from milestone "%s"' %
(version.name, milestone.name))
else:
self.log.info('Version "%s" already exists. No new version '
'created from milestone "%s"' %
(version.name, milestone.name))
except ResourceNotFound:
version = Version(self.env)
version.name = version_name
version.time = milestone.completed
version.insert()
self.log.info('New version "%s" created from completed milstone '
'"%s".' % (version.name, milestone.name))
def milestone_deleted(self, milestone):
pass