2011-05-26 96 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