在TFS2013中的签入策略后创建自定义代码审查通知

时间:2015-12-21 19:52:55

标签: visual-studio tfs2013 checkin-policy

我知道我们可以在TFS 2013中创建自定义签到策略,该策略将限制用户签入代码而无需代码审查。

我的公司要求开发人员在我必须开发某些特定文件(数据库更新)被检查到TFS的东西,然后将电子邮件通知发送给一组高级开发人员进行代码审查。此外,电子邮件通知应告知何时执行了最后一次代码审查以及由谁执行。

关于如何解决这个问题的任何想法。在过去,我已经创建了一个策略来检查签入前的文件有效性,我已经使用PolicyBase和Evaluate方法这样做,我很困惑哪个类/方法可以陷阱,一旦签入成功就把我的代码。

除了为文件有效性编写的代码之外,我没有代码。在办理登机手续的政策后,我找不到任何有用的帖子。或者,这可以在服务器本身上配置?

1 个答案:

答案 0 :(得分:0)

您可以创建一个侦听器来侦听CheckInEvent,而不是Checkin策略。触发事件后,发送通知。那些服务器端插件正在实现ISubscriber interface,请参阅this blog发布如何编写和调试它们。

以下是来自this blog的代码,其中显示了响应签到事件的代码示例实现,您可以参考它:

namespace Sample.SourceControl.Server.PlugIns
{
    public class CodeCheckInEventHandler : ISubscriber
    {
        public string Name
        {
            get { return "CodeCheckInEventHandler"; }
        }

        public SubscriberPriority Priority
        {
            get { return SubscriberPriority.Normal; }
        }

        public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out Microsoft.TeamFoundation.Common.ExceptionPropertyCollection properties)
        {
            statusCode = 0;
            properties = null;
            statusMessage = String.Empty;
            try
            {
                if (notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent)
                {
                    CheckinNotification ev = notificationEventArgs as CheckinNotification;
                    TeamFoundationApplication.Log(string.Format("New Changeset was checked in by {0}. ID: {1}, comments: {2}", ev.ChangesetOwnerName, ev.Changeset, ev.Comment), 123, System.Diagnostics.EventLogEntryType.Information);
                }
            }
            catch (Exception ex)
            {
                TeamFoundationApplication.LogException("Sample.SourceControl.Server.PlugIns.CodeCheckInEventHandler encountered an exception", ex);
            }
            return EventNotificationStatus.ActionPermitted;
        }

        public Type[] SubscribedTypes()
        {
            return new Type[1] { typeof(CheckinNotification) };
        }
    }
}