TFS中的自定义签入策略?

时间:2011-05-26 15:09:19

标签: tfs tfs2010 tfs2008 tfs-sdk

我们的项目中有一些xml文件,每当我们将这些xml文件签入TFS时,我们都会在签入之前确保已将这些xml文件添加到专有应用程序中。

现在新员工更常忘记在办理登机手续之前将文件添加到专有应用程序中,这种情况越来越严重......

我们想要一些确认对话框(提醒),询问开发人员是否已将xml文件添加到应用程序中。如果是,那么办理登机手续,否则保持结账......

请建议是否可以这样做,并且我们非常感谢任何相关的代码或链接。

3 个答案:

答案 0 :(得分:2)

在自定义签到策略中引发UI是不合适的 - 签入策略的生命周期非常短,并且它们将经常评估,而不一定在UI上下文或UI线程中。

您能否以编程方式确定是否正在检入相应的XML文件?如果是这样,您可以创建一个自定义签入策略,如果XML文件没有被添加,则该策略将失败。

Gated Check-in可能是解决此问题的最佳方法:如果这些XML文件不存在,构建是否会失败 - 或者如果缺少这些文件,单元测试是否会失败?如果是这样,这是门禁登记的完美候选人,这将阻止这些签到。

答案 1 :(得分:2)

我会创建一个自定义构建模板来检查这些xml文件。把它作为门禁办理登机手续,你就得到了解决方案。

答案 2 :(得分:1)

Evaluate方法应该很快并且不应该显示UI,但是当用户与名为Activate的策略交互时,策略上会发生一个事件,这是一个很好的时刻显示UI并与策略通信。你可以这样做:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JesseHouwing.CheckinPolicies
{
    using System.Windows.Forms;

    using Microsoft.TeamFoundation.Client.Reporting;
    using Microsoft.TeamFoundation.VersionControl.Client;

    [Serializable]
    public class ConfirmPolicy :PolicyBase
    {
        private AffectedTeamProjectsEventHandler _affectedTeamProjectsEventHandler;
        private EventHandler _checkedPendingChangesEventHandler;

        public ConfirmPolicy()
        {
        }

        public void StatusChanged()
        {
            _userconfirmed = false;
            OnPolicyStateChanged(Evaluate());
        }

        public override void Initialize(IPendingCheckin pendingCheckin)
        {
            _affectedTeamProjectsEventHandler = (sender, e) => StatusChanged();
            _checkedPendingChangesEventHandler = (sender, e) => StatusChanged();

            base.Initialize(pendingCheckin);
            _userconfirmed = false;                
            pendingCheckin.PendingChanges.AffectedTeamProjectsChanged += _affectedTeamProjectsEventHandler;
            pendingCheckin.PendingChanges.CheckedPendingChangesChanged += _checkedPendingChangesEventHandler;
        }

        protected override void OnPolicyStateChanged(PolicyFailure[] failures)
        {
            _userconfirmed = false;
            base.OnPolicyStateChanged(Evaluate());
        }

        public override void Activate(PolicyFailure failure)
        {
            if (MessageBox.Show("Confirm the policy?", "Policy Check", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                _userconfirmed = true;
                base.OnPolicyStateChanged(Evaluate());
            }
        }

        public override PolicyFailure[] Evaluate()
        {
            if (_userconfirmed == true)
            {
                return new PolicyFailure[0];
            }
            else
            {
                return new PolicyFailure[]{new PolicyFailure("User must confirm", this)};
            }
        }

        public override string Description
        {
            get { throw new NotImplementedException(); }
        }

        public override bool Edit(IPolicyEditArgs policyEditArgs)
        {
            return true;
        }

        public override string Type
        {
            get
            {
                return "User Confirm";
            }
        }

        public override string TypeDescription
        {
            get
            {
                return "User Confirm";
            }
        }

        public override void Dispose()
        {
            this.PendingCheckin.PendingChanges.AffectedTeamProjectsChanged -= _affectedTeamProjectsEventHandler;
            this.PendingCheckin.PendingChanges.CheckedPendingChangesChanged -= _checkedPendingChangesEventHandler;

            base.Dispose();
        }
    }
}

我还没有测试过这个确切的代码,可能需要一些调整,但这是一般的事情。现在它触发了正在检入的文件的更改,但您也可以订阅任何其他事件(工作项更改)或每次调用Evaluate时触发您自己的项目评估。

或者您可以在每个签到周期触发一次确认。全取决于你。您甚至可以执行“Click to Dismiss”并完全跳过Messagebox。只需设置_userConfirmed=true并触发PolicyStateChanged事件。