2011-05-26 73 views
2

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

现在,新员工往往忘记在入住前将文件添加到专有应用,这是越来越严重......

我们希望还挺确认对话框(提醒),询问开发商是否已经添加了XML文件到应用程序。如果是,然后办理登机手续,否则保持签出...

请建议如果这样的事情是可能的,任何相关的代码或链接将非常感激。

回答

2

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

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

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

+0

非常感谢您的回答......恐怕它既不会崩溃的构建也不会单元测试失败,如果这些XML文件丢失... – Dexterslab 2011-05-26 18:56:41

+0

所以,我期待这是不可能做... – Dexterslab 2011-05-26 19:01:10

+0

在这种情况下,我会考虑利用这些工作项目 - 毕竟,你试图确保你的开发人员已经完成了一些工作(在这种情况下,检查XML文件) – 2011-05-26 19:03:09

2

我会创建一个自定义构建模板来检查这些xml文件。使它成为门控办理登机手续,并且您已经获得了解决方案。

+0

我会这样做,除了政策。 – jessehouwing 2014-01-31 17:29:09

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事件。

+0

我在我自己的一个政策中实现了这一点,它在这里共享:https://github.com/jessehouwing/tfstools/blob/master/JesseHouwing.CheckinPolicies/WarnMultipleBranchPolicy.cs – jessehouwing 2014-02-17 15:20:51