我們在我們的項目中有一些xml文件,每當我們將這些xml文件簽入TFS時,我們在簽入之前確保已將這些xml文件添加到專有應用程序中。自定義檢入TFS策略?
現在,新員工往往忘記在入住前將文件添加到專有應用,這是越來越嚴重......
我們希望還挺確認對話框(提醒),詢問開發商是否已經添加了XML文件到應用程序。如果是,然後辦理登機手續,否則保持簽出...
請建議如果這樣的事情是可能的,任何相關的代碼或鏈接將非常感激。
我們在我們的項目中有一些xml文件,每當我們將這些xml文件簽入TFS時,我們在簽入之前確保已將這些xml文件添加到專有應用程序中。自定義檢入TFS策略?
現在,新員工往往忘記在入住前將文件添加到專有應用,這是越來越嚴重......
我們希望還挺確認對話框(提醒),詢問開發商是否已經添加了XML文件到應用程序。如果是,然後辦理登機手續,否則保持簽出...
請建議如果這樣的事情是可能的,任何相關的代碼或鏈接將非常感激。
在自定義簽入策略中提高UI是不合適的 - 簽入策略的生命週期非常短,並且它們將經常進行評估,而不一定在UI上下文或UI線程中進行評估。
您能否以編程方式確定是否正在檢入適當的XML文件?如果是這樣,您可以創建一個自定義簽入策略,如果XML文件未被添加,則該策略將失敗。
門控簽入可能是解決此問題的最佳解決方案:如果這些XML文件不存在,那麼構建會失敗 - 或者如果這些文件丟失,單元測試會失敗嗎?如果是這樣,這是門禁登機手續的完美人選,這將阻止發生這些登機手續。
我會創建一個自定義構建模板來檢查這些xml文件。使它成爲門控辦理登機手續,並且您已經獲得瞭解決方案。
我會這樣做,除了政策。 – jessehouwing 2014-01-31 17:29:09
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
事件。
我在我自己的一個政策中實現了這一點,它在這裏共享:https://github.com/jessehouwing/tfstools/blob/master/JesseHouwing.CheckinPolicies/WarnMultipleBranchPolicy.cs – jessehouwing 2014-02-17 15:20:51
非常感謝您的回答......恐怕它既不會崩潰的構建也不會單元測試失敗,如果這些XML文件丟失... – Dexterslab 2011-05-26 18:56:41
所以,我期待這是不可能做... – Dexterslab 2011-05-26 19:01:10
在這種情況下,我會考慮利用這些工作項目 - 畢竟,你試圖確保你的開發人員已經完成了一些工作(在這種情況下,檢查XML文件) – 2011-05-26 19:03:09