2

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

现在新员工更经常忘记在签到之前将文件添加到专有应用程序中,这变得越来越严重......

我们想要一个确认对话框(提醒),询问开发人员是否已将 xml 文件添加到应用程序中。如果是,则签入,否则保持签出...

请提出这样的事情是否可能,任何相关的代码或链接将不胜感激。

4

3 回答 3

2

在自定义签入策略中提升 UI 是不合适的 - 签入策略的生命周期非常短,它们会被频繁评估,不一定在 UI 上下文或 UI 线程中。

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

门控签入可能是解决此问题的最佳方案:如果这些 XML 文件不存在,构建是否会失败 - 或者如果这些文件丢失,单元测试是否会失败?如果是这样,这是门控签到的完美候选,这将阻止这些签到的发生。

于 2011-05-26T17:21:10.577 回答
2

我将创建一个自定义构建模板来检查这些 xml 文件。让它成为一个门控登记,你有你的解决方案。

于 2011-05-26T17:42:59.723 回答
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 时触发您自己对项目的评估。

或者您可以在每个签入周期触发一次确认。全取决于你。你甚至可以做一个“点击关闭”并Messagebox完全跳过。只需设置_userConfirmed=true并触发该PolicyStateChanged事件。

于 2014-01-31T17:09:35.243 回答