我们的项目中有一些 xml 文件,每当我们将这些 xml 文件签入 TFS 时,我们在签入之前确保我们已将这些 xml 文件添加到专有应用程序中。
现在新员工更经常忘记在签到之前将文件添加到专有应用程序中,这变得越来越严重......
我们想要一个确认对话框(提醒),询问开发人员是否已将 xml 文件添加到应用程序中。如果是,则签入,否则保持签出...
请提出这样的事情是否可能,任何相关的代码或链接将不胜感激。
在自定义签入策略中提升 UI 是不合适的 - 签入策略的生命周期非常短,它们会被频繁评估,不一定在 UI 上下文或 UI 线程中。
您能否以编程方式确定是否正在签入适当的 XML 文件?如果是这样,您可以创建一个自定义签入策略,如果 XML 文件没有等待添加,则该策略会失败。
门控签入可能是解决此问题的最佳方案:如果这些 XML 文件不存在,构建是否会失败 - 或者如果这些文件丢失,单元测试是否会失败?如果是这样,这是门控签到的完美候选,这将阻止这些签到的发生。
我将创建一个自定义构建模板来检查这些 xml 文件。让它成为一个门控登记,你有你的解决方案。
该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
事件。